Hier ist ein Workflow, mit dem ich mich normalerweise bei der Arbeit beschäftige.
git checkout -b feature_branch
# Do some development
git add .
git commit
git push origin feature_branch
Zu diesem Zeitpunkt steht der Feature-Zweig zur Überprüfung durch meine Kollegen zur Verfügung, aber ich möchte mich weiter auf andere Features konzentrieren, die davon abhängig sind feature_branch
. Also, während feature_branch
im Rückblick ...
git checkout feature_branch
git checkout -b dependent_branch
# Do some more development
git add .
git commit
Jetzt nehme ich einige Änderungen als Antwort auf die Codeüberprüfung auf feature_branch vor
git checkout feature_branch
# Do review fixes
git add .
git commit
git checkout dependent_branch
git merge feature_branch
Hier bekommen wir Probleme. Wir haben eine Squash-Richtlinie für Master, was bedeutet, dass Feature-Zweige, die zu Master zusammengeführt werden, zu einem einzigen Commit gequetscht werden müssen.
git checkout feature_branch
git log # Look for hash at beginning of branch
git rebase -i first_hash_of_branch # Squash feature_branch into a single commit
git merge master
Alles ist cool, außer mit dependent_branch
. Wenn ich versuche, abhängige Zweige auf Master umzustellen oder Master darin zusammenzuführen, wird Git durch die neu geschriebene / gequetschte Historie verwirrt und markiert im Grunde jede einzelne Änderung depedendent_branch
als Konflikt. Es ist eine PITA, alle Änderungen in zu durchlaufen und im Grunde genommen zu wiederholen oder zu konfliktisieren dependent_branch
. Gibt es eine Lösung dafür? Manchmal erstelle ich manuell einen Patch und wende ihn von einem neuen Master-Zweig aus an. Wenn es jedoch echte Konflikte gibt, ist es noch schlimmer, ihn zu beheben.
git checkout dependent_branch
git diff > ~/Desktop/dependent_branch.diff
git checkout master
git checkout -b new_dependent_branch
patch -p1 < ~/Desktop/dependent_branch.diff
# Pray for a clean apply.
Irgendwelche Ideen? Ich weiß, dass dies aufgrund der neu geschriebenen Geschichte während des Squashs passiert, aber das ist eine Voraussetzung, die ich nicht ändern kann. Was ist die beste Lösung / Problemumgehung? Kann ich etwas zaubern? Oder gibt es eine schnellere Möglichkeit, alle Schritte zum manuellen Erstellen des Diff auszuführen?
git add .
ist es völlig böse und wird dich irgendwann beißen, wenn du Dinge begehst, die du nicht vorhast. Sie sollten verwendengit add -p
oder zumindestgit add -u .