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?
Antworten:
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 vornehmenreset --soft
).Was Sie brauchen ist
quelle
refs/heads/
git push . current:other
. Dies funktioniert ohnerefs/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.-m 'some text'
Argument verwenden, um den Grund für diegit reflog OtherBranch
Anzeige 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.git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch
odergit push . CurrentBranch OtherBranch
wann könnten Siegit branch -f OtherBranch CurrentBranch
stattdessen den viel saubereren (IMO) verwenden? (Siehe meine Antwort auf Git Branch -f unten)Stellen Sie
otherbranch
zu Punkt auf dem gleichen begehen wiecurrentbranch
durch LaufenDie
-f
Option (force) sagtgit branch
ja, ich möchte wirklich jede vorhandeneotherbranch
Referenz mit der neuen überschreiben .Aus der Dokumentation :
quelle
fatal: Cannot force update the current branch.
wenn ich das versuche.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, umgit reset targetbranch
zu erzwingen, dass auf den aktuellen Zweig gezeigt wirdtargetbranch
. Hinzufügen,--hard
um auch den Arbeitsbaum zu diesem Inhalt zu zwingen. Oder--soft
lassen Sie den Index in Ruhe und ändern Sie nur den Zweig selbst.branch -f
könnte ich tun.Mit diesem Befehl können Sie Ihre Filialen jederzeit synchronisieren
Auch ohne -f ersetzt es diesen Befehlssatz
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.
quelle
-f
Option einschließen, es sei denn, dies ist absolut unvermeidlich. In meinem Fall funktioniert es gut ohne.