我从我的远程服务器克隆的本地机器上有一个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
一切正常,但我脑海中只有这个唠叨的问题,无论我是否在设置回收箱时没有犯错误,或者这是否正常...
感谢您的总结。我仍然试图让我的头脑围绕着Git的来龙去脉,所以这有助于为我清除一些事情。 – mtnorthrop 2011-03-12 17:09:26
@mtnorthrop:我不会责怪你被这个困惑。我知道Git非常好,当它这样做时,它并没有更新相应的远程追踪分支,这似乎仍然很奇怪。 – Cascabel 2011-03-12 23:41:56
我同意这在大多数情况下可能是违反直觉的,但'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