Lösen Sie Konflikte mithilfe von Remote-Änderungen, wenn Sie von Git Remote abrufen

297

Ich versuche, Code von meinem GitHub-Repo auf meinen Server zu ziehen, aber der Pull schlägt weiterhin aufgrund von Zusammenführungskonflikten fehl. Ich möchte keine der Änderungen beibehalten, die seit dem letzten Abruf auf meinem lokalen Server aufgetreten sind.

Gibt es eine Möglichkeit, Git zu zwingen, mit einer beliebigen Version in GitHub zu überschreiben, anstatt mich über Konflikte zu stören?

David Tuite
quelle
4
@nvm: Nein. Hier geht es um echte Zusammenführungskonflikte, nicht um nicht verfolgte Dateien, die überschrieben werden.
Cascabel

Antworten:

491

Wenn Sie die lokal vorgenommenen Commits wirklich verwerfen möchten , dh sie nie wieder in der Historie haben möchten, fragen Sie nicht, wie Sie ziehen sollen - Pull bedeutet Zusammenführen, und Sie müssen nicht zusammenführen. Alles was Sie tun müssen ist Folgendes:

# fetch from the default remote, origin
git fetch
# reset your current branch (master) to origin's master
git reset --hard origin/master

Ich persönlich würde empfehlen, zuerst einen Backup-Zweig an Ihrem aktuellen HEAD zu erstellen, damit Sie den Überblick nicht verlieren, wenn Sie feststellen, dass dies eine schlechte Idee ist.

Wenn Sie andererseits diese Commits beibehalten und den Eindruck erwecken möchten, dass Sie mit dem Ursprung zusammengeführt wurden, und die Zusammenführung nur die Versionen vom Ursprung fernhält, können Sie die oursZusammenführungsstrategie verwenden:

# fetch from the default remote, origin
git fetch
# create a branch at your current master
git branch old-master
# reset to origin's master
git reset --hard origin/master
# merge your old master, keeping "our" (origin/master's) content
git merge -s ours old-master
Cascabel
quelle
1
Im zweiten Block von Git-Befehlen gibt es nach dem zweiten Befehl einen 'Git-Fetch-Ursprung'?
David Tuite
@ David: Ja, Sie sollten irgendwann vom Ursprung abrufen. Entschuldigung, ich habe es als implizit angesehen.
Cascabel
2
Es gibt nichts, was impliziert werden könnte, wenn es um mich und git geht ;-). Im Ernst, danke eine Million. Ihre Antworten sind genau das, wonach ich gesucht habe.
David Tuite
1
Funktioniert dies, wenn der Ursprung tatsächlich vor uns liegt? Wie in, kann ich es auch verwenden, wenn ich keine Commits vor mir habe und der Zweig tatsächlich schnell weitergeleitet werden kann?
Jared Forsyth
1
Vielen Dank! Hat es einfach erscheinen lassen.
Sholsinger
137

Sie können entweder die Antwort über den doppelten Link verwenden, auf den nvm zeigt.

Oder Sie können Konflikte mithilfe ihrer Änderungen lösen (einige Ihrer Änderungen werden jedoch möglicherweise beibehalten, wenn sie nicht mit der Remote-Version in Konflikt stehen):

git pull -s recursive -X theirs
Antoine Pelisse
quelle
3
Scheint nicht für mich zu arbeiten. Ich erhalte "Fehler: unbekannter Schalter" X "" mit Git Git Version 1.5.6.5. Muss ich auf eine instabile Version aktualisieren?
David Tuite
Außerdem, Antoine, wenn Sie die Origin-Version von allem nehmen möchten, nicht nur widersprüchliche Inhalte, können Sie - siehe meine Antwort.
Cascabel
2
@ David Sie können eine aktuelle Version von git für debian Suche von backports.debian.org
Arrowmaster
2
Genau das habe ich gesucht!
Micahblu
2
@CeesTimmerman Nicht wahr, zumindest in der neuesten Version. XDie Option wird zum Zusammenführen der Strategie übergeben, was nur recursivebeim Zusammenführen von zwei Köpfen der Fall ist , sodass sich Ihr Befehl beschwert "Could not find merge strategy 'theirs'. Available strategies are: octopus ours recursive resolve subtree."- es ist eine Schande, da Xdies in der Konfiguration festgelegt werden kann (z. B. git config pull.twohead theirs), aber snicht.
OJFord