获取在git
中作为上次运行的一部分合并的文件列表我有dev_branch&主。开发人员将更改提交到dev_branch。
作为简单发布工作流程的一部分,dev_branch生成的所有通道都合并为master。
作为所需增量部署的一部分,想了解自master上的最后一张图片以来合并了哪些文件集。
很少......
一个。 git diff HEAD^ HEAD
- 只给我一个changeList,但不是所有的changeList更改都合并为master
B中。 git diff --name-only master dev_branch
- 获取我需要的东西,但是一旦合并完成,我就无法运行。
答案 0 :(得分:1)
假设master
为123abc,dev
为321cba。
您的第二个示例相当于合并前的git diff 123abc 321cba
。
合并后,master
现在为456def。
但合并后你仍然可以使用git diff 123abc 321cba
。分支名称指向新的哈希值,但旧的哈希值永远存在。
git log
将为您提供哈希名称,并且可以使用标记来简化。
答案 1 :(得分:1)
您报告的结果表明您正在进行“快进”合并。在合并的一侧没有更改的工作流中,这是默认行为。
当您进行快进合并时,某些知识会丢失 - 例如“先前主提交”的标识。
(我应该澄清 - 以前的主提交的标识应该仍然存在于合并发生的repo的reflog中。合并之后,你可以 - 在同一个repo中 - 说
git diff master master@{1}
得到你想要的东西。但是repos之间不共享reflog - 即push和fetch不会传播它们。而且它们不是永久性的。当refs移动时,它们会改变。它们是从错误中恢复过来的好工具,但我不会让它们成为你“快乐路径”工作流程的一部分。)
“检入开发人员,定期合并到主人”等工作流程的一个关键优势是,您保持了解“之前的主提交是什么”。您可以通过保留分支拓扑来保留这些知识,并通过在合并命令中使用--no-ff
选项来实现这一点
git checkout master
git merge --no-ff dev_branch
现在,git不会将master
ref移动到dev_branch
提示处的现有提交,而是创建一个新的“合并提交”,它将两个历史记录连接起来。生成的内容(TREE
对象)是相同的。
有些人会抱怨这一点,因为他们认为合并提交是“丑陋的”,线性化的历史在美学上更令人愉悦。如果你在这个阵营中根深蒂固,你将不得不使用一个笨拙的解决方案 - 我会提供一些。
但是,如果您希望将dev
分支与maser
分支分开,那么就像使用真正的合并(--no-ff
)然后
git diff master^ master
将开始向您展示您想要的内容。
至于笨拙的解决方案:嗯,如果你坚持使用快进合并,那么你需要的是保留以前主分支的知识。所以你可以使用标签。
git checkout master
git tag -f old_master
git merge dev_branch
git diff old_master master
上述程序并不可怕,但它确实使标签成为常规的一部分。这不是最好的事情,所以你可以使用分支
# 1st time
git checkout master
git branch old_master
git merge dev_branch
git diff old_master master
# subsequent times
git checkout old_master
git merge --ff-only master
git checkout master
git merge dev_branch
git diff old_master master
(请注意,我在推进--ff-only
时使用old_master
;这无关紧要,因为如果您遵循此工作流程,合并将始终默认为快进;使用该标志只会如果不满足这些期望,则导致进程停止并出现错误。)