Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何';git fetch';和';git合并&x27;来自远程跟踪分支(如';git pull';)_Git_Git Pull_Git Merge_Git Fetch - Fatal编程技术网

我如何';git fetch';和';git合并&x27;来自远程跟踪分支(如';git pull';)

我如何';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中设置了一些远程跟踪分支,但是一旦我用“git fetch”更新了它们,我似乎就永远无法将它们合并到本地分支中

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

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
    merge
    origin/an other branch
    合并到所有设置的本地分支中要跟踪它?如何只合并到一个本地分支中?那么,
    git pull
    (没有参数)是什么呢do——它合并了哪个分支?它合并了与当前分支相对应的远程跟踪分支吗?你知道你的Git内部链接是指向同一个问题的链接吗?我想OP在diff.branch中,碰巧发生在我身上。
    git fetch origin
    git merge origin/somebranch somebranch
    
    git merge origin somebranch