Wie man prüft, ob eine Datei in Git Konflikte hat

GitGitBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie Merge-Konflikte (Merge conflicts) in Git identifizieren und verstehen. Wir werden ein Konfliktszenario simulieren, indem wir in verschiedenen Zweigen (branches) widersprüchliche Änderungen an derselben Datei vornehmen und dann versuchen, diese zu mergen (merge).

Sie verwenden den Befehl git status, um das Vorhandensein von Konflikten zu erkennen, und untersuchen dann die konfliktbehaftete Datei, um die Konfliktmarker (conflict markers) zu sehen, die Git einfügt. Abschließend überprüfen Sie, dass Dateien ohne Konflikte nicht als solche markiert werden.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/BranchManagementGroup -.-> git/branch("Handle Branches") git/BranchManagementGroup -.-> git/checkout("Switch Branches") git/BranchManagementGroup -.-> git/merge("Merge Histories") subgraph Lab Skills git/add -.-> lab-560023{{"Wie man prüft, ob eine Datei in Git Konflikte hat"}} git/status -.-> lab-560023{{"Wie man prüft, ob eine Datei in Git Konflikte hat"}} git/commit -.-> lab-560023{{"Wie man prüft, ob eine Datei in Git Konflikte hat"}} git/branch -.-> lab-560023{{"Wie man prüft, ob eine Datei in Git Konflikte hat"}} git/checkout -.-> lab-560023{{"Wie man prüft, ob eine Datei in Git Konflikte hat"}} git/merge -.-> lab-560023{{"Wie man prüft, ob eine Datei in Git Konflikte hat"}} end

Führen Sie git status aus, um Konflikte zu erkennen

In diesem Schritt lernen wir, wie man den Befehl git status verwendet, um Konflikte in Ihrem Git-Repository zu erkennen. Konflikte treten auf, wenn zwei unterschiedliche Änderungen an derselben Stelle einer Datei vorgenommen werden und Git nicht weiß, welche Änderung beibehalten werden soll.

Zunächst stellen wir sicher, dass wir uns im Projektverzeichnis befinden. Öffnen Sie Ihr Terminal und navigieren Sie zum Verzeichnis my-time-machine:

cd ~/project/my-time-machine

Nun simulieren wir einen Konflikt. Stellen Sie sich vor, Sie und ein Mitarbeiter haben gleichzeitig, aber in verschiedenen Zweigen (branches), Änderungen an der Datei message.txt vorgenommen. In diesem Lab erstellen wir manuell ein Szenario, das zu einem Konflikt führt.

Zunächst erstellen wir einen neuen Zweig und machen eine Änderung.

git branch feature/greeting
git checkout feature/greeting
echo "Hope you are doing well!" >> message.txt
git add message.txt
git commit -m "Add a greeting"

Nun wechseln wir zurück zum master-Zweig und machen eine andere Änderung an derselben Datei.

git checkout master
echo "This is an important message." >> message.txt
git add message.txt
git commit -m "Add an important message"

Wir haben nun zwei unterschiedliche Änderungen an der Datei message.txt in zwei verschiedenen Zweigen vorgenommen. Wenn wir versuchen, diese Zweige zu mergen (merge), wird Git einen Konflikt erkennen.

Versuchen wir, den feature/greeting-Zweig in den master-Zweig zu mergen:

git merge feature/greeting

Sie sollten eine Ausgabe sehen, die auf einen Konflikt hinweist:

Auto-merging message.txt
CONFLICT (content): Merge conflict in message.txt
Automatic merge failed; fix conflicts and then commit the result.

Diese Ausgabe sagt uns, dass es einen Merge-Konflikt in der Datei message.txt gibt. Git konnte die Änderungen nicht automatisch zusammenführen, da sie sich überschnitten.

Nun führen wir git status aus, um zu sehen, wie Git den Konflikt meldet:

git status

Die Ausgabe sieht in etwa so aus:

On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to resolve merge conflicts)
        both modified:   message.txt

no changes added to commit (use "git add" and/or "git commit -a)")

