我有一个git分支(例如主线),我想合并到另一个开发分支中。还是我?

为了决定我是否真的想合并这个分支,我想看一些合并将做什么的预览。最好能够查看正在应用的提交列表。

到目前为止,我能想到的最好的是合并-no-ff -no-commit,然后diff HEAD。


当前回答

添加到现有的答案,可以创建一个别名来显示合并之前的差异和/或日志。许多答案省略了在“预览”合并之前首先要做的取回;这是一个将这两个步骤合并为一个步骤的别名(模拟类似于mercurial的hg传入/传出)

所以,在“git log ..”,您可以在~/中添加以下内容。gitconfig:

...
[alias]
    # fetch and show what would be merged (use option "-p" to see patch)
    incoming = "!git remote update -p; git log ..@{u}"

为了对称,可以使用以下别名来显示在push之前提交和将被push的内容:

    # what would be pushed (currently committed)
    outgoing = log @{u}..

然后你可以运行“git incoming”来显示大量的更改,或者“git incoming -p”来显示补丁(即“diff”),“git incoming -pretty=oneline”,用于简短的摘要,等等。然后你可以(选择性地)运行“git pull”来合并。(不过,因为你已经获取了,合并可以直接完成。)

同样,“git outgoing”显示了如果你要运行“git push”,将会推送什么。

其他回答

这里的大多数答案要么需要一个干净的工作目录和多个交互步骤(不利于脚本编写),要么并不适用于所有情况,例如,过去的合并已经将一些突出的更改带入了目标分支,或者选择做同样的事情。

要真正了解如果你将开发合并到主分支中会发生什么变化,现在:

git merge-tree $(git merge-base master develop) master develop

因为这是一个管道命令,它不会猜测你的意思,你必须明确。它也不着色输出或使用您的分页器,所以完整的命令将是:

git merge-tree $(git merge-base master develop) master develop | colordiff | less -R

——https://git.seveas.net/previewing-a-merge-result.html

(感谢David Normington提供的链接)

注:

如果你会得到合并冲突,他们会在输出中显示通常的冲突标记,例如:

$ git merge-tree $(git merge-base a b ) a b 
added in both
  our    100644 78981922613b2afb6025042ff6bd878ac1994e85 a
  their  100644 61780798228d17af2d34fce4cfbdf35556832472 a
@@ -1 +1,5 @@
+<<<<<<< .our
 a
+=======
+b
+>>>>>>> .their

用户@dreftymac提出了一个很好的观点:这使得它不适合编写脚本,因为您不能轻易地从状态代码中捕获它。根据不同的环境,冲突标记可能有很大的不同(删除vs修改,等等),这也使得grep很难实现。要小心了。

I do not want to use the git merge command as the precursor to reviewing conflicting files. I don't want to do a merge, I want to identify potential problems before I merge - problems that auto-merge might hide from me. The solution I have been searching for is how to have git spit out a list of files that have been changed in both branches that will be merged together in the future, relative to some common ancestor. Once I have that list, I can use other file comparison tools to scout things out further. I have searched multiple times, and I still haven't found what I want in a native git command.

以下是我的解决方案,希望对其他人有所帮助:

在这个场景中,我有一个名为QA的分支,自上一个产品发行版以来,它有许多更改。我们的最后一个产品版本被标记为“15.20.1”。我有另一个名为new_stuff的开发分支,我想合并到QA分支中。QA和new_stuff都指向“跟随”(由gitk报告)15.20.1标记的提交。

git checkout QA
git pull
git diff 15.20.1 --name-only > QA_files
git checkout new_stuff
git pull
git diff 15.20.1 --name-only > new_stuff_files
comm -12 QA_files new_stuff_files

下面是一些关于为什么我对这些特定文件感兴趣的讨论:

我如何信任Git合并?

https://softwareengineering.stackexchange.com/questions/199780/how-far-do-you-trust-automerge

添加到现有的答案,可以创建一个别名来显示合并之前的差异和/或日志。许多答案省略了在“预览”合并之前首先要做的取回;这是一个将这两个步骤合并为一个步骤的别名(模拟类似于mercurial的hg传入/传出)

所以,在“git log ..”,您可以在~/中添加以下内容。gitconfig:

...
[alias]
    # fetch and show what would be merged (use option "-p" to see patch)
    incoming = "!git remote update -p; git log ..@{u}"

为了对称,可以使用以下别名来显示在push之前提交和将被push的内容:

    # what would be pushed (currently committed)
    outgoing = log @{u}..

然后你可以运行“git incoming”来显示大量的更改,或者“git incoming -p”来显示补丁(即“diff”),“git incoming -pretty=oneline”,用于简短的摘要,等等。然后你可以(选择性地)运行“git pull”来合并。(不过,因为你已经获取了,合并可以直接完成。)

同样,“git outgoing”显示了如果你要运行“git push”,将会推送什么。

Git log currentbranch..otherbranch会给你一个提交列表,如果你进行合并,这些提交将会进入当前分支。log的常用参数提供了提交的详细信息,将为您提供更多信息。

Git diff currentbranch otherbranch会给你两个提交之间的差异,这将成为一个。这将是一个diff,它给出所有将被合并的东西。

这些有帮助吗?

Pull Request——我已经使用了大部分已经提交的想法,但我也经常使用的一个想法是(尤其是来自其他开发人员的想法)做一个Pull Request,它提供了一种方便的方法,可以在合并发生之前检查所有的更改。我知道这是GitHub不是git,但它肯定是方便的。