【问题标题】:Why does git stop commit when some other file was changed?当其他文件被更改时,为什么 git 会停止提交?
【发布时间】:2013-08-27 17:36:49
【问题描述】:

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

HelloWorld.java
README.md
pom.xml

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

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

【问题讨论】:

    标签: eclipse git github egit git-commit


    【解决方案1】:

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

    【讨论】:

    • 那么一般的工作流程是在分支上进行更改并在需要时与master 合并?
    • 是的,这就是想法,但对于小型项目,我通常会在推送到主仓库之前提出拉取请求,这更简单。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 2015-04-13
      • 1970-01-01
      相关资源
      最近更新 更多