本地 Git 分支与远程 origin 分支保持最新状态是什么意思?

5
在我的本地代码库根目录中,我从一个特性分支切换回develop分支:
$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.

请注意最后一条信息:您的分支与'origin / develop'保持最新。 在我看来,这意味着我的分支已完全更新到origin / developHEAD,无需拉取新更改。

但是当我执行...

$ 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 +++++++++++++++++++++

什么?!怎么会这样?如果我的本地 developorigin/develop “更新到同一状态”,那么如何存在远程更改需要拉取?!

这是误导信息吗,还是我基本上误解了 Git 在说“已经更新到最新”时的含义?

2个回答

7
通常情况下,你需要考虑三种不同类型的分支:
- 远程存储库中的分支 - 本地存储库中的远程分支 - 本地存储库中的本地分支
你通常在本地分支上执行操作。这些是你创建并检出的正常分支。例如,当你执行 "git branch foo" 或 "git checkout -b foo" 命令时,你会创建一个本地分支。本地分支是最容易理解的。
现在,在谈论远程存储库时,你通常不直接与其打交道。因此,它本身有一些本地状态。例如,当你推送到远程主分支时,那么该远程存储库就拥有自己的主分支。那就是远程存储库中的分支。
当你将存储库添加为本地存储库的远程时,Git 将使用远程分支来表示远程存储库的状态。当你运行 "git fetch" 命令时,Git 将从远程获取分支信息并更新其远程分支。远程分支的格式为 "remote-name/branch-name"。
因此,如果远程存储库 origin 有一个本地分支 master,那么在获取该远程存储库时,你的本地存储库将创建一个远程分支 origin/master。该远程分支存在于你的本地存储库中,表示远程存储库中 master 分支的状态。
现在,当你也有一个本地分支 master 时,你可以设置该分支以跟踪远程分支。这意味着你将链接 master 和 origin/master,以便推送和拉取知道它们必须与哪个远程及其上的哪个分支进行交互;并且当你切换到该分支时,它也会为你提供该信息。
但是,重要的是要记住,Git 是一个分布式版本控制系统,几乎所有东西都在本地执行,因此只有在检查本地分支状态时才会查看远程分支。它不会自动连接到远程存储库来检查其分支的本地状态。
因此,当 Git 说 "Your branch is up to date with 'origin/master'" 时,它的意思是 "Your local branch and the remote branch that exists locally currently point at the same commit but the remote branch could possibly be stale"。要解决这个问题,你需要先运行 "git fetch" 命令,更新本地存储库中的远程分支,使其反映远程存储库的新当前状态。

0

git pull 实际上意味着 git fetch && git merge [upstream]。因此,在这种情况下,考虑到输出,意味着在您检出时刻,您的本地 repo 以 5840bf6 作为 HEAD。这通常发生在您检出与 Origin 匹配的分支时。

因此,当您执行 pull 时,您的本地 repo 更新其引用,发现有新的提交需要合并,然后更新到 cc91737

简而言之:"Your branch is up to date with 'origin/develop'." 实际上意味着 "Your branch is up to date with 'origin/develop'... AFAIK"。


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