关于github:为什么本地提交出现在git pull之后?

Why do local commits appearing after git pull?

在从远程启动之前,我总是确保没有本地提交以避免冲突。但是,我经历过:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
admin@localhost ~/home (master) $ git status
# On branch master
nothing to commit, working directory clean

admin@localhost ~/home (master)  $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 5 (delta 4), reused 5 (delta 4), pack-reused 0
Unpacking objects: 100% (5/5), done.
From https://github.com/xxxxxxx
 * branch            master -> FETCH_HEAD
Updating 1234567..qwertyu
Fast-forward
 home/templates/test.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

admin@localhost ~/home (master) $ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#   (use"git push" to publish your local commits)

在我从遥控器拔出后,显示了未完成的提交。我使用git log origin/master..master检查了未完成的提交,它显示了我从远程获取的最近的提交。这是否意味着我必须两次推送同一个提交?

UPDATE: I've fixed the issue by running git fetch. By the way, I'm
using git version 1.8.3. Thanks!


如果您的Git版本非常旧(在1.8.4之前),这种行为是正常的。

如果您的Git版本是1.8.4或更高版本,则此行为不正常。

(使用git --version了解安装了什么版本的git。)

这里有三个(不是两个)实体在玩

记住,在git fetch过程中涉及两个git:您的git,以及您的git通过https://github.com/xxxxxxx通过互联网电话呼叫的另一个git。你的Git有一个分支机构,名为master。他们的Git也有一个名为master的分支。您的Git在自己的存储库中添加了第三个实体,即远程跟踪分支,名为origin/master

这个远程跟踪分支的目的是记住"origin的主人在哪里,上次我们和origin交谈的时候"。

接下来,请注意:

1
git pull origin master

跑:

1
git fetch origin master && git merge FETCH_HEAD

在1.8.4之前的Git版本中,当从origin上的master检索新的提交时,git fetch部分的第一步无法更新远程跟踪分支origin/master

原来这是一个错误,所以Git的现代版本,从1.8.4版开始,现在当你从originmaster中提取数据时,"机会主义地"更新你的origin/master远程跟踪分支。换句话说,如果您的git不是非常古老,那么git fetch origin master会更新您的origin/master。但如果它是那么古老,它就无法更新你的origin/master

在更新或未能更新您的origin/master之后,您的git将继续执行您报告的fast-forward

1
2
3
4
Updating 1234567..qwertyu
Fast-forward
 home/templates/test.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

所以你自己的masterorigin上的master相匹配。

如果您的git是现代的,并且在git fetch步骤中更新了origin/master,那么现在您的git将您的master与您的origin/master进行比较,并且它们是匹配的。如果你的Git很古老,现在你的Git会把你的master和你的origin/master进行比较,哇!-你的master在你的origin/master前面!但这仅仅是因为你的Git忘记了更新它对原始主机的记忆。

要修复它,您只需运行:

1
git fetch origin

甚至只是:

1
git fetch

即使在这些真正古老的git发行版中,它也会让您的git更新其内存"masterorigin上的位置"。

(如果您将origin/master设置为master的"上游",您可以完全通过运行git fetch && git merge来停止使用git pull,或者将git pull命令缩短为只使用git pull命令。这两种方法在这一点上几乎是相同的,但是使用git fetch && git merge意味着您不必担心古版git中的这个小错误。它还为您提供了更多的选择,例如不运行git merge:您可以运行git rebase,而不是更合理。)