385 Stimmen

Wie kann ich in Git einen Zweig mit einem anderen Zweig "überschreiben", anstatt ihn "zusammenzuführen"?

Ich habe zwei Zweige, email y staging . staging ist die neueste und ich brauche die alten Änderungen nicht mehr in email Zweig, aber ich möchte sie nicht löschen.

Ich möchte also einfach den gesamten Inhalt von staging in email so dass sie beide auf dieselbe Übergabe verweisen. Ist das möglich?

59voto

B.Neo Punkte 391

WARNUNG: Dies löscht alle Commits auf dem E-Mail-Zweig. Es ist, als würde man den E-Mail-Zweig löschen und ihn am Kopf des Staging-Zweigs neu erstellen.

Das ist der einfachste Weg:

//the branch you want to overwrite
git checkout email 

//reset to the new branch
git reset --hard origin/staging

// push to remote
git push -f

Jetzt sind der E-Mail-Zweig und der Staging-Zweig identisch.

21voto

Madhu Punkte 2215

Ich wollte zwei Zweige zusammenführen, so dass der gesamte Inhalt in old_branch mit den Inhalten aus new_branch

Bei mir hat das wunderbar funktioniert:

$ git checkout new_branch
$ git merge -m 'merge message' -s ours origin/old_branch
$ git checkout old_branch
$ git merge new_branch
$ git push origin old_branch

12voto

Andere Antworten sahen unvollständig aus.
Ich habe es unten vollständig versucht, und es hat gut funktioniert.

HINWEIS:
1. Legen Sie eine Kopie Ihres Repositorys an, bevor Sie den folgenden Versuch unternehmen, um auf Nummer sicher zu gehen.

Einzelheiten:
1. Die gesamte Entwicklung erfolgt im dev-Zweig
2. Der Qa-Zweig ist nur eine Kopie von Dev.
3. Von Zeit zu Zeit muss der Entwicklungscode in den QA-Zweig verschoben/überschrieben werden.

Wir müssen also den Qa-Zweig vom Dev-Zweig überschreiben.

Teil 1:
Mit den nachstehenden Befehlen wurde die alte QA auf die neuere Dev aktualisiert:

git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push

Automatischer Kommentar für letzten Push gibt unten:

// Output:
//  *<MYNAME> Merge branch 'qa' into dev,*  

Dieser Kommentar sieht umgekehrt aus, weil die obige Sequenz auch umgekehrt aussieht

Teil 2:

Nachfolgend sind unerwartete, neue lokale Commits in dev, die unnötig sind
so müssen wir wegwerfen, und machen dev unberührt.

git checkout dev

// Output:
//  Switched to branch 'dev'  
//  Your branch is ahead of 'origin/dev' by 15 commits.  
//  (use "git push" to publish your local commits)

git reset --hard origin/dev  

//  Now we threw away the unexpected commits

Teil 3:
Überprüfen Sie, ob alles wie erwartet funktioniert:

git status  

// Output:
//  *On branch dev  
//  Your branch is up-to-date with 'origin/dev'.  
//  nothing to commit, working tree clean*  

Das ist alles.
1. die alte QA wird nun durch den neuen Code der Entwicklungsabteilung überschrieben
2. das lokale System ist sauber (der entfernte Ursprung/das entfernte Gerät wird nicht berührt)

10voto

Arek S Punkte 3583

Wie wäre es damit:

git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease

7voto

lenz Punkte 1676

Was Sie wollen, ist Folgendes (eigentlich die genaue Umkehrung der derzeit akzeptierten Antwort):

git checkout email
git merge --strategy-option=theirs staging  

Das bedeutet Folgendes:

  • email Zweigdateien werden nun genau dasselbe wie staging Zweigstelle
  • email die Geschichte der Branche wird beibehalten
  • staging Die Geschichte des Zweigs wird hinzugefügt zu email Geschichte

Als zusätzlichen Nutzen können Sie, wenn Sie nicht alle staging Geschichte des Zweigs, können Sie mit squash um sie in einer einzigen Commit-Nachricht zusammenzufassen.

git checkout email
git merge --squash --strategy-option=theirs staging  
git commit -m "Single commit message for squash branch's history here'

Zusammenfassend lässt sich also sagen, dass diese zweite Version Folgendes bewirkt:

  • email Zweigdateien werden nun genau dasselbe wie staging Zweigstelle
  • email die Geschichte der Branche wird beibehalten
  • Eine einzelne Übergabe wird zusätzlich zu den email die Geschichte der Branche. Dieser Commit repräsentiert ALLE Änderungen, die in dem Zweig staging Zweigstelle

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X