Ich habe git pull
verwendet und hatte einen Zusammenführungskonflikt:
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
Ich weiß, dass die andere Version der Datei gut und meine schlecht ist, daher sollten alle meine Änderungen verworfen werden. Wie kann ich das machen?
Da Ihr pull
nicht erfolgreich war, ist HEAD
(nicht HEAD^
) das letzte "gültige" Commit für Ihren Zweig:
git reset --hard HEAD
Das andere Teil, das Sie möchten, ist, die Änderungen Ihre Änderungen außer Kraft setzen zu lassen.
In älteren Versionen von git konnten Sie die Merge-Strategie "theirs" verwenden:
git pull --strategy=theirs remote_branch
Aber dies wurde inzwischen entfernt, wie in diese Nachricht von Junio Hamano (der Git-Betreuer) erklärt. Wie in der Link vermerkt, würden Sie dies stattdessen tun:
git fetch Origin
git reset --hard Origin
Wenn Ihre Git-Version> = 1.6.1 ist, können Sie git reset --merge
verwenden.
Wie @Michael Johnson erwähnt, können Sie auch git merge --abort
verwenden, wenn Ihre Git-Version> = 1.7.4 ist.
Stellen Sie wie immer sicher, dass Sie keine nicht festgeschriebenen Änderungen vorgenommen haben, bevor Sie eine Zusammenführung starten.
Aus der Git Merge Manpage
git merge --abort
entspricht git reset --merge
, wenn MERGE_HEAD
vorhanden ist.
MERGE_HEAD
ist vorhanden, wenn eine Zusammenführung ausgeführt wird.
Auch in Bezug auf nicht festgeschriebene Änderungen beim Starten einer Zusammenführung:
Wenn Sie Änderungen haben, die Sie nicht festschreiben möchten, bevor Sie eine Zusammenführung starten, git stash
und git stash pop
, nachdem Sie die Zusammenführung abgeschlossen oder abgebrochen haben.
git merge --abort
Brechen Sie den aktuellen Konfliktlösungsprozess ab und versuchen Sie, den Status vor dem Zusammenführen wiederherzustellen.
Wenn beim Start der Zusammenführung nicht festgeschriebene Arbeitsbaumänderungen vorhanden waren, kann
git merge --abort
diese Änderungen in einigen Fällen nicht rekonstruieren. Es wird daher empfohlen, Ihre Änderungen immer festzuschreiben oder zu verstecken, bevor Sie git merge ausführen.
git merge --abort
entsprichtgit reset --merge
, wennMERGE_HEAD
vorhanden ist.
Es ist so einfach.
git merge --abort
Git selbst zeigt Ihnen die Lösung, wenn Sie in dieser Art von Schwierigkeiten sind und den Befehl git status ausführen.
git status
Hoffe das wird den Leuten helfen.
Ich denke es ist git reset
was du brauchst.
Beachten Sie, dass git revert
etwas ganz anderes bedeutet als svn revert
- in Subversion werden Ihre (nicht festgeschriebenen) Änderungen durch das Zurücksetzen verworfen und die Datei aus dem Repository auf die aktuelle Version zurückgesetzt, während git revert
macht ein Commit "rückgängig".
git reset
sollte das Äquivalent von svn revert
tun, dh, Ihre unerwünschten Änderungen verwerfen.
In diesem speziellen Anwendungsfall möchten Sie die Zusammenführung nicht wirklich abbrechen, sondern nur den Konflikt auf eine bestimmte Weise lösen.
Es besteht auch keine besondere Notwendigkeit, eine Zusammenführung mit einer anderen Strategie zurückzusetzen und durchzuführen. Die Konflikte wurden von git korrekt hervorgehoben und die Anforderung, die Änderungen der anderen Seiten zu akzeptieren, gilt nur für diese eine Datei.
Für eine nicht zusammengeführte Datei in einem Konflikt stellt git die allgemeine Basisversion, die lokale Version und die Remoteversion der Datei im Index zur Verfügung. (Hier werden sie zur Verwendung in einem 3-Wege-Diff-Tool von git mergetool
gelesen.) Sie können git show
verwenden, um sie anzuzeigen.
# common base:
git show :1:_widget.html.erb
# 'ours'
git show :2:_widget.html.erb
# 'theirs'
git show :3:_widget.html.erb
Der einfachste Weg, den Konflikt zu lösen, um die Remote-Version wörtlich zu verwenden, ist:
git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb
Oder mit git> = 1.6.1:
git checkout --theirs _widget.html.erb
Da Kommentare darauf hindeuten, dass git reset --merge
ein Alias für git merge --abort
ist, sollte beachtet werden, dass git merge --abort
nur mit git reset --merge
übereinstimmt, vorausgesetzt, dass ein MERGE_HEAD
vorhanden ist. Dies kann in der Git-Hilfe zum Merge-Befehl nachgelesen werden.
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
Wenn nach einer fehlgeschlagenen Zusammenführung kein MERGE_HEAD
vorhanden ist, kann die fehlgeschlagene Zusammenführung mit git reset --merge
rückgängig gemacht werden, jedoch nicht unbedingt mit git merge --abort
, es handelt sich also nicht nur um alte und neue Syntax für das gleiche.
Persönlich finde ich git reset --merge
für Szenarien, die dem beschriebenen ähneln, viel leistungsfähiger und Zusammenführungen im Allgemeinen fehlgeschlagen.
Und wenn Sie am Ende einen Zusammenführungskonflikt haben und nichts festzuschreiben haben, der Zusammenführungsfehler jedoch weiterhin angezeigt wird, nachdem Sie alle unten genannten Befehle angewendet haben,
git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch Origin
git reset --hard Origin
bitte entfernen
. git\index.lock
datei [Ausschneiden Einfügen an einem anderen Ort im Falle einer Wiederherstellung] und geben Sie dann einen der folgenden Befehle ein, je nachdem, welche Version Sie möchten.
git reset --hard HEAD
git reset --hard Origin
Ich hoffe, das hilft!!!
Seit Git 1.6.1.3 git checkout
kann von beiden Seiten einer Zusammenführung ausgecheckt werden:
_git checkout --theirs _widget.html.erb
_
Eine Alternative, die den Status der Arbeitskopie beibehält, ist:
git stash
git merge --abort
git stash pop
Ich rate generell davon ab, da es praktisch wie das Zusammenführen in Subversion ist, da die Verzweigungsbeziehungen im folgenden Commit verworfen werden.
Für dieses Szenario habe ich git fetch
und git pull
ausgeführt und dann festgestellt, dass der Upstream-Zweig kein Master-Zweig ist, was zu unerwünschten Konflikten führt.
git reset -merge
Dies wurde zurückgesetzt, ohne meine lokalen Änderungen zurückzusetzen.
Ich fand, dass das Folgende für mich funktioniert (eine einzelne Datei auf den Status vor dem Zusammenführen zurücksetzen):
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*