为什么我必须推动我刚刚从Git中删除的更改?

时间:2011-03-12 16:38:31

标签: git

我在本地计算机上有一个Git存储库,我从远程服务器克隆。我克隆的Git存储库是一个裸存储库。

还有一件事让我感到困惑的是,当对原点进行了更改并且我git pull origin master更新了我的本地存储库时,git status然后告诉我我是X提交到原点之前,其中X是我刚提取的提交数。

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

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

在我看来,如果我只是从原点拉出变化,那么两个回购应该是相同的。那么为什么我被告知我的原点呢?这是否与它是一个裸存储库有关?

为了清楚起见,这里有更详细的情况:

我在远程服务器上有一个简单的git repo(hub)。该repo有两个克隆:我的本地机器上的“dev”和“staging”,与原始服务器在同一台服务器上。

当我在dev上进行更改时,我git push origin master将它们发送到裸“hub”仓库。然后我登录到远程服务器cd到“staging”repo并执行git pull origin master以从“hub”更新“staging”。

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

但是,如果我在“staging”目录中执行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

一切都运作正常,但我在脑海中有一个唠叨的问题,我是否在设置回购时没有犯错,或者这是否正常......

2 个答案:

答案 0 :(得分:5)

根据man git-pull

  

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

$ git pull origin next
     

这会在next暂时保留FETCH_HEAD的副本,但不会更新任何远程跟踪分支。使用远程跟踪分支,可以通过调用fetch和merge来完成相同的操作:

$ git fetch origin
$ git merge origin/next

重点是我的。

基本上,Git告诉您,您的更新主人位于origin/master之前,remote tracking branch for master。由于此跟踪分支未由git pull origin master更新(如手册页中所示),因此 在技术上领先于它。调用git fetch origin更新远程跟踪分支,然后您可以手动合并该跟踪分支(如第二个联机帮助页示例所示)。

AFAIK,如果您没有使用git pull指定分支名称(例如git pull origin),它会读取.git/config以获取它应该获取的内容,而远程跟踪分支将会待更新。

答案 1 :(得分:1)

您是否也在本地进行了更改?如果是,那么您的git pull将检索远程提交,并从您的本地HEADorigin HEAD

生成合并提交。