git fetch'在哪里?放置自己?

时间:2014-12-18 20:11:37

标签: git

所以,假设我在我的本地存储库中处理license.txt,并对其进行修改。在我提交之前,Susan修改并将其提交到远程存储库。

如果我git fetch,我的更新究竟发生了什么变化?结果在哪里?

2 个答案:

答案 0 :(得分:4)

您的更新没有任何变化。 git fetch,由于缺少更好的词,从远程存储库中提取提交并将它们放在对象数据库的本地副本中。由于您在自己的分支上工作,因此它们之间没有任何交互,直到您明确选择进行某些交互,例如通过变基,挑选樱桃等。

您可以通过查看各自的分支(例如origin/master)来访问提取的提交。

答案 1 :(得分:3)

git fetch不会更改工作树的状态。实际上,它不需要工作树:git fetch可以在裸存储库(没有工作树的存储库)中工作。

Susan的提交在她的存储库中生成一个新对象。在执行提取之前,您的工作区中不知道该对象。此时,该对象在您的空间中可用。因为该对象是由它的散列标识的,这是一个非常大的整数,所以它几乎肯定与你已经拥有的任何其他对象不同(不会发生冲突)。

除了获取新提交之外,git fetch还将更新远程分支指针。例如,假设Susan的master分支和你的分支在Susan的提交之前完全相同。在Susan的提交之后,她的分支有一个新的提交,你的没有。当您执行git fetch时,您的本地origin/master分支指针会更新,以指示其头部现在是Susan的提交。但是,您的本地master分支保持不变。

此时您可以运行git checkout(没有参数),您将收到branch master is behind origin/master by 1 commit and can be fast-forwarded之类的消息。这来自于比较masterorigin/master

现在,您可以通过以下几种方式与Susan的变化进行整合:

  • git rebase:在master的新更改之上挑选仅在您的本地origin/master中的更改(从而重写其历史记录),并将结果设为新的本地HEAD上的master。在此之后,master严格地位于origin/master之前:它与origin/master相同,加上您的更改。
  • git merge:保持您的更改不变,并在master上生成一个新的提交,将其折叠并合并。此提交有两个父项:上一次提交master(在本例中为Susan的提交)以及您原始形式的本地提交系列中的最后一次提交。同样,master现在严格地领先于origin/master
  • git reset --hard origin/master:为了表彰苏珊的承诺让你的所有作品都过时了,你就把你的工作扔掉,然后将当地的master快速转发给苏珊的改变。现在masterorigin/master相同。

使用git fetch命令将前两个操作与git pull结合使用。 git pull执行git fetch后跟git mergegit fetch执行git rebase。每个分支都可以配置行为,并且有一个全局选项,用于配置新创建的分支的方式。您可以使用git pull --rebasegit pull --merge覆盖行为。

由于未提交本地更改,因此您将无法采取这些集成操作(重新绑定或合并)。 Git希望您先将更改转换为提交。新获取的对象之间没有交互,您可以通过本地更改进行提交。

您现在不必采取任何行动。感谢git fetch,您可以了解上游活动,而无需立即与它们集成。例如,您可以git log origin/master查看新内容以及它可能对您的工作产生的影响。但是你可以将它放在一边并继续进行新的提交。