为什么在git pull之后出现本地提交?

时间:2017-10-09 14:21:48

标签: git github

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

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检查了未提交的提交,它显示了我从远程提取的最近提交。这是否意味着我必须两次推送相同的提交?

  

更新:我已通过运行git fetch解决了问题。顺便说一句,我   使用git版本1.8.3。谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

(使用git --version查找安装了哪个版本的Git。)

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

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

这个远程跟踪分支的目的是记住“我们最后一次与原点交谈时,原点的主人在哪里”。

接下来,请注意:

git pull origin master

运行:

git fetch origin master && git merge FETCH_HEAD

在早于1.8.4的Git版本中,第一步 - git fetch部分 - 在从origin/master开始检索新提交时无法更新远程跟踪分支master origin

这是一个错误,因此现在版本的Git,从版本1.8.4开始,现在从{{1}获取时“机会性地”更新origin/master远程跟踪分支} origin。换句话说,如果您的Git不是古老的,master 更新您的git fetch origin master。但如果它 那么古老,则无法更新您的origin/master

更新或未能更新您的origin/master后,您的Git会继续执行您报告的origin/master

fast-forward

以便您自己的Updating 1234567..qwertyu Fast-forward home/templates/test.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) master上的master相匹配。

如果您的Git是现代的,并且在origin步骤中更新了origin/master,那么您的Git现在会将您的git fetch与您的master进行比较,并且它们相符。如果您的Git很古老,那么您的Git现在会将您的origin/master与您的master进行比较,并且哇哇!您的origin/master 之前 {{1} }!但这仅仅是因为你的Git 忘了更新其原始实际主人的记忆。

要修复它,您只需运行:

master

甚至只是:

origin/master

即使在这些真正古老的Git发行版中,也会让你的Git更新“git fetch origin git fetch 上的位置”。

(如果您set origin/master as the "upstream" for master,您可以通过运行master完全停止使用origin,或将git pull命令缩短为git fetch && git merge。在这一点上做同样的事情,但使用git pull意味着您不必担心古代版本的Git中的这个小错误。它还为您提供了更多选项,例如 not 运行git pull:您可以运行git fetch && git merge,而这更有意义。)