Testar Commits Não Ancestrais
Nas etapas anteriores, usamos git merge-base --is-ancestor para confirmar que commits anteriores eram ancestrais de commits posteriores na mesma branch. Agora, vamos explorar o que acontece quando testamos commits que não são ancestrais um do outro.
Navegue até o diretório do seu repositório:
cd ~/project/git-ancestor-lab
Atualmente, temos uma única branch (master) com três commits. Para testar relações não-ancestrais, precisamos criar uma nova branch e fazer um commit nessa branch. Isso criará um histórico divergente.
Primeiro, vamos criar uma nova branch chamada feature:
git branch feature
Este comando cria um novo ponteiro de branch chamado feature que aponta para o mesmo commit que master (nosso último commit, <commit-hash-3>).
Agora, vamos mudar para a branch feature:
git checkout feature
Você deve ver uma saída indicando que você mudou de branch:
Switched to branch 'feature'
Agora estamos na branch feature. Vamos fazer um novo commit nesta branch. Crie um novo arquivo:
echo "Feature content" > file2.txt
git add file2.txt
git commit -m "Add file2 on feature branch"
Você verá uma saída confirmando o commit na branch feature:
[feature <commit-hash-4>] Add file2 on feature branch
1 file changed, 1 insertion(+)
create mode 100644 file2.txt
Agora, vamos olhar para o histórico usando git log --oneline --all --graph. A flag --all mostra commits de todas as branches, e --graph desenha uma representação baseada em texto do histórico de commits.
git log --oneline --all --graph
A saída mostrará um histórico de ramificação. Pode parecer algo assim (os hashes de commit variarão):
* <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
Neste gráfico, <commit-hash-4> é o commit mais recente na branch feature, e <commit-hash-3> é o commit mais recente na branch master. Esses dois commits não são ancestrais um do outro. Eles compartilham um ancestral comum, que é <commit-hash-3> (o commit onde a branch feature foi criada).
Vamos usar git merge-base --is-ancestor para testar a relação entre <commit-hash-4> e <commit-hash-3>. Substitua os espaços reservados pelos seus hashes de commit reais.
git merge-base --is-ancestor <commit-hash-4> <commit-hash-3>
echo $?
Este comando verifica se <commit-hash-4> é um ancestral de <commit-hash-3>. Com base em nosso gráfico, não é. Portanto, o comando deve sair com um status de 1.
Agora, vamos testar o outro lado: <commit-hash-3> é um ancestral de <commit-hash-4>?
git merge-base --is-ancestor <commit-hash-3> <commit-hash-4>
echo $?
Este comando verifica se <commit-hash-3> é um ancestral de <commit-hash-4>. Olhando para o gráfico, o pai de <commit-hash-4> é <commit-hash-3>. Então, <commit-hash-3> é um ancestral de <commit-hash-4>. O comando deve sair com um status de 0.
Isso demonstra como git merge-base --is-ancestor pode ser usado para verificar programaticamente a relação entre quaisquer dois commits no histórico do seu repositório, mesmo em diferentes branches.