Тестирование коммитов, не являющихся предками
В предыдущих шагах мы использовали команду git merge-base --is-ancestor для подтверждения того, что более ранние коммиты были предками более поздних коммитов на одной и той же ветке. Теперь давайте исследуем, что произойдет, когда мы проверим коммиты, которые не являются предками друг друга.
Перейдите в каталог вашего репозитория:
cd ~/project/git-ancestor-lab
В настоящее время у нас есть одна ветка (master) с тремя коммитами. Чтобы протестировать ситуации, когда коммиты не являются предками друг друга, нам нужно создать новую ветку и сделать коммит на этой ветке. Это создаст разветвленную историю.
Сначала создадим новую ветку с именем feature:
git branch feature
Эта команда создает новый указатель ветки с именем feature, который указывает на тот же коммит, что и master (наш самый свежий коммит, <commit-hash-3>).
Теперь переключимся на ветку feature:
git checkout feature
Вы должны увидеть вывод, указывающий, что вы переключились на другую ветку:
Switched to branch 'feature'
Теперь мы находимся на ветке feature. Сделаем новый коммит на этой ветке. Создадим новый файл:
echo "Feature content" > file2.txt
git add file2.txt
git commit -m "Add file2 on feature branch"
Вы увидите вывод, подтверждающий коммит на ветке feature:
[feature <commit-hash-4>] Add file2 on feature branch
1 file changed, 1 insertion(+)
create mode 100644 file2.txt
Теперь посмотрим на историю с помощью команды git log --oneline --all --graph. Флаг --all показывает коммиты из всех веток, а флаг --graph рисует текстовое представление истории коммитов.
git log --oneline --all --graph
Вывод будет показывать разветвленную историю. Он может выглядеть примерно так (хэши коммитов будут разными):
* <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
В этом графе <commit-hash-4> - это самый свежий коммит на ветке feature, а <commit-hash-3> - самый свежий коммит на ветке master. Эти два коммита не являются предками друг друга. У них есть общий предок, который является <commit-hash-3> (коммит, где была создана ветка feature).
Давайте используем команду git merge-base --is-ancestor для проверки связи между <commit-hash-4> и <commit-hash-3>. Замените заполнители на фактические хэши коммитов.
git merge-base --is-ancestor <commit-hash-4> <commit-hash-3>
echo $?
Эта команда проверяет, является ли <commit-hash-4> предком <commit-hash-3>. Исходя из нашего графа, это не так. Поэтому команда должна завершиться со статусом 1.
Теперь проверим наоборот: является ли <commit-hash-3> предком <commit-hash-4>?
git merge-base --is-ancestor <commit-hash-3> <commit-hash-4>
echo $?
Эта команда проверяет, является ли <commit-hash-3> предком <commit-hash-4>. Смотрим на граф, родителем <commit-hash-4> является <commit-hash-3>. Поэтому <commit-hash-3> является предком <commit-hash-4>. Команда должна завершиться со статусом 0.
Это демонстрирует, как можно использовать команду git merge-base --is-ancestor для программной проверки связи между любыми двумя коммитами в истории вашего репозитория, даже между коммитами разных веток.