Каков правильный способ проверить, возможно ли выполнить ускоренное слияние с git merge-base?
Я создал bash script, который выполняет следующие задачи:
- Извлечь изменения из восходящего потока;
- Проверьте, возможно ли быстрое слияние,
- Объединить
origin/master
в master
, если # 2 истинно;
- Rebase
master
поверх origin/master
, если # 2 false
Код выглядит следующим образом:
#!/bin/sh
local_branch=$(git rev-parse --symbolic-full-name --abbrev-ref HEAD)
remote_branch=$(git rev-parse --abbrev-ref --symbolic-full-name @{u})
remote=$(git config branch.$local_branch.remote)
echo "Fetching from $remote..."
git fetch $remote
if git merge-base --is-ancestor $local_branch $remote_branch; then
echo 'Fast-forward is possible. Merging...'
git merge --ff-only $remote_branch
else
echo 'Fast-forward is not possible. Rebasing...'
git rebase --preserve-merges $remote_branch
fi
Я тестировал его несколько раз и, похоже, работает, но я не очень уверен в части git merge-base
. Я знаю теорию быстрого слияния, и кажется правильным использовать master
и origin/master
в качестве аргументов для merge-base
, но я не эксперт Git.
Итак, я спрашиваю: правильно ли проверять, возможно ли быстрое слияние сразу после выполнения выборки?
Ответы
Ответ 1
git merge-base --is-ancestor <commit> <commit>
--is-ancestor
Проверяет, является ли первый <commit>
предком второго <commit>
, и завершается со статусом 0, если истина, или со статусом 1, если нет. Ошибки сигнализируются ненулевым статусом, отличным от 1.
например
git merge-base --is-ancestor origin/master master
Ответ 2
Если вы действительно выполните слияние, вы наверняка узнаете! Используйте временную ветку, чтобы в ваших других ветвях ничего не было.
git fetch
git checkout -b tmp_branch master
git merge origin/master
Ваш script должен оценить результат слияния здесь и либо объединить начало/мастер в master, либо не.
И просто удалите временную ветку, когда она не понадобится.
git branch -D tmp_branch
Ответ 3
Команда для проверки, является ли $remote_branch
предком $local_branch
:
test -z "$(git rev-list --max-count 1 $local_branch..$remote_branch)"
Без --max-count 1
в этом списке перечислены все коммиты, находящиеся в $remote_branch
, но не $local_branch
. Поскольку вам интересно только в том случае, если есть такие коммиты и выкидывать выход так или иначе, вы можете добавить --max-count 1
, чтобы немного ускорить работу.
Ответ 4
Да, ваш чек совершенно правильный. Там нет никакой тайны.
Ответ 5
Вы хотите использовать --ff-only
.
git merge origin/master --ff-only
Если есть возможность перемотки вперед, это произойдет автоматически. Если это невозможно, команда потерпит неудачу со fatal: Not possible to fast-forward, aborting.
и вместо этого вы можете запустить команду rebase.