Tester des commits non-ancêtres
Dans les étapes précédentes, nous avons utilisé git merge-base --is-ancestor
pour confirmer que les commits antérieurs étaient les ancêtres des commits ultérieurs sur la même branche. Maintenant, explorons ce qui se passe lorsque nous testons des commits qui ne sont pas les ancêtres les uns des autres.
Accédez au répertoire de votre dépôt :
cd ~/project/git-ancestor-lab
Actuellement, nous avons une seule branche (master
) avec trois commits. Pour tester les relations de non-ascendance, nous devons créer une nouvelle branche et effectuer un commit sur cette branche. Cela créera un historique divergent.
Tout d'abord, créons une nouvelle branche appelée feature
:
git branch feature
Cette commande crée un nouveau pointeur de branche appelé feature
qui pointe vers le même commit que master
(notre dernier commit, <commit-hash-3>
).
Maintenant, changeons de branche pour la branche feature
:
git checkout feature
Vous devriez voir une sortie indiquant que vous avez changé de branche :
Switched to branch 'feature'
Nous sommes maintenant sur la branche feature
. Effectuons un nouveau commit sur cette branche. Créez un nouveau fichier :
echo "Feature content" > file2.txt
git add file2.txt
git commit -m "Add file2 on feature branch"
Vous verrez une sortie confirmant le commit sur la branche feature
:
[feature <commit-hash-4>] Add file2 on feature branch
1 file changed, 1 insertion(+)
create mode 100644 file2.txt
Maintenant, examinons l'historique en utilisant git log --oneline --all --graph
. Le flag --all
affiche les commits de toutes les branches, et --graph
trace une représentation textuelle de l'historique des commits.
git log --oneline --all --graph
La sortie montrera un historique avec des branches. Elle pourrait ressembler à ceci (les hachages de commit varieront) :
* <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
Dans ce graphe, <commit-hash-4>
est le dernier commit sur la branche feature
, et <commit-hash-3>
est le dernier commit sur la branche master
. Ces deux commits ne sont pas les ancêtres l'un de l'autre. Ils ont un ancêtre commun, qui est <commit-hash-3>
(le commit où la branche feature
a été créée).
Utilisons git merge-base --is-ancestor
pour tester la relation entre <commit-hash-4>
et <commit-hash-3>
. Remplacez les espaces réservés par les hachages de commit réels.
git merge-base --is-ancestor <commit-hash-4> <commit-hash-3>
echo $?
Cette commande vérifie si <commit-hash-4>
est l'ancêtre de <commit-hash-3>
. D'après notre graphe, ce n'est pas le cas. Par conséquent, la commande devrait se terminer avec un statut de 1
.
Maintenant, testons l'inverse : <commit-hash-3>
est-il l'ancêtre de <commit-hash-4>
?
git merge-base --is-ancestor <commit-hash-3> <commit-hash-4>
echo $?
Cette commande vérifie si <commit-hash-3>
est l'ancêtre de <commit-hash-4>
. En regardant le graphe, le parent de <commit-hash-4>
est <commit-hash-3>
. Donc, <commit-hash-3>
est l'ancêtre de <commit-hash-4>
. La commande devrait se terminer avec un statut de 0
.
Cela démontre comment git merge-base --is-ancestor
peut être utilisé pour vérifier de manière programmée la relation entre n'importe deux commits de l'historique de votre dépôt, même sur différentes branches.