Как я могу узнать, какие коммиты Git вызывают конфликты?
Я объединяю вышестоящие изменения в моем проекте, и недавно было много коммитов, которые создали много конфликтов слияния. Нет смысла пытаться разрешить их все сразу.
Как я могу узнать, какие коммиты создают конфликт? Любое из следующего является приемлемым:
- Способ заставить Git прекратить слияние, как только он обнаружит конфликт
- Способ заставить Git перечислять все коммиты, которые конфликтовали, в хронологическом порядке
- Все остальное, что позволяет мне разрешать конфликты один за другим, в хронологическом порядке, что не предполагает слияния нескольких коммитов одновременно в надежде наткнуться на конфликты.
4 ответа
Вы можете дать git imerge попытку: он будет применять ваши коммиты один за другим, давая вам возможность постепенно делать перебазирование (то есть вы можете начать перебазирование, прервать его, возобновить позже!).
Здесь вы можете увидеть сравнение между инкрементным слиянием и прямым слиянием с ребазингом.
У Майкла Хаггерти также есть инструмент под названием git-mergemate
это имеет find-conflict
команда:
git-mergemate find-conflict BRANCH1..BRANCH2
Используйте разделение пополам для определения самого раннего коммита
BRANCH2
что вызывает конфликт при объединении сBRANCH1
, На самом деле не сохраняйте никаких слияний.
git-mergemate find-conflict BRANCH1...BRANCH2
Используйте разделение пополам, чтобы найти пару самых ранних коммитов (по одному из каждой ветви), которые не сливаются чисто. На самом деле не сохраняйте никаких слияний.
git imerge
может использоваться для постепенного слияния и разрешения конфликтов по пути, хотя он не имеет эквивалента find-conflicts
в git-mergemate
,
Вы можете использоватьчтобы увидеть все конфликтующие коммиты при попытке объединить другую ветку с текущей веткой.
# find all conflicted files
git merge --no-commit --no-ff other_branch | grep "CONFLICT"
# find all commits from 'other_branch' that causes the conflicts
git log --merge | grep commit
# abort "--no-commit" command above, because we only want to test and see
git merge --abort
Он будет производить что-то вроде:
commit bb713a4f01e4e55a2b297f7facf962090c11687f
commit 280d44bd8a569108319080633714fa8398eab3c4
commit 3a99961983f5d3ef4508d2a8457309f779650f68
commit 87239c7fef291206063e2c840270298556ee0ef4
commit f4e27e2d5753a9eaf375da66bc8a3d589a22ba23
commit c4365a21bb85a43f227047ecdda789320aa12918
commit 78572542cf08eb8d61a40b20c12cf11357eeb3df
commit cfbc6ffe334ed5748bd3988d3b48ab42a48eeb6a
commit 88a273099afb49b968ebf4c0c3602a334ef0b2d8
выполнениеgit log --merge
без запуска слияния(git merge
) выдаст следующую ошибку:
fatal: --merge without MERGE_HEAD?
Эта команда может быть выполнена только в процессе слияния.
Есть ли причина, по которой вы не захотите просто rebase
(не в интерактивном режиме) синхронизироваться с изменениями в восходящей ветви? Он остановится, если при каждом коммите возникнет конфликт, а затем вы сможете возобновить перебазирование после его разрешения. Это похоже на постепенное слияние, и оно встроено прямо в Git, нет необходимости во внешнем плагине / инструменте:
git fetch <remote>
git rebase <remote>/<upstream-branch>
# Conflict on commit X, resolve conflict, then continue the rebase
git rebase --continue
Предупреждение о принудительном нажатии на переписанные коммиты
Обратите внимание, конечно, что перебазирование вашей локальной ветки изменит идентификаторы ша для его коммитов. Если вы уже передали коммиты, которые хотите перебазировать, на свой пульт, то вам придется принудительно пересылать новые коммиты, чтобы перезаписать старые, что может представлять потенциальную проблему, если вы делитесь своей веткой с другими людьми., Вы можете узнать больше об этих проблемах в: