Verwenden von Git Pull mit der Option --ignore-unmerged
Nachdem wir nun einen Konflikt zwischen unserem lokalen und Remote-Repository erstellt haben, wollen wir untersuchen, wie man die Option git pull --ignore-unmerged
verwendet, um ihn zu lösen.
Verständnis der Option --ignore-unmerged
Die Option --ignore-unmerged
teilt Git mit, bei Konflikten die Remote-Änderungen gegenüber Ihren lokalen Änderungen zu priorisieren. Dies kann in Situationen nützlich sein, in denen Sie wissen, dass die Remote-Änderungen wichtiger sind als Ihre lokalen Änderungen.
Abbrechen der laufenden Merge-Operation
Bevor wir die Option --ignore-unmerged
verwenden können, müssen wir die aktuelle Merge-Operation abbrechen:
cd ~/project/git-pull-demo
git merge --abort
Dieser Befehl setzt Ihr Arbeitsverzeichnis in den Zustand vor dem Merge-Versuch zurück. Überprüfen wir den Inhalt der Datei:
cat file1.txt
Sie sollten jetzt nur Ihre lokalen Änderungen sehen:
This is the first line of the file.
This line was added locally.
Verwenden der Option --ignore-unmerged
Nun verwenden wir die Option git pull --ignore-unmerged
:
git pull --ignore-unmerged origin main
Sie werden feststellen, dass Git immer noch einen Konflikt meldet:
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
Dies liegt daran, dass die Option --ignore-unmerged
etwas anders funktioniert, als der Name vermuten lässt. Sie löst Konflikte nicht direkt, indem sie Ihre lokalen Änderungen ignoriert. Stattdessen ermöglicht sie es Git, mit einem Merge fortzufahren, auch wenn es ungemergte Einträge gibt.
Verständnis dessen, was tatsächlich passiert ist
Der richtige Weg, um Remote-Änderungen gegenüber lokalen Änderungen zu priorisieren, ist die Verwendung der Option --strategy-option theirs
:
git reset --hard ## Warnung: Dies verwirft alle uncommitteten Änderungen
git pull -X theirs origin main
Die Ausgabe sollte wie folgt aussehen:
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Updating xxxxxxx..xxxxxxx
Fast-forward
file1.txt | 1 +
1 file changed, 1 insertion(+)
Dieser Befehl teilt Git mit, Konflikte automatisch zu lösen, indem es die Remote-Änderungen ("theirs") gegenüber Ihren lokalen Änderungen ("ours") bevorzugt.
Überprüfen wir nun den Inhalt der Datei:
cat file1.txt
Sie sollten sehen:
This is the first line of the file.
This line was added by a team member.
Wie Sie sehen können, wurden die Remote-Änderungen gegenüber Ihren lokalen Änderungen priorisiert. Die Option --strategy-option theirs
ist ein direkterer Weg, um das zu erreichen, was viele Leute fälschlicherweise glauben, dass --ignore-unmerged
tut.
Wann man --ignore-unmerged verwenden sollte
Die Option --ignore-unmerged
ist tatsächlich nützlicher in Fällen, in denen Sie Updates für Dateien abrufen möchten, die keine Konflikte haben, während Sie konfliktbehaftete Dateien ungemergt lassen, um sie später manuell zu lösen.
Um dies richtig zu demonstrieren, erstellen wir ein weiteres Szenario:
## Fügen Sie lokal eine neue Datei hinzu
echo "This is a new local file." > local_file.txt
git add local_file.txt
git commit -m "Added local_file.txt"
## Erstellen Sie eine Änderung im Teammitglied-Repository
cd ~/project/team-member-repo
echo "This is a second line by team member." >> file1.txt
echo "This is a new remote file." > remote_file.txt
git add file1.txt remote_file.txt
git commit -m "Team member made more changes"
git push origin main
## Gehen Sie zurück zu Ihrem Repository
cd ~/project/git-pull-demo
## Machen Sie eine andere Änderung an file1.txt
echo "This is another local change." >> file1.txt
git add file1.txt
git commit -m "Made another local change"
Wenn Sie nun versuchen, die Änderungen zu pullen, erhalten Sie einen Konflikt:
git pull origin main
Ausgabe:
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
Brechen wir den Merge ab und versuchen es mit --ignore-unmerged
:
git merge --abort
git pull --ignore-unmerged origin main
Dies kann immer noch Konflikte anzeigen, aber es ermöglicht Ihnen, alle nicht-konfliktbehafteten Änderungen (wie remote_file.txt
) zu erhalten, während Sie die konfliktbehaftete Datei (file1.txt
) für eine manuelle Lösung übrig lassen.