我有一个git分支(例如主线),我想合并到另一个开发分支中。还是我?
为了决定我是否真的想合并这个分支,我想看一些合并将做什么的预览。最好能够查看正在应用的提交列表。
到目前为止,我能想到的最好的是合并-no-ff -no-commit,然后diff HEAD。
我有一个git分支(例如主线),我想合并到另一个开发分支中。还是我?
为了决定我是否真的想合并这个分支,我想看一些合并将做什么的预览。最好能够查看正在应用的提交列表。
到目前为止,我能想到的最好的是合并-no-ff -no-commit,然后diff HEAD。
当前回答
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
其他回答
如果你已经获取了更改,我最喜欢的是:
git log ...@{u}
这需要git 1.7。x我相信。@{u}符号是上游分支的“速记”,因此它比git log…origin/master更通用。
注意:如果你使用zsh和扩展的glog,你可能需要做一些类似的事情:
git log ...@\{u\}
也许这个能帮到你? git-diff-tree -比较通过两个树对象找到的blob的内容和模式
这里的大多数答案要么需要一个干净的工作目录和多个交互步骤(不利于脚本编写),要么并不适用于所有情况,例如,过去的合并已经将一些突出的更改带入了目标分支,或者选择做同样的事情。
要真正了解如果你将开发合并到主分支中会发生什么变化,现在:
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很难实现。要小心了。
我尝试了这个东西来检查visual studio代码中的更改。
从dev创建一个临时分支。然后合并你用——no-ff——no-commit标记修改了文件的分支。
git checkout dev
git checkout -b feature_temp
git merge feature --no-ff --no-commit
特性分支的更改文件将反映在feature_temp分支中。
添加到现有的答案,可以创建一个别名来显示合并之前的差异和/或日志。许多答案省略了在“预览”合并之前首先要做的取回;这是一个将这两个步骤合并为一个步骤的别名(模拟类似于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”,将会推送什么。