Umgang mit Cherry-Pick-Konflikten
Manchmal, wenn Sie einen Commit cherry-picken, kann Git auf Konflikte stoßen, wenn die Änderungen in dem Commit mit Änderungen in Ihrem aktuellen Branch kollidieren. In diesem Schritt lernen wir, wie man Cherry-Pick-Konflikte behandelt und wie man eine Cherry-Pick-Operation abbricht.
Erstellen eines Szenarios mit potenziellen Konflikten
Zuerst erstellen wir ein Szenario, das zu einem Cherry-Pick-Konflikt führt:
## Switch to main branch and modify README.md
git checkout main
echo -e "## Cherry Pick Lab\n\nThis is the main branch README." > README.md
git commit -am "Update README in main branch"
## Switch to feature branch and make a conflicting change to README.md
git checkout feature-branch
echo -e "## Cherry Pick Lab\n\nThis README has been updated in the feature branch." > README.md
git commit -am "Update README in feature branch"
Versuch eines Cherry-Pick mit Konflikten
Nun wechseln wir zurück zum Main-Branch und versuchen, den Commit vom Feature-Branch zu cherry-picken:
git checkout main
CONFLICT_HASH=$(git log feature-branch --oneline | grep "Update README in feature" | cut -d ' ' -f 1)
git cherry-pick $CONFLICT_HASH
Da beide Branches dieselben Zeilen in README.md geändert haben, sollten Sie einen Konflikt sehen:
error: could not apply a1b2c3d... Update README in feature branch
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
Anzeigen des Konflikts
Untersuchen wir den Konflikt:
git status
Sie sollten eine Ausgabe sehen, die einen Konflikt in README.md anzeigt:
On branch main
You are currently cherry-picking commit a1b2c3d.
(fix conflicts and run "git cherry-pick --continue")
(use "git cherry-pick --abort" to cancel the cherry-pick operation)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
Sehen wir uns den Inhalt der konfliktbehafteten Datei an:
cat README.md
Sie sollten so etwas sehen:
## Cherry Pick Lab
<<<<<<< HEAD
This is the main branch README.
=======
This README has been updated in the feature branch.
>>>>>>> a1b2c3d... Update README in feature branch
Auflösen des Konflikts
Um den Konflikt zu lösen, müssen wir die Datei bearbeiten und entscheiden, welche Änderungen beibehalten werden sollen. Ändern wir README.md, um beide Änderungen einzubeziehen:
echo -e "## Cherry Pick Lab\n\nThis is the main branch README.\n\nThis README has also been updated with content from the feature branch." > README.md
Nun markieren wir den Konflikt als gelöst und setzen das Cherry-Pick fort:
git add README.md
git cherry-pick --continue
Git öffnet einen Editor mit einer Standard-Commit-Nachricht. Speichern und schließen Sie den Editor, um das Cherry-Pick abzuschließen.
Abbrechen eines Cherry-Pick
Manchmal entscheiden Sie sich möglicherweise, die Konflikte nicht zu lösen und möchten stattdessen die Cherry-Pick-Operation abbrechen. Erstellen wir einen weiteren Konflikt und brechen dann das Cherry-Pick ab:
## Create another conflicting commit in feature branch
git checkout feature-branch
echo "// This will conflict with app.js in main" > app.js
git commit -am "Modify app.js in feature branch"
## Try to cherry-pick this commit to main
git checkout main
ANOTHER_CONFLICT=$(git log feature-branch --oneline | grep "Modify app.js" | cut -d ' ' -f 1)
git cherry-pick $ANOTHER_CONFLICT
Sie sollten einen weiteren Konflikt sehen. Diesmal brechen wir das Cherry-Pick ab:
git cherry-pick --abort
Sie sollten sehen, dass die Cherry-Pick-Operation abgebrochen wurde und Ihr Arbeitsverzeichnis in seinen vorherigen Zustand zurückversetzt wurde:
git status
Ausgabe:
On branch main
nothing to commit, working tree clean
Der Umgang mit Konflikten während Cherry-Pick-Operationen ist eine wesentliche Fähigkeit für Git-Benutzer. Sie haben drei Optionen, wenn Sie auf einen Konflikt stoßen:
- Lösen Sie den Konflikt manuell und verwenden Sie dann
git add
und git cherry-pick --continue
- Überspringen Sie den konfliktbehafteten Commit mit
git cherry-pick --skip
- Brechen Sie die gesamte Cherry-Pick-Operation mit
git cherry-pick --abort
ab
Der beste Ansatz hängt von der spezifischen Situation und Ihren Projektanforderungen ab.