Git merge可以擦除更改,如何处理

Git merge可以擦除更改,如何处理,git,merge,Git,Merge,在合并提交创建期间。如果没有进行任何更改并将其放在合并提交之外。(这种情况确实会发生,并且在有人不太清楚自己在做什么时会发生,只需盲目地键入那些神秘的命令。或者由于错误地单击GUI git工具。)。[他们不是技术人员,我们试图教他们,但失败了。我们让他们使用git,以便他们可以轻松更新文件并保持最新。] 然后更改消失。合并提交将没有此更改已撤消msg。它只是不出现在合并提交中。进行更改的提交包含有关更改的信息。但是合并后,更改实际上已撤消,没有任何跟踪 这太可怕了,我们不能依靠合并提交信息来判断

在合并提交创建期间。如果没有进行任何更改并将其放在合并提交之外。(这种情况确实会发生,并且在有人不太清楚自己在做什么时会发生,只需盲目地键入那些神秘的命令。或者由于错误地单击GUI git工具。)。[他们不是技术人员,我们试图教他们,但失败了。我们让他们使用git,以便他们可以轻松更新文件并保持最新。] 然后更改消失。合并提交将没有
此更改已撤消
msg。它只是不出现在合并提交中。进行更改的提交包含有关更改的信息。但是合并后,更改实际上已撤消,没有任何跟踪

这太可怕了,我们不能依靠合并提交信息来判断哪些内容已被更改/撤消。事实上,没有简单的方法来判断

解决这一问题的一种方法是将合并到master的能力限制在值得信任的维护人员身上。但作为一个快速发展的小型团队,这将给维护人员增加负担,并使我们的速度减慢

我想知道是否有人强制合并提交以包含关于实际已恢复但未记录的更改的信息

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

没有自动源代码工具可以完全防错,因为傻瓜太聪明了。:-)

我认为大多数人确实应该更频繁地重新设置基址而不是合并(例如,我认为
git pull
的默认操作,即在运行
git fetch
之后运行
git merge
,是错误的)。但这并不能解决“人们确实错误地合并”的问题,因为重新设置基址就是合并!具体来说,是“再基地"提交时,您复制提交,就像使用
git cherry pick
一样。通常这是一个小而简单的操作,不需要任何花哨的合并工作,但有时会出错,最终导致完全的合并。因此,如果人们的合并出错,他们可能也会错误地获得自己的回扣,并且当您对多个提交进行回扣时,每个人都会出错提交被复制,因此每个提交都是一个潜在的合并

这意味着这个问题的唯一解决方案是学习如何合并。我将不得不将这类说明留给其他人,但我会注意到,您可以看到合并带来了什么变化,与合并前分支尖端的提交有关

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

...--o--*--A-----B---C   <-- master
         \
          D--E--F--G--H   <-- feature/X
这个新的提交有自己独立的源代码树,就像任何提交一样

在你的问题中,你说:

这太可怕了,我们不能依靠合并提交信息来判断哪些内容已被更改/撤消。事实上,没有简单的方法来判断

但是有!Commit
M
(不管它的实际散列ID是什么)有两个父项。其中一个父项是“之前在分支上的内容”,即Commit
C
。如果您想查看从Commit
C
到Commit
M
的过程中发生了什么变化,只需让Git向您展示:

与任何
git diff
一样,输出是一组指令:“如何获取第一次提交中的内容并将其更改为生成第二次提交中的内容。”

有一种简单的方法可以看到这两种情况 确实,
git log-p
,它通常显示从“父提交”到“子提交”的差异,例如
a
vs
B
,或
B
vs
C
,当应用于合并提交时,不会显示任何差异。但是:

git show -m <hash-id-of-M>
将每次提交显示为一个简单差异(如果不是合并)或一对简单差异(如果是合并,则具有两个父级)


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

仅供参考:“撤消”->“撤消”解决方案1:培训您的同事。您不能将错误使用归咎于该工具……解决方案2:我不明白为什么对master的访问受限会如此缓慢?您认为这会比每隔一天清理一次错误更慢吗?如果每个人都知道如果n,他们的承诺将被拒绝,请不要忘记质量的影响做得不好。。。
git diff <hash-id-of-C> <hash-id-of-M>
git diff <hash-id-of-H> <hash-id-of-M>
git show -m <hash-id-of-M>
git log -m -p