我如何';git fetch';和';git合并&x27;来自远程跟踪分支(如';git pull';)
我已经在git中设置了一些远程跟踪分支,但是一旦我用“git fetch”更新了它们,我似乎就永远无法将它们合并到本地分支中 例如,假设我有一个名为“另一个分支”的远程分支。我使用我如何';git fetch';和';git合并&x27;来自远程跟踪分支(如';git pull';),git,git-pull,git-merge,git-fetch,Git,Git Pull,Git Merge,Git Fetch,我已经在git中设置了一些远程跟踪分支,但是一旦我用“git fetch”更新了它们,我似乎就永远无法将它们合并到本地分支中 例如,假设我有一个名为“另一个分支”的远程分支。我使用 git branch --track an-other-branch origin/an-other-branch 到目前为止,一切顺利。但是,如果该分支得到更新(通常由我移动机器并从该机器提交),并且我想在原始机器上更新它,那么我将在获取/合并方面遇到麻烦: git fetch origin an-other-b
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
总是像你期望的那样更新它
另外,运行gitdiff
git diff origin/an-other-branch
这表明存在差异,因此我认为我的语法有误
我做错了什么
编辑[2010-04-09]:我已经检查了好几次,我肯定不是在另一个分支上。我的'git fetch'后跟'git merge'(如上所示)应该做与git pull完全相同的事情吗?我将获得一些显示git状态等结果的工作流。合并时,您确定自己在本地
其他分支上吗
git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch
委员会:
您试图合并的分支中的所有更改都已合并到您当前所在的分支。
更具体地说,这意味着您尝试合并的分支是当前分支的父级
如果你比远程回购提前一次提交,那么过时的是远程回购,而不是你
但是在你的例子中,如果git pull运行正常,那就意味着你没有正确的分支。git pull实际上是一个组合工具:它运行git fetch(获取更改)和git merge(将它们与当前副本合并)
您确定位于正确的分支上吗?如果您不获取分支,则获取整个远程:
git fetch origin
git merge origin/an-other-branch
只选择一个分支: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章,()。这在谷歌上很难找到
首先,我们需要澄清一些术语。对于远程分支跟踪,通常需要注意3个不同的分支:
远程回购上的分支:refs/heads/branchB
在另一个回购内
您的远程跟踪分支机构:repo中的refs/remotes/remoteR/branchB
您自己的分支机构:refs/heads/branchB
远程跟踪分支(在refs/remotes
中)是只读的。您不能直接修改它们。您可以修改自己的分支,然后在远程回购中推送到相应的分支。在进行适当的拉取操作之前,结果不会反映在refs/remotes
中。从git手册页上我很难理解这种区别,主要是因为当.git/config
定义branch.branchB.remote=remoteR
时,本地分支(refs/heads/branchB
)被称为“跟踪”远程跟踪分支
把“REFS”看作C++指针。实际上,它们是包含SHA摘要的文件,但基本上它们只是提交树的指针
git fetch
将向提交树添加许多节点,但git如何决定移动哪些指针有点复杂
如中所述,两者都不是
也不是
将移动refs/remotes/branch/branchB
,后者当然不能移动refs/heads/branchB
。但是,两者都移动FETCH\u HEAD
。(您可以cat
在.git/
中查看这些文件中的任何一个,以查看它们何时更改。)并且git merge
将在设置merge\u ORIG
等时引用FETCH\u HEAD
git fetch origin
git merge origin/somebranch somebranch
如果在第二行执行此操作:
git merge origin somebranch
它将尝试将本地主机合并到当前分支中
据我所知,问题是您已经在本地提取,现在想将您的分支合并到同一分支的最新分支。更多详细信息:git-fetch-origin-an-other-branch
将提取的提示存储在fetch\u-HEAD
中,而不是origin/an-other-branch
(即通常的“远程跟踪分支”)。因此,可以使用另一个分支执行git-fetch-origin&&git-merge-fetch\u-HEAD
,但按照@Gareth的说法执行更好(或者只使用git-pull).那么如果origin有1000个分支,你会为所有分支创建一个远程分支吗?当然。如果我在我的存储库中添加了一个有1000个分支的远程存储库,并且我问远程存储库有哪些分支,那么最好给我所有1000个分支将git merge origin/an other branch
mergeorigin/an other branch
合并到所有设置的本地分支中要跟踪它?如何只合并到一个本地分支中?那么,git pull
(没有参数)是什么呢do——它合并了哪个分支?它合并了与当前分支相对应的远程跟踪分支吗?你知道你的Git内部链接是指向同一个问题的链接吗?我想OP在diff.branch中,碰巧发生在我身上。
git fetch origin
git merge origin/somebranch somebranch
git merge origin somebranch