Тестирование коммитов, не являющихся предками друг друга
В предыдущих шагах мы использовали команду 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
для программной проверки связи между любыми двумя коммитами в истории вашего репозитория, даже между коммитами разных веток.