为什么git会在其他文件被更改时停止提交?

时间:2013-08-27 17:36:49

标签: eclipse git github egit git-commit

我在git上有一个项目,假设它有以下文件:

HelloWorld.java
README.md
pom.xml

我使用Github的编辑器编辑/提交README.md;没问题。然后,在使用eGit的eclipse中,我编辑HelloWorld.java,但是当我尝试提交并推送该文件时,我收到错误:non-fast-forward。除非我首先执行Pull,否则我无法提交java文件。为什么会这样?使用SVN我从未遇到过这样的问题。为什么当项目中的其他不相关文件发生变化时,Git不允许我提交文件?我读了this,但我仍然不明白这个问题的基本原理。

顺便说一句,我现在正在master进行所有更改。

2 个答案:

答案 0 :(得分:1)

这是因为在提交更改之前,git确保您的存储库与主服务器保持同步。问题在于推动不提交。您无法推送到尚未获得所有更改的存储库。您可以做的是创建一个包含更改的新分支,并在以后根据需要将其与主服务器合并,即系统git用于您想要执行的操作。

答案 1 :(得分:0)

SVN服务器本身会进行某些类型的合并,尤其是当您根据需要更改不同的文件时。由于SVN将分支和标记表示为单个树的不同部分,并且单个存储库可以包含多个不相关的项目,因此这是必要的。

但是git永远不会在服务器上进行合并。并且由于提交代表整个树,因此即使没有单个文件被需要合并的双方修改,您的情况也是合并。

即使更改仅限于不同的文件,也可以保证它们之间不存在任何文本冲突,但仍然存在语义冲突。想象一下,如果您正在对库函数进行更改,这需要修改所有调用者,并且在推送该更改之前,另一个开发人员会添加一个新文件,其中包含对该函数的新调用。如果该新文件是其他开发人员所做的唯一更改,SVN将允许您提交更改并处理服务器上的合并,即使这会导致代码被破坏。通过要求所有合并都在开发人员控制下发生,git至少可以抓住这种冲突的机会;即使在许多情况下,开发人员可能只是进行自动合并并推送结果而不进行任何检查。