Testen von Commits ohne Vorfahrbeziehung
In den vorherigen Schritten haben wir git merge-base --is-ancestor
verwendet, um zu bestätigen, dass frühere Commits Vorfahren späterer Commits auf demselben Branch sind. Jetzt wollen wir untersuchen, was passiert, wenn wir Commits testen, die keine Vorfahren voneinander sind.
Navigieren Sie in Ihr Repository-Verzeichnis:
cd ~/project/git-ancestor-lab
Wir haben derzeit einen einzigen Branch (master
) mit drei Commits. Um Beziehungen ohne Vorfahrbeziehung zu testen, müssen wir einen neuen Branch erstellen und einen Commit auf diesem Branch machen. Dies wird eine divergierende Historie schaffen.
Zunächst erstellen wir einen neuen Branch namens feature
:
git branch feature
Dieser Befehl erstellt einen neuen Branch-Zeiger namens feature
, der auf denselben Commit wie master
zeigt (unser neuestes Commit, <commit-hash-3>
).
Jetzt wechseln wir zum feature
-Branch:
git checkout feature
Sie sollten eine Ausgabe sehen, die anzeigt, dass Sie den Branch gewechselt haben:
Switched to branch 'feature'
Wir befinden uns jetzt auf dem feature
-Branch. Lassen Sie uns einen neuen Commit auf diesem Branch machen. Erstellen Sie eine neue Datei:
echo "Feature content" > file2.txt
git add file2.txt
git commit -m "Add file2 on feature branch"
Sie werden eine Ausgabe sehen, die den Commit auf dem feature
-Branch bestätigt:
[feature <commit-hash-4>] Add file2 on feature branch
1 file changed, 1 insertion(+)
create mode 100644 file2.txt
Jetzt schauen wir uns die Historie mit git log --oneline --all --graph
an. Die Option --all
zeigt Commits von allen Branches an, und --graph
zeichnet eine textbasierte Darstellung der Commit-Historie.
git log --oneline --all --graph
Die Ausgabe zeigt eine verzweigte Historie. Sie könnte in etwa so aussehen (die Commit-Hashes variieren):
* <commit-hash-4> (HEAD -> feature) Add file2 on feature branch
* <commit-hash-3> (master) Add final content to file1
* <commit-hash-2> Add more content to file1
* <commit-hash-1> Add file1 with initial content
In diesem Graphen ist <commit-hash-4>
das neueste Commit auf dem feature
-Branch, und <commit-hash-3>
ist das neueste Commit auf dem master
-Branch. Diese beiden Commits sind keine Vorfahren voneinander. Sie haben einen gemeinsamen Vorfahren, nämlich <commit-hash-3>
(das Commit, an dem der feature
-Branch erstellt wurde).
Lassen Sie uns git merge-base --is-ancestor
verwenden, um die Beziehung zwischen <commit-hash-4>
und <commit-hash-3>
zu testen. Ersetzen Sie die Platzhalter durch Ihre tatsächlichen Commit-Hashes.
git merge-base --is-ancestor <commit-hash-4> <commit-hash-3>
echo $?
Dieser Befehl prüft, ob <commit-hash-4>
Vorfahr von <commit-hash-3>
ist. Basierend auf unserem Graphen ist dies nicht der Fall. Daher sollte der Befehl mit einem Status von 1
beenden.
Jetzt testen wir es umgekehrt: Ist <commit-hash-3>
Vorfahr von <commit-hash-4>
?
git merge-base --is-ancestor <commit-hash-3> <commit-hash-4>
echo $?
Dieser Befehl prüft, ob <commit-hash-3>
Vorfahr von <commit-hash-4>
ist. Betrachtet man den Graphen, ist der Eltern-Commit von <commit-hash-4>
<commit-hash-3>
. Also ist <commit-hash-3>
tatsächlich Vorfahr von <commit-hash-4>
. Der Befehl sollte mit einem Status von 0
beenden.
Dies zeigt, wie git merge-base --is-ancestor
verwendet werden kann, um programmgesteuert die Beziehung zwischen zwei beliebigen Commits in der Historie Ihres Repositorys zu prüfen, auch über verschiedene Branches hinweg.