我怎么从远程跟踪分支''git fetch'和'git merge'(比如'git pull')

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

例如,假设我有一个名为' an-other-branch'的远程分支。 我在本地设置为跟踪分支使用

git branch --track an-other-branch origin/an-other-branch

到现在为止还挺好。 但是如果该分支得到更新(通常是我移动机器并从该机器提交),并且我想在原始机器上更新它,我在使用fetch / merge时遇到了麻烦:

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状态等结果的工作流程。

kaybenleroll asked 2019-07-10T00:26:16Z
5个解决方案
165 votes

你没有获取分支,你获取整个遥控器:

git fetch origin
git merge origin/an-other-branch
Gareth answered 2019-07-10T00:26:29Z
67 votes

只选择一个分支:refs/remotes/branches/branchB/refs/heads/branchBFETCH_HEAD

人们经常建议你分开"抓取" 来自"合并"。 他们说而不是这个:

    git pull remoteR branchB

做这个:

    git fetch remoteR
    git merge remoteR branchB

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

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

当然,这非常难以记住,所以如果你真的想避免取出所有分支,最好按照ProGit中的描述改变你的refs/remotes/branches/branchB

咦?

所有这些的最佳解释是在ProGit的第9-5章,Git Internals - The Refspec(或通过github)。 通过谷歌很难找到。

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

  1. 远程仓库上的分支:refs/remotes/branches/branchB在另一个仓库内
  2. 您的远程跟踪分支:refs/remotes/branches/branchB在您的仓库中
  3. 您自己的分支机构:refs/remotes/branches/branchB在您的仓库内

远程跟踪分支(在refs/remotes/branches/branchB中)是只读的。 您不直接修改它们。 您修改自己的分支,然后推送到远程仓库的相应分支。 在经过适当的拉取或取指之后,结果才会反映在refs/heads/branchB中。 我从git man-pages中很难理解这种区别,主要是因为当地的分支机构(FETCH_HEAD)被称为" track" 远程跟踪分支cat定义.git/

想想' refs' 作为C ++指针。 从物理上讲,它们是包含SHA消化的文件,但基本上它们只是指向提交树的指针。 refs/remotes/branches/branchB会在你的提交树中添加许多节点,但是git如何决定要移动的指针有点复杂。

如另一个答案所述,两者都没有

    git pull remoteR branchB

也不

    git fetch remoteR branchB

会移动refs/remotes/branches/branchB,后者肯定不能移动refs/heads/branchB.但是,两者都移动FETCH_HEAD。(你可以在.git/内查看.git/这些文件中的任何一个,看看它们何时发生变化。)而git merge将参考FETCH_HEAD,同时设置MERGE_ORIG等。

cdunn2001 answered 2019-07-10T00:28:29Z
9 votes

合并后,您确定自己在当地git pull吗?

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

另一种解释是:

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

如果您通过一次提交超过远程仓库,那么远程仓库已经过时,而不是您。

但在你的情况下,如果git pull工作,这只意味着你不在正确的分支上。

VonC answered 2019-07-10T00:29:29Z
3 votes

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

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

RDL answered 2019-07-10T00:30:01Z
1 votes

这些是命令:

git fetch origin
git merge origin/somebranch somebranch

如果你在第二行执行此操作:

git merge origin somebranch

它会尝试将本地主服务器合并到您当前的分支机构中。

正如我所理解的那样,问题是你已经在本地获取并希望现在将你的分支合并到最新的同一分支。

user1524957 answered 2019-07-10T00:30:47Z
translate from https://stackoverflow.com:/questions/2602546/how-do-i-git-fetch-and-git-merge-from-a-remote-tracking-branch-like-git-pu