Ich git pull
habe einen Zusammenführungskonflikt verwendet und hatte:
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 aufgegeben werden. Wie kann ich das machen?
git
version-control
git-merge
git-merge-conflict
Gwyn Morfey
quelle
quelle
[rejected] gh-pages -> gh-pages (non-fast-forward)
Antworten:
Da Sie nicht
pull
erfolgreich waren, istHEAD
(nichtHEAD^
) das letzte "gültige" Commit in Ihrem Zweig:Das andere Stück, das Sie möchten, ist, dass ihre Änderungen Ihre Änderungen überschreiben.
In älteren Versionen von git konnten Sie die Zusammenführungsstrategie "ihrer" verwenden:
Dies wurde jedoch inzwischen entfernt, wie in dieser Nachricht von Junio Hamano (dem Git-Betreuer) erläutert . Wie im Link angegeben , würden Sie stattdessen Folgendes tun:
quelle
git fetch origin
->git reset origin (soft reset, your changes are still present)
->git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin)
Ich verwende Git Pull nie mehr. Da in einem Kampf zwischen meinem neuesten Code und dem Ursprung der Ursprung immer gewinnen sollte, habe ich immergit fetch
undgit rebase origin
. Dies macht meine Verschmelzungen und Konflikte tatsächlich selten.git log ..@{upstream}
odergit diff ..@{upstream}
). Danach werde ich wie Sie meine Arbeit neu begründen.git merge -X theirs remote_branch
stattgit pull --strategy=theirs remote_branch
wietheirs
sieht aus wie eine Optionrecursive
git merge --abort
ist weit vorzuziehen.Wenn Ihre Git-Version> = 1.6.1 ist, können Sie verwenden
git reset --merge
.Wie @Michael Johnson erwähnt, können Sie auch verwenden, wenn Ihre Git-Version> = 1.7.4 ist
git merge --abort
.Stellen Sie wie immer sicher, dass Sie keine nicht festgeschriebenen Änderungen vorgenommen haben, bevor Sie mit dem Zusammenführen beginnen.
Auf der Manpage zum Zusammenführen von Git
git merge --abort
ist äquivalent zugit reset --merge
wannMERGE_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 vor dem Starten einer Zusammenführung nicht festschreiben möchten, sondern nur
git stash
vor der Zusammenführung undgit stash pop
nach Abschluss der Zusammenführung oder nach dem Abbrechen.quelle
<commit>
? #GitMoment: -ogit merge --abort
nur ein Synonym fürgit reset --merge
? Der Name ist sicherlich sinnvoller, aber hat er die gleiche Funktionalität?http://www.git-scm.com/docs/git-merge
quelle
Es ist so einfach.
Git selbst zeigt Ihnen die Lösung, wenn Sie in solchen Schwierigkeiten sind, und führt den Befehl git status aus.
Hoffe das wird den Menschen helfen.
quelle
Ich denke,
git reset
du brauchst es.Beachten Sie, dass
git revert
dies etwas ganz anderes bedeutet als beispielsweisesvn revert
: In Subversion verwirft das Zurücksetzen Ihre (nicht festgeschriebenen) Änderungen und gibt die Datei aus dem Repository auf die aktuelle Version zurück, währendgit revert
ein Commit "rückgängig gemacht" wird.git reset
sollte das Äquivalent tunsvn revert
, dh Ihre unerwünschten Änderungen verwerfen.quelle
In diesem speziellen Anwendungsfall möchten Sie die Zusammenführung nicht wirklich abbrechen, sondern den Konflikt nur auf eine bestimmte Weise lösen.
Es ist auch nicht besonders erforderlich, 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 allgemeinen Basis-, lokalen und Remote-Versionen der Datei im Index zur Verfügung. (Hier werden sie zur Verwendung in einem 3-Wege-Diff-Tool von gelesen
git mergetool
.) Sie können siegit show
zum Anzeigen verwenden.Der einfachste Weg, den Konflikt zu lösen, um die Remote-Version wörtlich zu verwenden, ist:
Oder mit git> = 1.6.1:
quelle
git 1.6.1
Befehl macht sehr viel Sinn und ist gut. Genau das hätte ich mir gewünscht. Ich denke, die Lösung vor 1.6.1 ist unelegant und erfordert Kenntnisse über andere Teile von Git, die vom Prozess der Auflösung von Zusammenführungen getrennt werden sollten. Aber die neue Version ist großartig!Für ein Szenario wie das habe ich
git fetch
undgit pull
dann festgestellt, dass der Upstream-Zweig kein Hauptzweig ist, was zu unerwünschten Konflikten führte.Dies wurde zurückgesetzt, ohne meine lokalen Änderungen zurückzusetzen.
quelle
Kommentare deuten darauf hin, dass dies
git reset --merge
ein Alias für istgit merge --abort
. Es ist erwähnenswert, dass diesgit merge --abort
nur gleichbedeutend ist,git reset --merge
wenn aMERGE_HEAD
vorhanden ist. Dies kann in der Git-Hilfe zum Zusammenführen gelesen werden.Nach einer fehlgeschlagenen Zusammenführung, wenn es keine gibt
MERGE_HEAD
die fehlgeschlagene Zusammenführung rückgängig gemacht werdengit reset --merge
, jedoch nicht unbedingt mitgit merge --abort
. Sie sind nicht nur alte und neue Syntax für dasselbe .Persönlich finde ich
git reset --merge
für Szenarien, die den beschriebenen ähnlich sind, und für fehlgeschlagene Zusammenführungen im Allgemeinen viel leistungsfähiger.quelle
git stash apply
verursachte einen Zusammenführungskonflikt für mich,git merge --abort
half aber nicht, während ich esgit reset --merge
tat.Wenn Sie einen Zusammenführungskonflikt haben und nichts festschreiben müssen, wird dennoch ein Zusammenführungsfehler angezeigt. Nachdem Sie alle unten genannten Befehle angewendet haben,
Bitte entfernen
Datei [Ausschneiden und Einfügen an einer anderen Stelle im Falle einer Wiederherstellung] und geben Sie dann einen der folgenden Befehle ein, je nachdem, welche Version Sie möchten.
Ich hoffe, das hilft!!!
quelle
Eine Alternative, die den Status der Arbeitskopie beibehält, ist:
Ich rate generell davon ab, da es effektiv wie das Zusammenführen in Subversion ist, da es die Verzweigungsbeziehungen im folgenden Commit wegwirft.
quelle
Seit Git 1.6.1.3
git checkout
von beiden Seiten einer Zusammenführung auschecken konnte:quelle
Ich habe festgestellt, dass Folgendes für mich funktioniert (eine einzelne Datei in den Status vor dem Zusammenführen zurücksetzen):
quelle
Sourcetree
Da Sie Ihre Zusammenführung nicht festschreiben, doppelklicken Sie einfach auf einen anderen Zweig (was bedeutet, dass Sie ihn auschecken müssen), und wenn Sourcetree Sie nach dem Verwerfen aller Änderungen fragt, stimmen Sie zu :)
quelle