本地git分支与源保持最新是什么意思?

时间:2018-10-24 00:46:08

标签: git

在本地仓库的根目录中,我从功能分支切换回$ git checkout develop Switched to branch 'develop' Your branch is up to date with 'origin/develop'.

HEAD

请注意那里的最后一条信息消息:您的分支是最新的'origin / develop'。对我来说,这意味着我的分支完全追上了origin/develop的{​​{1}},并且没有要进行的新更改。

但是当我这样做时...

$ git pull
remote: Counting objects: 10, done.
Unpacking objects: 100% (10/10), done.
From ssh://my-code-commit/v1/repos/myproj
   5840bf6..cc91737  develop    -> origin/develop
Updating 5840bf6..cc91737
Fast-forward
 src/main/java/com/me/myapp/processor/Fizzbuzz.java      |  39 +++++++++++++++++++++++++++++++++++++++
 src/main/java/com/me/myapp/processor/Foobar.java       |   6 ++----
 src/main/resources/META-INF/spring/routes/FlimFlam.xml |  21 +++++++++++++++++++++

哇啊!!怎么可能呢?如果我的本地develop是“ origin/develop的最新信息”,该如何进行远程更改?!

这是误导性消息还是我从根本上误解了git表示我是最新的意思?

2 个答案:

答案 0 :(得分:1)

通常,您需要考虑三种不同的分支机构:

  • 远程存储库中的分支
  • 本地存储库中的远程分支
  • 本地存储库中的本地分支

您所做的工作通常在本地分支机构上完成。这些是您创建并签出的普通分支。例如。当您执行git branch foogit checkout -b foo时,会创建一个 local 分支。本地分支最容易理解。

现在,在谈论远程存储库时,通常不直接使用它。因此,它本身具有一些本地状态。例如,当您推送到远程master分支时,该远程存储库将单独拥有一个master分支。那是远程存储库中的分支。

当您将存储库添加为本地存储库的远程存储时,Git将使用远程分支表示远程存储库所处的状态。运行git fetch时,Git将从远程获取分支信息并更新其远程分支。远程分支的格式为<remote-name>/<branch-name>

因此,如果远程存储库origin有一个本地分支master,则在获取该远程存储库时,您的本地存储库将创建一个远程分支 origin/master。该远程分支存在于本地存储库中,并表示远程分支master的状态。

现在,当您还拥有本地分支机构master时,可以将该分支设置为 track 远程分支。这意味着您将链接masterorigin/master,以便推和拉确切地知道他们必须与之交互的远程和分支。并且当您切换到分支机构时,它还会为您提供该信息。

但是,请务必记住,Git是一个分布式版本控制系统,几乎所有内容都在本地执行,在检查本地分支的状态时,它只会查看远程分支。它不会自动连接到远程存储库以检查其分支的本地状态。

因此,当Git说“您的分支与'origin / master'是最新的” 时,这意味着“您的本地分支和当前本地存在的远程分支指向相同的提交,但远程分支可能已过时”。要解决此问题,您首先必须运行git fetch更新本地存储库中的远程分支,以便它们反映远程存储库的新当前状态。

答案 1 :(得分:0)

git pull实际上是指git fetch && git merge [upstream] 因此,在这种情况下,考虑到输出,这意味着在您结帐的那一刻,您的本地存储库将5840bf6作为HEAD。当您签出一个与Origin另一个分支匹配的分支时,通常会发生这种情况。

因此,当您pull时,本地存储库将更新其引用,发现有新提交要合并,然后更新为cc91737

TL; DR:“您的分支是最新的'origin / develop'。实际上是指“您的分支是最新的'origin / develop'... AFAIK