为什么我的Git状态不能告诉我我是否与我的远程对手最新?

Car*_*ven 15 git

我试过做一些改动,把它推到了Github.从另一台计算机上,我获取了这些变化.当我这样做时git status,它会报告:

On branch MyTestBranch
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我确信已经有了变化.我甚至可以合并那些提取的更改!

事实上,当我去了我朋友的电脑并做了一个时git status,我可以看到:

Your branch is behind 'origin/MyTestBranch' by 1 commit, and can be fast-forwarded.
Run Code Online (Sandbox Code Playgroud)

但是为什么Git报告的事情不像我的origin/MyTestBranch未来有多少提交或者我的分支是否是最新的origin/MyTestBranch

tor*_*rek 24

我在这一点上的猜测(我还在等待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
Run Code Online (Sandbox Code Playgroud)

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

上游设置的存在与否主要影响是否git status可以告诉你,如果你超前和/或落后,以及是否git mergegit rebase可以与任何其他参数做他们的工作.所以它基本上只是一个便利设置.

通常,当您首次通过git checkout基于远程跟踪分支创建分支来检出分支时,会自动设置上游.例如,在你的第一个git clone,Git运行,最后,相当于:

git checkout master
Run Code Online (Sandbox Code Playgroud)

即使你还没有master.然后Git发现你有origin/master(并且没有其它的,remote/master因此不存在使用哪个遥控器的问题),并且相当于:

git checkout -b master --track origin/master
Run Code Online (Sandbox Code Playgroud)

它创建了本地master指向与远程跟踪分支相同的提交origin/master,并设置origin/master为上游master,所有这些都在One Big Do-What-I-Mean Fell Swoop中.

当您创建新的本地分支并且尚未将其推送到上游时,您的本地分支没有跟踪的远程跟踪分支.2 在这种情况下,你必须手动设置上游,或者使用:基本上告诉你为你运行(虽然它实际上都内置在C代码中,此时).origin/whatevergit push -u ...-ugit pushgit branch --set-upstream-to


1如果你坚持使用一个真正古老的Git(1.8.0之前的版本),你必须使用git branch --set-upstream,这对于正确行事来说很棘手,或者git config,这也很难做到.如果可能的话,升级到现代的Git版本.

2这里的单词集合 - 像分支这样的名词,带有本地分支和远程跟踪分支等形容词的名词,以及像上游一样的动词和像跟踪这样的动词,这是非常不幸的.Git术语,用一个很好的短暂的令人难忘的盎格鲁撒克逊方式,而不是一些多音节的新词语,吮吸岩石.3

3或其他盎格鲁撒克逊人的选择.


ate*_*fth 5

是的,应该如此,但在执行此操作之前,您需要执行 a 操作,git fetch以便 Git 知道您当前的分支位于远程分支之后。然后当你执行 a 时,git status你应该会看到你的分支实际上落后了。

  • 我明白这一点。就像我提到的,我已经完成了“git fetch”,我可以看到正在获取更改。但是当我执行“git status”时,它并没有告诉我我是否在远程分支后面。:( (2认同)