我正在合并一个可能存在很多冲突的远程分支。我如何知道它是否会有冲突?
我没有在git-merge
中看到像--dry-run
这样的选项。
我正在合并一个可能存在很多冲突的远程分支。我如何知道它是否会有冲突?
我没有在git-merge
中看到像--dry-run
这样的选项。
如之前所述,传入--no-commit
标志,但为了避免快速向前合并提交,还要传入--no-ff
,就像这样:
$ git merge --no-commit --no-ff $BRANCH
检查暂存区中的更改:$ git diff --cached
即使是快进式合并,您也可以撤销合并:
$ git merge --abort
0
。 - Ciro Santilli OurBigBook.comgit checkout .
不会将文件恢复到合并前的状态。 - J-bobgit merge --abort
命令来取消合并。 - J-bobgit diff --cached
(或--staged
)仅显示这些更改。 - Ti Strga我刚刚实现了一个自动查找仓库和远程之间冲突的方法。该解决方案在内存中执行合并操作,因此不会影响索引或工作树。我认为这是解决这个问题最安全的方式。以下是它的工作原理:
git fetch origin master
git merge-base FETCH_HEAD master
git merge-tree mergebase master FETCH_HEAD
(mergebase 是上一步 merge-base 命令输出的十六进制 id)现在假设你想要将远程的 master 分支与本地的 master 分支合并,但你也可以使用其他分支。git merge-tree
将在内存中执行合并,并将结果打印到标准输出。搜索包含<<
或 >>
模式的行。或者你可以将输出打印到文件中进行检查。如果你发现一行以 'changed in both' 开头,则很可能存在冲突。
git merge-tree \
git merge-base FETCH_HEAD master` FETCH_HEAD master`。 - jakub.ggit merge-tree `git merge-base clieop master` clieop master | grep -A3 "changed in both"
简直太棒了! +100 - Rudie+<<<<<<< .our
开头的冲突标记进行grep匹配。因此,我使用类似于grep -q '^+<* \.our$'
的grep表达式。 - Guygit merge-tree $(git merge-base $1 $2) $1 $2 | sed -n '/+<<<<<<< .our/,/+>>>>>>> .their/p;/^changed in both/{n;N;N;s/^/#/mg;p}' | cdiff
。它可以提取“changed in both”行以及冲突部分。 - MvG我假设你只是想在尝试合并之前先了解一下会遇到多少麻烦...如果合并失败后重置为最后一次提交,那么这个过程就相对容易,如果这是预期的方法,我也不会感到惊讶。
话虽如此,如果你真的不想触碰工作树中现有的文件 - 你可以创建一个补丁并将其与目标分支进行测试。这样做的好处是能够清楚地显示对哪些文件进行了哪些更改 - 只需在文本编辑器中打开补丁文件即可。
git checkout -b mycrazybranch
[change some stuff...]
git add .
git commit -m "changed some stuff"
git format-patch master --stdout > crazy.patch
git checkout master
git apply crazy.patch --check
[all good! cleanup...]
rm crazy.patch
正如你所看到的,这将创建一个补丁文件,然后可以使用 --check 进行测试,查看是否有任何错误,然后删除该补丁文件。
git format-patch master --stdout | git-apply --check -
这个命令可以实现相同的效果。请注意,不要改变原文意思。 - Penzgit-apply
不能工作。它应该改为使用 git apply
。 - yunzen当发现有冲突时,您可以执行 git merge --abort
命令来中止合并操作。
git merge other-branch --no-commit --no-ff; git merge --abort
看起来效果不错。 - seanf总结已有的答案,检查是否存在合并冲突有两种方法:
git format-patch $(git merge-base branch1 branch2)..branch2 --stdout | git apply --3way --check -
注意,在运行上述命令时,你应该处于branch1
分支。
另一种方法:
git merge --no-commit branch2
# check the return code here
git merge --abort
branch1
替换为 HEAD
,您的命令将适用于任何分支。 - Mark Lodato--3way
。 - okdewit我对此的简单暴力解决方案是:
创建“pre-master”分支(从主分支开始)
将您想要合并的所有内容合并到此pre-master分支中。
然后,您可以查看合并情况,而不接触主分支。
无论如何,我会遵循@orange80的建议。
git merge --abort
命令来中止合并,如果已经合并,则可以使用 git reset --hard HEAD~1
命令来回到之前的状态,或者使用 git reset --hard origin/master
命令重置为远程主干。创建另一个分支只是给你一种安全感,但如果你了解 git 的工作原理,就会明白这种恐惧是没有根据的。如果关注的是不改变工作副本,这并不提供任何解决方案。 - Thibault D.git merge --no-commit
不会中止合并。 如果已经合并,则 git merge --abort
无法工作。 如果您想将其编写为脚本,则很尴尬,因为 git merge
没有回复足够好的错误代码来解释不同类型的冲突。 使用新分支可以防止破损的脚本使您的存储库处于需要手动干预的状态。 当然,您什么也不会失去。 但是,否则构建更容易。 - Erik Aronesty我为了做这件事情创建了一个别名,非常方便,操作如下:
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
现在我只是打电话
git mergetest <branchname>
查看是否存在任何冲突。
$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world
编辑:如下面的评论所述,如果您在工作目录或暂存区中有更改,您可能需要在执行上述操作之前将它们藏起来(否则它们将在上面的git reset
之后消失)。
--dry-run
不仅会“简单地检查合并是否可以快进”。它将返回与合并完全相同的输出:文件、冲突等。是否可以快进并不是真正感兴趣的,是吗? - Rudiegit stash; git reset --hard
怎么样?@BrianPhillips - Code Whisperer只需将当前分支与远程分支进行比较,这将告诉您在执行pull / merge操作时会发生什么变化。
#see diff between current master and remote branch
git diff master origin/master
我很惊讶还没有人建议使用补丁。
假设您已经签出了 master
分支,现在您想要测试从 your_branch
合并到 master
的修改:
$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch
这应该能解决问题。
如果你遇到像……这样的错误
error: patch failed: test.txt:1
error: test.txt: patch does not apply
这意味着补丁未成功,合并将产生冲突。没有输出则表示补丁干净,您可以轻松合并分支。
请注意,这不会实际更改您的工作树(除了创建补丁文件之外,但是您可以安全地在此之后删除该文件)。引用 git-apply 文档:
--check
Instead of applying the patch, see if the patch is applicable to the
current working tree and/or the index file and detects errors. Turns
off "apply".
注意:如果有比我更聪明/经验更丰富的git用户,请告诉我我是否错了,以及这种方法是否显示不同于常规合并的行为。看起来很奇怪,在这个问题存在了8年以上的时间里,没有人会提出这个看似显而易见的解决方案。
git diff master your_branch | git apply --check
。 - ks1322