【问题标题】:How Do I 'git fetch' and 'git merge' from a Remote Tracking Branch (like 'git pull')如何从远程跟踪分支“git fetch”和“git merge”(如“git pull”)
【发布时间】:2011-02-05 20:23:12
【问题描述】:

我在 git 中设置了一些远程跟踪分支,但是一旦我使用 'git fetch' 更新它们后,我似乎永远无法将它们合并到本地分支中。

例如,假设我有一个名为“an-other-branch”的远程分支。我使用

在本地将其设置为跟踪分支
git branch --track an-other-branch origin/an-other-branch

到目前为止,一切都很好。但是,如果该分支得到更新(通常是通过我移动机器并从该机器提交),并且我想在原始机器上更新它,那么我在获取/合并时遇到了麻烦:

git fetch origin an-other-branch
git merge origin/an-other-branch

每当我这样做时,我都会收到一条“已经是最新的”消息,并且没有任何合并。

然而,一个

git pull origin an-other-branch

始终如您所愿地更新它。

另外,运行 git diff

git diff origin/an-other-branch

表明存在差异,所以我认为我的语法错误。

我做错了什么?

编辑 [2010-04-09]: 我已经检查了几次,而且我绝对不在另一个分支上。我的“git fetch”后跟“git merge”(如上所示)是否应该与 git pull 完全相同?我会得到一些显示 git status 等结果的工作流。

【问题讨论】:

    标签: git git-pull git-merge git-fetch


    【解决方案1】:

    您不获取分支,而是获取整个远程:

    git fetch origin
    git merge origin/an-other-branch
    

    【讨论】:

    • 更多细节:git fetch origin an-other-branch 将获取的小费存储在 FETCH_HEAD,但不是 origin/an-other-branch(即通常的“远程跟踪分支”)。所以,一个人可以做git fetch origin an-other-branch && git merge FETCH_HEAD,但像@Gareth 说的那样做会更好(或者只使用git pull)。
    • 所以如果 origin 有 1000 个分支,你会为所有分支创建一个远程分支吗?
    • 当然。如果我添加了一个包含 1000 个分支的远程存储库,并且我询问远程有哪些分支,那该死的更好给我全部 1000 个
    • 是否会将git merge origin/an-other-branch 合并到所有设置为跟踪它的本地分支中?我怎样才能只合并到一个本地分支?
    • 那么git pull(没有参数)做了什么——它合并了哪个分支?是否合并current分支对应的remote-tracking分支?
    【解决方案2】:

    只选择一个分支:fetch/merge vs. pull

    人们经常建议您将“获取”与“合并”分开。他们说,而不是这样:

        git pull remoteR branchB
    

    这样做:

        git fetch remoteR
        git merge remoteR branchB
    

    他们没有提到的是,这样的 fetch 命令实际上会从远程 repo 中获取 所有 分支,这 不是 该 pull 命令所做的。如果您在远程仓库中有数千个分支,但您不想查看所有分支,则可以运行这个晦涩的命令:

        git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
        git branch -a  # to verify
        git branch -t branchB remoteR/branchB
    

    当然,这很难记住,所以如果你真的想避免获取所有分支,最好按照 ProGit 中的说明更改你的.git/config

    嗯?

    这一切的最好解释是在 ProGit 的第 9-5 章,Git Internals - The Refspec (or via github)。通过 Google 很难找到。

    首先,我们需要澄清一些术语。对于远程分支跟踪,通常需要注意 3 个不同的分支:

    1. 远程仓库上的分支:refs/heads/branchB 在另一个仓库内
    2. 你的远程跟踪分支refs/remotes/remoteR/branchB你的 repo
    3. 你自己的分支:refs/heads/branchB inside 你的 repo

    远程跟踪分支(refs/remotes)是只读的。您不直接修改这些。您修改自己的分支,然后在远程仓库推送到相应的分支。在适当的拉取或获取之后,结果才会反映在您的refs/remotes 中。从 git 手册页中我很难理解这种区别,主要是因为当 .git/config 定义 branch.branchB.remote = remoteR 时,本地分支 (refs/heads/branchB) 被称为“跟踪”远程跟踪分支。

    将“refs”视为 C++ 指针。从物理上讲,它们是包含 SHA-digests 的文件,但基本上它们只是指向提交树的指针。 git fetch 会给你的提交树添加很多节点,但是 git 如何决定移动哪些指针有点复杂。

    正如another answer 中提到的,两者都没有

        git pull remoteR branchB
    

    也没有

        git fetch remoteR branchB
    

    会移动refs/remotes/branches/branchB,而后者肯定不能移动refs/heads/branchB。但是,两者都移动FETCH_HEAD。 (您可以cat.git/ 中的任何这些文件来查看它们何时更改。)而git merge 将引用FETCH_HEAD,同时设置MERGE_ORIG

    【讨论】:

    • 您知道您指向 Git Internals 的链接是指向同一问题的链接吗?
    • 这在 Git 1.8.4 之后发生了变化。现在,如果有一个远程跟踪分支跟踪您要求获取的 ref,那么跟踪分支也将由 fetch 更新。
    【解决方案3】:

    你确定你在合并的时候在本地an-other-branch吗?

    git fetch origin an-other-branch
    git checkout an-other-branch
    git merge origin/an-other-branch
    

    other explanation:

    您尝试合并的分支中的所有更改都已合并到您当前所在的分支。
    更具体地说,这意味着您尝试合并的分支是当前分支的父级

    如果您比远程 repo 提前了一个提交,那么过期的是远程 repo,而不是您。

    但在你的情况下,如果 git pull 有效,那只是意味着你不在正确的分支上。

    【讨论】:

      【解决方案4】:

      Git pull 实际上是一个组合工具:它运行 git fetch(获取更改)和 git merge(将它们与当前副本合并)

      你确定你在正确的分支上吗?

      【讨论】:

      • 我认为 OP 存在差异。分支,发生在我身上。
      【解决方案5】:

      这些是命令:

      git fetch origin
      git merge origin/somebranch somebranch
      

      如果你在第二行这样做:

      git merge origin somebranch
      

      它将尝试将本地 master 合并到您当前的分支中。

      据我了解,问题是您是否已经在本地获取并希望现在将您的分支合并到最新的 same 分支。

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 1970-01-01
        • 2018-03-05
        • 2019-08-14
        • 2020-07-27
        • 2020-01-31
        • 2011-03-04
        • 2019-09-30
        • 2014-08-22
        相关资源
        最近更新 更多