Die Ausgabe von git status zeigt deutlich, dass wir uns "On branch master" befinden und "unmerged paths" haben. Es listet auch message.txt unter "Unmerged paths" auf und gibt an, dass es "both modified" wurde. So hilft Ihnen git status, Dateien mit Merge-Konflikten zu identifizieren.

Das Verständnis, wie man git status verwendet, um Konflikte zu erkennen, ist der erste Schritt bei ihrer Lösung. In den nächsten Schritten lernen wir, wie man die konfliktbehaftete Datei untersucht und den Konflikt löst.

Überprüfen Sie die Datei auf Konfliktmarker

Im vorherigen Schritt haben wir gesehen, dass git status einen Konflikt in der Datei message.txt gemeldet hat. Jetzt untersuchen wir die Datei selbst, um zu sehen, wie Git die konfliktbehafteten Abschnitte markiert.

Stellen Sie sicher, dass Sie sich immer noch im Verzeichnis ~/project/my-time-machine befinden.

Wir können den Befehl cat verwenden, um den Inhalt der Datei anzuzeigen:

cat message.txt

Die Ausgabe sieht in etwa so aus:

Hello, Future Me
<<<<<<< HEAD
This is an important message.
=======
Hope you are doing well!
>>>>>>> feature/greeting

Beachten Sie die speziellen Marker, die Git in die Datei eingefügt hat:

  • <<<<<<< HEAD: Dies markiert den Anfang der Änderungen im aktuellen Zweig (in diesem Fall HEAD, das auf master zeigt).
  • =======: Dies ist ein Trenner zwischen den Änderungen aus den beiden Zweigen.
  • >>>>>>> feature/greeting: Dies markiert das Ende der Änderungen aus dem Zweig, von dem Sie gemerged haben (feature/greeting).

Diese Marker zeigen Ihnen genau, wo der Konflikt aufgetreten ist und wie die verschiedenen Versionen der konfliktbehafteten Zeilen aussehen. Die Zeilen zwischen <<<<<<< HEAD und ======= sind die Änderungen aus Ihrem aktuellen Zweig (master), und die Zeilen zwischen ======= und >>>>>>> feature/greeting sind die Änderungen aus dem Zweig, den Sie gemerged haben (feature/greeting).

Ihre Aufgabe besteht nun darin, diese Datei manuell zu bearbeiten und zu entscheiden, welche Änderungen beibehalten werden sollen. Sie müssen die Konfliktmarker und die Zeilen entfernen, die Sie nicht beibehalten möchten, und nur den endgültigen gewünschten Inhalt übrig lassen.

Beispielsweise, wenn Sie beide Nachrichten beibehalten möchten, würden Sie die Datei so bearbeiten, dass sie wie folgt aussieht:

Hello, Future Me
This is an important message.
Hope you are doing well!

Oder, wenn Sie nur die Nachricht aus dem master-Zweig beibehalten möchten, würden Sie die Datei so bearbeiten, dass sie wie folgt aussieht:

Hello, Future Me
This is an important message.

Verwenden Sie den nano-Editor, um die Datei message.txt zu öffnen und zu bearbeiten:

nano message.txt

Bearbeiten Sie die Datei, um den Konflikt zu lösen, indem Sie die Konfliktmarker entfernen und den Inhalt auswählen, den Sie beibehalten möchten. In diesem Lab behalten wir beide Nachrichten bei.

Nach der Bearbeitung sollte der Dateiinhalt wie folgt aussehen:

Hello, Future Me
This is an important message.
Hope you are doing well!

Drücken Sie Ctrl + X, um nano zu verlassen, dann Y, um die Änderungen zu speichern, und schließlich Enter, um den Dateinamen zu bestätigen.

Indem Sie die Datei manuell bearbeiten und die Konfliktmarker entfernen, sagen Sie Git, wie die konfliktbehafteten Änderungen kombiniert werden sollen. Dies ist ein entscheidender Schritt bei der Lösung von Merge-Konflikten.

Testen von Dateien ohne Konflikte

