为什么我的Git状态没有显示我是否与远程同步?

32

我尝试做了一些更改并将其推送到GitHub,然后从另一台电脑上获取了这些更改。 当我执行git status时,它报告如下:

On branch MyTestBranch
nothing to commit, working directory clean

这很奇怪,因为我确定已经拉取了更改。我甚至可以使用那些拉取的更改进行合并!

实际上,当我去我的朋友电脑上执行git status时,我可以看到这个:

Your branch is behind 'origin/MyTestBranch' by 1 commit, and can be fast-forwarded.

但是为什么 Git 没有报告像我的 origin/MyTestBranch 提交了多少个提交,或者我的分支是否与 origin/MyTestBranch 同步?


git rev-parse --symbolic-full-name "@{u}" 打印什么?(取决于您使用的 shell,您可能不需要引号。)或者,git branch -vv 显示什么? - torek
你尝试过执行 git pull origin MyTestBranch 吗? - Khairul Alam Licon
@licon 我没有进行 pull 操作。我先进行了 fetch 操作,然后执行了 git status 命令,但是惊讶的是它并没有显示我落后了一个提交。 - Carven
@torek,我已经合并了该分支。这些命令是否仍然准确? - Carven
是的,尽管如果您已经完成了合并,直到有其他更改发生之前,您现在将是最新的。 - torek
@Carven 我的意思是你可以尝试 git pull。另一个技巧可能会有帮助,首先删除你本地的 MyTestBranch 分支。但请确保删除本地分支不会导致分支中的本地代码被误删。如果你认为你的源分支已经包含了最新的更改,那么你可以通过以下命令删除本地分支并从源分支再次检出:git checkout -b MyTestBranch origin/MyTestBranch - Khairul Alam Licon
4个回答

39

目前我的猜测是(我仍在等待git branch -vvgit rev-parse --symbolic-full-name "@{u}"的结果),您没有将origin/MyTestBranch设置为MyTestBranch的上游分支。

要将一个分支设置为当前分支的上游分支,使用以下命令:

git branch --set-upstream-to upstream1

在这种情况下,该命令应扩展为:

git branch --set-upstream-to origin/MyTestBranch

要删除上游设置,请使用git branch --unset-upstream

存在或不存在上游设置主要影响git status是否能够告诉您当前分支是否领先或滞后,以及git mergegit rebase是否需要额外的参数才能完成任务。因此,它基本上只是一个方便的设置。

通常情况下,当您首次检出分支时,上游会通过创建基于远程跟踪分支来自动设置。例如,在第一次执行git clone时,Git 最终运行相当于:

git checkout master

即使您还没有master,Git会发现您有origin/master(没有其他的remote/master,因此不存在要使用哪个远程的问题),并执行如下操作:

git checkout -b master --track origin/master
创建一个本地master分支,指向与远程跟踪分支origin/master相同的提交,并将origin/master设置为master的上游,所有这些都可以在一个大的操作中完成。
当您创建一个新的本地分支并且尚未将其推送到上游时,您的本地分支没有origin/whatever 的远程跟踪分支需要跟踪。2 在这种情况下,您必须手动设置上游,或使用git push -u...-u基本上是告诉git push为您运行git branch --set-upstream-to(尽管实际上所有这些都已内置到C代码中)。

1如果您被困在真正古老的Git版本(早于1.8.0),则必须使用git branch --set-upstream,这很难做对,或者使用git config,这也很难做对。 如果可能的话,请升级到现代Git版本。

2这里的一组单词,如branch、local branch和remote-tracking branch等带有形容词的名词,以及像set-upstream-to和tracking之类的动词和动名词,都相当不幸。 用一种漂亮而简短、易记的英语-撒克逊方式来表达Git术语,而不是使用一些多音节的新词汇,这种方式很糟糕。3

3或者其他您选择的英语-撒克逊式强烈措辞的词语。


非常感谢!!原来问题确实与设置upstream有关。一旦我这样做了,现在就没问题了!不过奇怪的是,当我第一次克隆仓库时它没有设置upstream。 - Carven
关键在于如何创建本地分支。如果您让git checkout基于远程跟踪分支创建它,Git会将该本地分支设置为跟踪相应的远程跟踪分支。如果不是——如果创建了本地分支——即使远程跟踪分支存在,它也不会跟踪远程跟踪分支,除非您使用--track或以其他方式请求跟踪远程跟踪分支。(看到我所说的术语吗?) - torek
git branch --set-upstream-to upstream gave me an "unknown option" error. I believe you mean git branch --set-upstream upstream - evt
@evt:这意味着您使用的是相当旧的Git版本(1.8.0之前)。--set-upstream-to是弃用的--set-upstream选项的替代/更正。有关详细信息,请参阅Git 1.8.0发布说明 - torek

5

是的,它应该可以,但在此之前,您需要执行 git fetch 命令,这样 Git 才会知道您当前的分支落后于远程分支。然后,当您执行 git status 命令时,您应该会看到您的分支确实落后了。


2
我理解了。就像我之前提到的,我已经执行了 git fetch 命令,并且可以看到有变更被获取了。但是当我执行 git status 命令时,它并没有告诉我我是否落后于远程分支。 :( - Carven

0

git remote update 没有永久解决 git status 的问题,但它会检查远程并且易于记忆和输入。运行后,git status 告诉我我落后了。


-2
要查看您超前或落后多少个提交,请使用:

$ git checkout # Without any arguments

这只适用于带有工作树的存储库。在裸存储库中,我使用一个脚本 - git-branch-status的旧版本。


对我没用,git checkout 显示一切正常,然后 git pull 拉取了大量更新。 - Romell
当然,你首先要使用 git fetch。不要使用 git pull,因为它会执行 fetch,然后触发一个 rebase 或 merge。 - Kaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接