0

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

HelloWorld.java
README.md
pom.xml

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

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

4

2 回答 2

1

这是因为 git 在您提交更改之前确保您的存储库与主存储库是最新的。问题在于推送不提交。您无法推送到尚未获得所有更改的存储库。您可以做的是使用您的更改创建一个新分支,然后如果您愿意,稍后将其与主分支合并,这是 git 用于您想要做的事情的系统。

于 2013-08-27T17:42:11.980 回答
0

SVN 服务器本身会进行某些类型的合并,特别是当更改是针对不同文件时,如您的情况。由于 SVN 将分支和标签表示为单个树的不同部分,并且单个存储库可以包含多个不相关的项目,这是必要的。

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

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

于 2013-08-27T18:01:39.903 回答