Git合并可以消除变更,如何处理它

时间:2017-04-14 11:40:53

标签: git merge

在合并提交创建期间。如果有任何变化没有上演并留在合并提交之外。(这确实发生了,并且当有人不知道他在做什么时会发生很多事情,只是盲目地输入那些神秘命令。或者由于错误点击在GUI git工具上。[他们是非技术人员,我们试图教他们,但失败。我们让他们使用git,以便他们可以轻松更新文件并保持最新。]) 然后变化​​消失了。合并提交没有this change is undoed个消息。它只是没有出现在合并提交中。进行更改的提交具有有关更改的信息。但是在合并之后,实际上撤消了更改而没有跟踪。

这很可怕,我们不能依赖合并提交信息来告诉已经更改/撤消的内容。事实上,这并不容易说出来。

解决这个问题的一种方法是限制将合并到主服务器的能力限制为值得信赖的维护者。但作为一个快速发展的迷你群体,这会增加维护者的负担并减慢我们的速度。

我想知道是否有人强制执行合并提交以包含有关实际还原但未记录的更改的信息?

或者我可以完全禁止合并操作,只允许rebase确保明确记录所有更改吗?

1 个答案:

答案 0 :(得分:3)

没有自动化源工具可以完全万无一失,因为傻瓜太聪明了。 : - )

我认为大多数人确实应该经常变换而不是合并(即,我认为是git pull的默认操作,即在运行git merge后运行git fetch,是错的)。但这不是“人们合并错误”问题的解决方案,因为重新定位合并!具体来说,要“重新提交”提交,您复制提交,就像使用git cherry-pick一样。通常这是小而简单的,不需要任何花哨的合并工作,但有时它会出错,你最终会完全融合。因此,如果人们想要合并错误,他们也可能错误地获得自己的rebase - 当你重新提交多次提交时,每次提交都会被复制,因此每个提交都是潜在的合并。

这意味着解决此问题的唯一方法是学习如何合并。我将不得不将这种指令留给其他人,但我会注意到可以看看合并带来的变化,关于作为分支之前的提交的提交合并。

假设您有两个分支,例如,这一系列提交:

...--o--*--A-----B---C   <-- master
         \
          D--E--F--G--H   <-- feature/X

当您使用git merge feature/XM上创建新的合并提交master时,您将使用两个父级获得新的提交:

...--o--*--A-----B---C--M   <-- master
         \             /
          D--E--F--G--H   <-- feature/X

这个新提交有自己独立的源代码树,就像任何提交一样。

在你的问题中,你说:

  

这是可怕的,我们不能依赖合并提交信息来告诉已经更改/撤消的内容。事实上,没有简单的方法可以说明。

是!提交M(无论其实际的哈希ID是什么)都有两个父项。这两个父母中的一个是“之前在分支上的内容”,即提交C。如果您想查看从提交C到提交M的更改内容,只需让Git向您显示

git diff <hash-id-of-C> <hash-id-of-M>

git diff的输出与任何 git diff的输出相同:它是一组说明,向您展示如何将提交的内容视为{{ 1}},并修改它以使提交的内容为C

如果您愿意,您也可以让Git为您制作一套说明,向您展示如何将提交的内容作为M,并修改它以使提交的内容为H

M

与任何git diff <hash-id-of-H> <hash-id-of-M> 一样,输出是一组指令:“如何获取第一次提交中的内容并将其更改为第二次提交中的内容。”

有一种简单的方法可以查看这些

git diff这是正确的,它通常显示从“父提交”到“子提交”-eg的差异,git log -pA的差异,或{{1 vs B - 在应用于合并提交时不显示任何内容。但是:

B

运行两个 C命令,每个父命令一个,并显示两个。将git show -m <hash-id-of-M> 视为“显示合并”或甚至“拆分合并(分成两个差异)”。 git diff中也可以使用-m标记

-m

显示每次提交,一次一个,作为简单差异(如果它不是合并)或简单差异的(如果它是合并,有两个父母)。 / p>

(当然,还有一些方法可以获得这两个中的一个,但这个答案已经足够长了。)