2011-03-12 42 views
3

我从我的远程服务器克隆的本地机器上有一个Git存储库。我克隆的Git仓库是一个裸仓库。为什么我必须推出我刚刚从Git中的起源中取得的更改?

有一点我仍然困惑的是,当原点发生变化时,我做了git pull origin master来更新我的本地存储库git status然后告诉我,我是X提前提交原点,其中X是提交我刚才拉。

尽管事实上提交日志已经完全相同。

所以我总是做一个git push origin master后,但我只是想知道是否有人可以解释为什么这是必要的,我是否可能不会这样做不正确。

在我看来,如果我只是从原点拉动变化,两个回购应该是相同的。那么,为什么我告诉我,我在原产地之前呢?这是否与它是裸仓库的事实有关?

下面是稍微详细的情况中,为了清楚的缘故:

我有一个远程服务器上的裸git仓库(集线器)。该回购有两个克隆:我的本地计算机上的“dev”和“分段”,与原点位于同一台服务器上。

当我在dev上进行更改时,我将git push origin master它们转换为裸集“中心”回购。然后,我登录到远程服务器cd到“分段”回购,并执行git pull origin master从“集线器”更新“分段”。

完成此操作后,如果我使用git log --pretty=oneline比较集线器和分段提交日志,则可以看到它们完全相同。

但是,如果我在 “临时” 目录做git status我得到如下:

$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

于是我通常做git push origin master从那里,我被告知:

$ git push origin master 
Everything up-to-date 

一切正常,但我脑海中只有这个唠叨的问题,无论我是否在设置回收箱时没有犯错误,或者这是否正常...

回答

5

根据man git-pull

合并到当前分支远程分支next

$ git pull origin next 

这留下的next副本暂时FETCH_HEAD,但不更新任何远程跟踪分支。使用远程跟踪分支,同样可以通过调用提取和合并来完成:

$ git fetch origin 
$ git merge origin/next 

重点是我的。

基本上,Git告诉你,你的更新的主人提前origin/master,这是一个remote tracking branch for master。由于这个跟踪分支没有被git pull origin master更新(如手册页所示),所以在技术上就是。拨打git fetch origin将更新您的远程跟踪分支,然后您可以手动合并该跟踪分支(如第二个手册页示例所示)。

据我所知,如果你不git pull(例如git pull origin)指定一个分支的名字,它会读取.git/config什么,应该读和远程跟踪分支更新。

+0

感谢您的总结。我仍然试图让我的头脑围绕着Git的来龙去脉,所以这有助于为我清除一些事情。 – mtnorthrop 2011-03-12 17:09:26

+0

@mtnorthrop:我不会责怪你被这个困惑。我知道Git非常好,当它这样做时,它并没有更新相应的远程追踪分支,这似乎仍然很奇怪。 – Cascabel 2011-03-12 23:41:56

+1

我同意这在大多数情况下可能是违反直觉的,但'git pull'允许你从*任何*分支拉入当前分支,所以Git不知道要更新哪个远程分支(如果有的话)。在['man git-fetch'](http://www.kernel.org/pub/software/scm/git/docs/git-fetch.html)中有一些额外的解释,在第三个“注释” ''的描述。我也可以同意Git经常会令人困惑! “拥有巨大力量会带来极大的复杂性”,或者类似的东西。 :) – 2011-03-12 23:55:52

1

你是否也在本地进行了更改?如果是这样,那么你的git pull检索远程提交,并产生一个合并提交从当地HEAD下降和originHEAD

+0

不,这是奇怪的事情。即使在本地没有进行任何更改,我也必须这样做。 – mtnorthrop 2011-03-12 16:56:17

相关问题