所以,假设我在我的本地存储库中处理license.txt
,并对其进行修改。在我提交之前,Susan修改并将其提交到远程存储库。
如果我git fetch
,我的更新究竟发生了什么变化?结果在哪里?
答案 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
之类的消息。这来自于比较master
和origin/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
快速转发给苏珊的改变。现在master
与origin/master
相同。使用git fetch
命令将前两个操作与git pull
结合使用。 git pull
执行git fetch
后跟git merge
或git fetch
执行git rebase
。每个分支都可以配置行为,并且有一个全局选项,用于配置新创建的分支的方式。您可以使用git pull --rebase
或git pull --merge
覆盖行为。
由于未提交本地更改,因此您将无法采取这些集成操作(重新绑定或合并)。 Git希望您先将更改转换为提交。新获取的对象之间没有交互,您可以通过本地更改进行提交。
您现在不必采取任何行动。感谢git fetch
,您可以了解上游活动,而无需立即与它们集成。例如,您可以git log origin/master
查看新内容以及它可能对您的工作产生的影响。但是你可以将它放在一边并继续进行新的提交。