Setzen Sie den anderen Zweig ohne Kasse auf den aktuellen Stand zurück

110

Ich schreibe einige Skripte für meinen Git-Workflow.

Ich muss einen anderen (vorhandenen) Zweig ohne Auschecken auf den aktuellen zurücksetzen.

Vor:

 CurrentBranch: commit A
 OtherBranch: commit B

Nach dem:

 CurrentBranch: commit A
 OtherBranch: commit A

Äquivalent von

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(Hinweis --soft: Ich möchte den Arbeitsbaum nicht beeinflussen.)

Ist das möglich?

Alexander Gladysh
quelle
Weiß jemand, ob dies auch in Egit möglich ist?
Zedoo

Antworten:

84

Die von Ihnen beschriebenen Workflows sind nicht gleichwertig: Wenn Sie sie ausführen reset --hard, verlieren Sie alle Änderungen im Arbeitsbaum (möglicherweise möchten Sie sie vornehmen reset --soft).

Was Sie brauchen ist

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch
P Shved
quelle
3
Mann, ich wünschte, dies würde ohne das Überflüssige refs/heads/
funktionieren
41
Ein viel schönerer Weg, dies zu tun, ist git push . current:other. Dies funktioniert ohne refs/heads(/ cc @elliottcable) und verhindert auch, dass Sie den ausgecheckten Zweig aktualisieren. Beachten Sie, dass Sie möglicherweise -f übergeben (oder verwenden +current:other) müssen, wenn das Update kein schneller Vorlauf ist.
Lily Ballard
4
Sie können auch ein -m 'some text'Argument verwenden, um den Grund für die git reflog OtherBranchAnzeige des Ref-Updates durch einen Befehl aufzuzeichnen, z. B. "Mit CurrentBranch synchronisiert". Kann nützlich sein, um sich daran zu erinnern, warum Sie es später getan haben.
Levi Haskell
18
Warum würden Sie verwenden git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchoder git push . CurrentBranch OtherBranchwann könnten Sie git branch -f OtherBranch CurrentBranchstattdessen den viel saubereren (IMO) verwenden? (Siehe meine Antwort auf Git Branch -f unten)
Colin D Bennett
1
@ BenHymers Die Manpage für "git push" ist also eine verdammte Lüge. Es beschreibt den Befehl als "Remote-Refs aktualisieren ...". in der Tat kann es lokale Refs gut aktualisieren.
Kaz
228

Stellen Sie otherbranchzu Punkt auf dem gleichen begehen wie currentbranchdurch Laufen

git branch -f otherbranch currentbranch

Die -fOption (force) sagt git branch ja, ich möchte wirklich jede vorhandene otherbranchReferenz mit der neuen überschreiben .

Aus der Dokumentation :

-f
--force

Zurücksetzen auf falls bereits vorhanden. Ohne -f git verzweigt sich der Zweig, einen vorhandenen Zweig zu ändern.

Colin D Bennett
quelle
6
Dies ist die einfachste Antwort. Vielen Dank!
Robert Karl
Ich bekomme, fatal: Cannot force update the current branch.wenn ich das versuche.
Fuad Saud
4
@FuadSaud das liegt daran, dass du bereits ausgecheckt hast otherbranch. Bei dieser SO-Frage geht es speziell darum , einen anderen Zweig auf ein anderes Commit zurückzusetzen (dh den ausgecheckten Zweig nicht zurückzusetzen). Sie möchten den aktuellen Zweig mit zurücksetzen, um git reset targetbranchzu erzwingen, dass auf den aktuellen Zweig gezeigt wird targetbranch. Hinzufügen, --hardum auch den Arbeitsbaum zu diesem Inhalt zu zwingen. Oder --softlassen Sie den Index in Ruhe und ändern Sie nur den Zweig selbst.
Colin D Bennett
Richtig, ich weiß über das Zurücksetzen Bescheid. Was ich suchte, war eine Möglichkeit, innerhalb einer Routine den lokalen Master immer auf den Upstream / Master zu verweisen, unabhängig davon, was ausgecheckt wurde. Ich dachte, das branch -fkönnte ich tun.
Fuad Saud
9
Imo, das sollte die akzeptierte Antwort sein. Dies hat meinen Workflow so sehr verbessert!
tödliche Gitarre
23

Mit diesem Befehl können Sie Ihre Filialen jederzeit synchronisieren

$ git push . CurrentBranch:OtherBranch -f

Auch ohne -f ersetzt es diesen Befehlssatz

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

Dies kann nützlich sein, wenn Sie nicht alle Dateien in CurrentBranch festschreiben müssen und daher nicht zu einem anderen Zweig wechseln können.

Denis Kuznetsov
quelle
Kann "remote: error: Nicht-Schnellvorlauf verweigern" verursachen
Basilevs
3
Ich würde keine -fOption einschließen, es sei denn, dies ist absolut unvermeidlich. In meinem Fall funktioniert es gut ohne.
Melebius