是否可以确定两个git分支是否会在不影响工作目录的情况下干净地合并?

是否可以确定两个git分支是否会在不影响工作目录的情况下干净地合并?,git,Git,您可以使用git merge base确定是否可以进行快进,但是是否有一些git技巧来确定两个分支是否可以在不进行合并的情况下使用某种策略干净地合并?我知道git merge--no commit--no ff$BRANCH,但这会影响工作目录,我希望避免这种情况,因为这是Web服务的一部分。没有内置方式;执行合并需要工作树。看看合并是否有效(在一般情况下)意味着尝试该策略,看看会发生什么 但是,您可以检查一个简单的情况:这两个分支不接触相同的文件。找到合并基,然后检查git diff--nam

您可以使用git merge base确定是否可以进行快进,但是是否有一些git技巧来确定两个分支是否可以在不进行合并的情况下使用某种策略干净地合并?我知道git merge--no commit--no ff$BRANCH,但这会影响工作目录,我希望避免这种情况,因为这是Web服务的一部分。

没有内置方式;执行合并需要工作树。看看合并是否有效(在一般情况下)意味着尝试该策略,看看会发生什么

但是,您可以检查一个简单的情况:这两个分支不接触相同的文件。找到合并基,然后检查
git diff--name only$merge\u base branchA
git diff--name only$merge\u base branchB
是否有任何共同之处


否则,您将需要一个工作树来尝试合并。您可以很容易地创建第二个存储库—或者克隆存储库,或者为了节省空间,只需创建一个工作树。脚本(来自git.git的contrib目录)可以帮助实现这一点;它创建了一个新的repo,其
.git
目录中充满了返回原始repo的符号链接。只需小心,在新的工作目录中,您不会修改原始回购已签出的分支-它们将失去同步,就像推入当前已签出的分支会把事情搞砸一样。

如果不影响工作目录,您不能这样做,但您可以在不影响当前更改的情况下这样做

git stash
git merge ... 
呜呜声


将为您提供所需的信息。

我将通过创建第三个临时分支来实现这一点。 假设您要将分支
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
这样,您就可以在不拧任何分支的情况下获得准确的结果。

TLDR 假设您的合并“目标”已签出,即
,并且您的合并“源”是
$BRANCH

git merge-tree `git merge-base $BRANCH HEAD` HEAD $BRANCH | grep "^<<<<<<<\|changed in both"
上面应该为提交输出一个散列值;调用该值
$merge\u base

下一步:

上述内容应将“琐碎的合并结果和冲突的阶段”输出到标准输出

如果
HEAD
已经是有关
$BRANCH
的最新版本,则应该没有输出

如果存在合并冲突,则输出应包含Git冲突标记。您可以使用以下命令确定是否存在任何问题:

git merge-tree $merge_base HEAD $BRANCH | grep "^<<<<<<<"
以上所有命令作为(Bash)一行程序:

git merge-tree `git merge-base $BRANCH HEAD` HEAD $BRANCH | grep "^<<<<<<<\|changed in both"

git合并树`git merge base$BRANCH HEAD`HEAD$BRANCH | grep“^另一种常见情况是,其中一个分支包含另一个分支。您可以使用
git branch--contains branchB'检查当前分支是否完全包含
branchB`分支。@Haralan如果您正在执行我建议的检查,并且一个分支包含另一个分支,合并基数将等于该分支,因此您可以立即注意到,否则diff将是空的,并且与另一个不重叠。
git merge tree
命令将“显示三方合并而不触及索引”,这基本上与您的所有答案相矛盾。我同意,“创建备份临时分支并查看”方法经常被忽略。好的答案这肯定会影响工作目录。上面的答案可以引导你找到一个非常强大的一行程序,这里我提供了jakub.g关于链接答案的一个结论的摘要。假设您在branch
master
上,并且希望检查
git merge origin/devel
是否可以工作。然后只需执行:
git merge tree`git merge base origin/devel master`master origin/devel
。但这一行比它看起来更强大,因为您也可以在未签出的分支上执行此操作。强大的另请参见带有三棵树的
git read tree-m
(在
git merge base
的文档中提到)。
git merge-tree $merge_base HEAD $BRANCH
git merge-tree $merge_base HEAD $BRANCH | grep "^<<<<<<<"
git merge-tree $merge_base HEAD $BRANCH | grep "changed in both"
git merge-tree `git merge-base $BRANCH HEAD` HEAD $BRANCH | grep "^<<<<<<<\|changed in both"