In den vorherigen Schritten haben wir eine Datei mit einem Merge-Konflikt (message.txt) identifiziert und untersucht. Bei einem Merge können jedoch auch Dateien vorhanden sein, die in beiden Zweigen geändert wurden, aber ohne Konflikte. Git führt diese Dateien automatisch zusammen.

In diesem Schritt erstellen wir eine neue Datei in einem der Zweige und sehen, wie Git sie während des Merge-Prozesses behandelt. Dies hilft uns zu verstehen, dass Konflikte nur auftreten, wenn Änderungen in derselben Datei überlappen.

Stellen Sie sicher, dass Sie sich immer noch im Verzeichnis ~/project/my-time-machine befinden und sich auf dem master-Zweig befinden (wo der Merge-Konflikt aufgetreten ist).

Erstellen wir eine neue Datei namens notes.txt im master-Zweig:

echo "Important notes for the project." > notes.txt
git add notes.txt
git commit -m "Add project notes"

Nun wechseln wir zurück zum feature/greeting-Zweig:

git checkout feature/greeting

In diesem Zweig existiert die Datei notes.txt noch nicht. Erstellen wir hier eine andere Datei, beispielsweise todo.txt:

echo "Things to do: finish the lab." > todo.txt
git add todo.txt
git commit -m "Add a todo list"

Nun wechseln wir zurück zum master-Zweig und versuchen erneut, den Merge durchzuführen. Auch wenn wir den Konflikt in message.txt bereits gelöst haben, muss der Merge-Prozess abgeschlossen werden.

git checkout master
git merge feature/greeting

Diesmal sollte Git den Merge abschließen können, da wir den Konflikt in message.txt bereits gelöst und die Datei in die Staging-Area aufgenommen haben (auch wenn wir diesen Schritt nach der Bearbeitung nicht explizit gezeigt haben, nimmt Git die Datei oft nach der manuellen Konfliktlösung in die Staging-Area auf). Möglicherweise sehen Sie eine Ausgabe, die anzeigt, dass der Merge abgeschlossen ist.

Lassen Sie uns den Status erneut überprüfen:

git status

Die Ausgabe sollte nun anzeigen, dass Sie sich "On branch master" befinden und dass der Arbeitsbereich sauber ist, was bedeutet, dass es keine ausstehenden Änderungen oder ungemergten Pfade gibt.

On branch master
nothing to commit, working tree clean

Nun überprüfen wir, ob die Dateien aus beiden Zweigen im master-Zweig vorhanden sind:

ls

Sie sollten sowohl message.txt, notes.txt (aus dem master-Zweig) als auch todo.txt (aus dem feature/greeting-Zweig) aufgelistet sehen.

message.txt  notes.txt  todo.txt

Dies zeigt, dass Git die Änderungen aus feature/greeting, einschließlich der neuen Datei todo.txt, erfolgreich ohne Konflikte zusammengeführt hat, da todo.txt im master-Zweig nicht existierte. Konflikte treten nur auf, wenn dieselbe Datei in den zu mergenden Zweigen überlappende Änderungen aufweist.

Das Verständnis, wie Git sowohl konfliktbehaftete als auch konfliktfreie Dateien während eines Merges behandelt, ist für die effektive Verwaltung der Projektgeschichte unerlässlich.

Zusammenfassung

In diesem Lab haben wir gelernt, wie man Konflikte in Git mit dem Befehl git status erkennt. Wir haben einen Konflikt simuliert, indem wir in getrennten Zweigen unterschiedliche Änderungen an derselben Datei vorgenommen und dann versucht haben, sie zusammenzuführen. Die Ausgabe von git status hat deutlich gezeigt, dass es ungemergte Pfade gibt und welche spezifische Datei den Konflikt enthält.

Wir haben auch untersucht, wie man die Konfliktmarker in der konfliktbehafteten Datei selbst identifiziert. Git fügt diese Marker ein, um die konfliktbehafteten Abschnitte hervorzuheben. Schließlich haben wir bestätigt, dass Dateien ohne Konflikte nicht mit diesen speziellen Zeichen markiert sind, was unser Verständnis dafür, wie Git Merge-Probleme kennzeichnet, vertieft.