如果可以快进,你可以用git merge-base来确定,但是有没有一些git技巧可以确定两个分支是否会与一些策略完全合并而不实际进行合并?我知道git merge --no-commit --no-ff $BRANCH
,但这会影响工作目录,我想避免这样做,因为这是网络服务的一部分。
答案 0 :(得分:29)
我会通过创建第三个临时分支来实现此目的。
假设您要将分支branchFrom
合并到branchTo
中。它会像这样:
git checkout branchTo #only if not already at branchTo
git checkout -b branchTmp
git merge branchFrom
# see what happens
git checkout branchTo
git branch -d branchTmp
# act accordingly
通过这种方式,您可以在不拧紧任何分支的情况下获得准确的结果。
答案 1 :(得分:9)
没有内置的方式;执行合并需要工作树。看看合并是否有效(在一般情况下)意味着尝试策略并看看会发生什么。
然而,您可以检查琐碎的情况:两个分支不接触相同的文件。找到合并基础,然后检查git diff --name-only $merge_base branchA
和git diff --name-only $merge_base branchB
是否有任何共同点。
否则,您将需要一个工作树来尝试合并。您可以轻松地创建第二个 - 克隆存储库,或者为了节省空间,只需创建一个工作树。 git-new-workdir
脚本(来自git.git的contrib目录)可以帮助解决这个问题。它创建了一个新的repo,其.git
目录中的符号链接已回到原始目录。请注意,在新的工作目录中,您不会修改原始仓库已检出的分支 - 它们将会失去同步,就像推入当前已检出的分支一样混乱。
答案 2 :(得分:7)
假设您的合并“目标”已签出,即HEAD
,并且您的合并“来源”为$BRANCH
:
git merge-tree `git merge-base $BRANCH HEAD` HEAD $BRANCH | grep "^<<<<<<<\|changed in both"
假设您的合并“目标”已签出,即HEAD
,并且您的合并“来源”为$BRANCH
,则首先"find as good common ancestors as possible for a merge":
git merge-base $BRANCH HEAD
上面应输出提交的哈希值;称该值为$merge_base
。
接下来,"show three-way merge without touching index":
git merge-tree $merge_base HEAD $BRANCH
上面应该输出“平凡的合并结果和标准输出的冲突阶段”。
如果HEAD
已经与$BRANCH
保持同步,则应该没有输出。
如果存在合并冲突,则输出应包含Git冲突标记。您可以使用以下命令确定是否存在:
git merge-tree $merge_base HEAD $BRANCH | grep "^<<<<<<<"
您还可以查找“两者都已更改”的文字:
git merge-tree $merge_base HEAD $BRANCH | grep "changed in both"
以上所有命令都作为(Bash)单行:
git merge-tree `git merge-base $BRANCH HEAD` HEAD $BRANCH | grep "^<<<<<<<\|changed in both"
这是从this answer改编为这个问题:
答案 3 :(得分:1)
如果不影响工作目录,则无法执行此操作,但您可以在不影响当前更改的情况下执行此操作。
git stash
git merge ...
woops
git reset --hard HEAD
git stash apply
将为您提供所需的信息。