Git:为什么我必须提交其他人的更改



我想许多人更习惯于SVN而不是与Git混淆,所以也许有人可以澄清。

我提交并将一些更改推向GIT存储库。我一段时间没有做任何事情。同时,其他人承诺并推动他们的变化。然后,我尝试进行他们的更改,而我无法做到这一点,因为git status表明我必须提交一些不是我的更改。这是什么意思?当我进行这些更改时会发生什么?我应该使用什么样的提交信息?

显然,"提交"的git概念与我习惯的SVN概念有很大不同,您只需 update即可获得其他人的更改,并仅提交自己的更改。

目前尚不清楚您将在哪里出错(您没有给我们足够的信息),但我应该在这里指出两件事:

  1. 您的git存储库和工作目录就是: yours 。任何更改都是更改 you 要求的。您可能根本没有意识到(尤其是如果您开始使用某些更晦涩的git功能)。

    当然,SVN也是如此,但这使我成为...

  2. 虽然git和svn 都可以给您"整个存储库"。查看,SVN鼓励(或至少没有主动劝阻)一次"一个文件"操作模式。这在git(在某种程度上)是可能的,但这不是一个好主意,因为您将与Git的总体推力作斗争,这是"一次性的所有存储库"查看。

听起来好像是通过要求git检查较旧的提交而遇到了麻烦,但整个较旧的提交:

$ git checkout master@{1.week.ago}

这将为您提供整个存储库(进入您的工作目录),此时您可以根据需要检查单个文件。 1 ,但是如果您只想查看一个特定文件,例如foo.txt,您可能会很想这样做:

$ git checkout master@{1.week.ago} foo.txt

我不会说"从不这样做"下一个承诺匹配1周前的方式。

特别是,git具有"索引"。(aka; quot"登台区域"; quot; quot of enver; quot; quot;:修改一些文件,将它们添加到索引/阶段,当您对上演安排满意时,您将git commit运行到将该安排变成一个新的,完整的提交。

当您使用 git checkoutgit checkout [rev] path ...)的特定文件(s)形式时,这会告诉git提取文件的旧版本,然后将它们写入索引以及在工作中-树。换句话说,您要git获取文件的旧版本,将其放入工作树中, git add结果。

要摆脱这种情况,请使用 git reset --hard(对此命令以及重新设置要非常小心,即擦除索引和工作树的更改),或git checkout,是最新版本您通过签出旧版本来使您陷入困境的文件中,以将其放回原样。


1 更具体地说,这种形式的git checkout使您拥有"独立的头部":它通过找到其提交ID来检查特定的提交。首先确保它不会覆盖任何现有的工作,然后设置您的索引和工作树以匹配所选的提交,并更新HEAD以保存该提交ID。如果稍后您 git checkout master,git可以告诉您您没有对特定的commit-id进行任何更改,并安全地将您放回分支机构上。如git status所示。因此,这种形式的结帐时代/还原电流是"更安全的"因为您不必确保您不会失去任何工作;git将为您做。

我的猜测是您之前进行了合并,以前导致冲突,而您忘了以提交结论。

然后, git status会告诉您您在树上的未承诺更改,其中包括您通过合并带来的更改。最近的git版本应该告诉你

之类的东西
$ git status
[...]
You have unmerged paths.
  (fix conflicts and run "git commit")

最新更新