关于GIT PULL请求功能的问题



我在GIT拉取过程中有一个问题。

比方说,我正在处理名为";Program.java";。(假设我最初从远程克隆了repo)。完成更改后,我会将它们提交到本地存储库中。

与此同时,当我在当地工作时,有人更新了相同的文件";Program.java";在远程分支中。另一个人所做的改变是,在文件末尾添加了一些行。我在本地所做的更改是,在文件的开头添加了几行。

现在,当我调用"git pull"时,git会无声地快速推进本地和远程分支之间的合并!!

这是不对的。不是吗?理想情况下,它应该显示出冲突。因为,有人远程修改了同一个文件,而我认为Program.java文件中没有修改任何内容。

当我测试这个程序(program.java)时,我意识到在远程发生了一些修改,最后我抓到了那个家伙谁执行了更新并更正了我的文件。

这是危险的,而git,相当快的合并,应该已经显示出冲突。这会在我感觉到其他人的更新之前提醒我。

有人能告诉我为什么在GIT会发生这种事吗。

注意:如果远程和本地分支之间更新了同一行,Git会显示冲突,这正是预期的。

提前谢谢。

Git认为相距遥远但在同一文件中的两行彼此独立,就像不同文件中的这两行一样。

想象一下以下情况:

开发人员A从文件bar的开头删除函数foo,而开发人员B将该文件末尾的代码更改为使用函数foo

Git会很高兴地合并这些更改,因为它们不会碰到相同的行。然而,仍然存在冲突,因为代码现在使用了一个已删除的函数。但同样的情况也可能发生在两个不同的文件中。

考虑以下非常相似的情况:

开发人员A从文件library中删除函数foo,而开发人员B将文件bar中的代码更改为使用library中的函数foo

Git还将在不冲突的情况下合并这两个更改,因为这些更改在不同的文件中,所以没有人会对此提出异议。然而,我们仍然有同样的冲突,代码现在正在调用一个已删除的函数。

所以只有两个极端的选择:

  • 假设每一行都依赖于其他文件中的每一行,因此不允许在没有冲突的情况下进行合并
  • 只有在绝对必要的情况下,即当相同的行被更改时,才显示冲突

重要的是要记住,git不报告冲突并不意味着没有冲突。和其他开发人员交流,在合并时阅读他们的更改,并确保您有(最好是自动的)测试。

首先,您需要对负责。你说git pull。这意味着";获取并合并";。因此,当Git正是这样做的时候,你几乎不能抱怨,如果你不想发生这种情况,你就不应该这么说。

就我个人而言,我从未说过pull,正是因为这个原因:它对你的分支有影响,谁知道它会是什么?我宁愿有机会知道Git可能会对我的分支做什么,而不需要实际做,直到我知道它是什么。

所以,假设我们在分支mybranch上。我说

git fetch
git status

现在Git告诉如果我将CCD_ 12合并到CCD_;"前方";,以及这是否会是一个快进。

如果我仍然有疑问,我可以使用git diff来比较myorigin/mybranchmybranch,看看它们之间的区别。

如果这将是一个快速的前进,我对如果它被执行会发生什么感到高兴,我现在说

git merge --ff-only

并且执行快进。


但不是那么快。什么是快进?这根本不是真正的合并。只有在您的分支和远程分支在上次提交之前完全匹配的情况下才能完成,然后在远程分支上还有一些额外的提交:

A -- B -- C -- D (the remote mybranch)
A -- B (your mybranch)

在这种情况下,Git只需将C和D附加到mybranch中。没有混乱,没有大惊小怪。没有造成任何伤害。毕竟,这些都是干净的单独提交,而且确实有人在远程添加了它们,所以Git认为当你合并时,你说你想要它们是正确的。

如果出于某种原因,Git对你想要的东西是错误的,并且你后悔在分支中添加了C和D,那么就撤消合并:

git reset --hard <SHA of B>

(有关遗憾的更多信息,请参阅我的https://stackoverflow.com/a/59675191/341994.)


最后,让我们谈谈你在问题中说了什么。你说你在本地做了一些更改并提交,其他人在同一文件中做了一些修改并在远程提交。但是你说git pull做了一个快进那不是真的。如果你有远程没有的更改,Git将而不是快进;它不能。它将执行真正的合并

这就是为什么,当我进行合并时,我说--ff-only。这样,如果我们陷入了你描述的情况,什么都没发生——我们告诉Git,";如果出现问题,并且有人在远程上向mybranch添加了提交,则根本不要合并"这正是你希望你告诉Git的。

最新更新