【问题标题】:Why is git pull needed to update a (different) branch (moving branch to latest commit without git pull)?为什么需要 git pull 来更新(不同的)分支(在没有 git pull 的情况下将分支移动到最新提交)?
【发布时间】:2019-11-17 20:13:57
【问题描述】:

我很乐意为这个问题写一个更准确的主题,但我现在无法更好地表达它。

基本上,假设您有一个仓库,其中有多个分支,例如“master”和“mybranch”。

所以,假设你在 master 上:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

然后你在这里做git pull;为master 分支和mybranch 检索新提交。由于您已经在分支 master 中,master 的 HEAD 会由 git 自动更新为最新收到的提交。

现在,假设您使用结帐更改分支:

$ git checkout mybranch
Switched to branch 'mybranch'
Your branch is behind 'origin/mybranch' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

现在这让我感到困惑 - 在之前的 pull 中,(显然)所有最新的提交 - 包括 mybranch 中的提交 - 都已被检索;否则我的本地 git 不会“知道”我的本地分支“落后于 ... 2 次提交”。

所以我的问题是:当我们已经下载了mybranch 的那些新提交时,为什么我需要再次执行“git pull”,不必要地往返服务器?没有“git update-head”或一些命令,可以在本地执行,无需往返服务器?

【问题讨论】:

    标签: git git-pull


    【解决方案1】:

    您在图片中缺少远程跟踪分支,这就是导致您困惑的原因。

    (提醒:git pull 是进行两个操作的便捷方式:git fetch 然后git merge origin/<currentBranch>

    当您fetch 时,您不是在修改本地分支,而是在更新远程跟踪分支,它们是远程分支的镜像。

    这些分支不会被您检查或修改,它们用于,如您所说,比较或其他检查。

    git pullgit fetch 更进一步,并将远程跟踪分支合并到其本地分支中。

    这解释了为什么您需要显式更改分支然后再次拉取(或简单地合并)以更新您的另一个分支。

    【讨论】:

    • 谢谢@RomainValeri - 很好的解释(赞成!),但是我接受了另一个答案,因为有更多的命令行示例。
    • @sdbbs 不用担心,蒂姆的回答非常好,我们都在这个过程中学到了更多:-)
    【解决方案2】:

    您对第一步发生的情况的解释不正确。当您从master 分支执行git pull 时,您实际上是在执行git pull origin master。这将更新本地跟踪分支 origin/master,然后将此分支合并到您的本地 master 以快进它。不影响其他分支。

    如果您只想到 Git 服务器进行一次往返,那么您可以尝试这样做:

    git fetch origin   # update all local tracking branches
    # from e.g. mybranch
    git merge origin/mybranch
    

    那么,如果你还想更新你本地的master 分支,你只需要签出和合并:

    git checkout master
    git merge origin/master
    

    请注意,以上两个步骤完全发生在本地,独立于远程 Git 服务器。

    【讨论】:

    • 感谢@TimBiegeleisen - 这意味着,在 OP 示例中,如果我已经在 master 中做了一个 git pull(它做了一个 git fetchgit merge)——我可以做到git merge origin/mybranch 曾经git checkout mybranch,对吗?
    • 是的,没错。 git pull 应该是相同的 git fetch + git merge (除非您将 rebase 配置为默认拉取策略)。
    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 2016-03-30
    • 2017-03-05
    • 1970-01-01
    • 2018-12-08
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多