在“git pull origin”中使用冒号<;远程分支>;:&书信电报;本地分行>;`拉不到正确的分支?

在“git pull origin”中使用冒号<;远程分支>;:&书信电报;本地分行>;`拉不到正确的分支?,git,github,version-control,git-merge,git-pull,Git,Github,Version Control,Git Merge,Git Pull,假设我在一个与不同的分支,名为 当我尝试从远程分支拉入本地分支时,我会执行以下操作: git pull origin <remote-branch>:<local-branch> git拉入原点: 根据我的理解,这应该是我的,而不是 但是,当我在上检查git log时,我看到这些提交来自 当本地分支与我当前使用的分支不同时,如何从远程分支拉入本地分支?多谢各位 你可以选择低技术: git fetch origin #fetches all the remote bra

假设我在一个与
不同的分支,名为

当我尝试从远程分支拉入本地分支时,我会执行以下操作:

git pull origin <remote-branch>:<local-branch>
git拉入原点:
根据我的理解,这应该是我的
,而不是

但是,当我在
上检查
git log
时,我看到这些提交来自


当本地分支与我当前使用的分支不同时,如何从远程分支拉入本地分支?多谢各位

你可以选择低技术:

git fetch origin #fetches all the remote branches
git checkout <local-branch>
git merge origin/<remote-branch>
git fetch origin#获取所有远程分支
git签出
git合并源/
或者,如果你练习再基础拉法

git rebase -i origin/<remote-branch> <local-branch>
git-rebase-i-origin/

如果您还想跟踪远程分支,可以使用以下命令:

git pull origin <remote-branch>:<local-branch>
git签出--跟踪-b本地分支来源/远程分支


如果远程分支是在上次获取后创建的,则可能需要先运行
git fetch

使用带有refspec的
git pull
不会影响pull命令的合并部分。您可能知道,
git pull
本质上只是
git fetch
git merge
的组合;首先,它将从远程获取最新的更改并更新远程跟踪分支,然后将该远程跟踪分支合并到当前分支中

现在,正如我所说,refspec不影响合并部分,但它只影响
git pull
内部的获取。现在要理解这最终意味着什么,您首先必须理解什么是refspec

refspec基本上只是远程分支映射到远程跟踪分支的配置。这里的远程分支是远程上实际存在的分支,远程跟踪分支是为跟踪远程分支的状态而创建的分支;对于名为“origin”的远程设备,其远程跟踪分支都以
origin/
开头

如果未明确指定refspec,则它将取自配置文件。默认表单通常如下所示:

+refs/heads/*:refs/remotes/origin/*
这告诉Git获取位于
refs/heads/*
的远程分支,并将它们映射到位于
refs/remotes/origin/*
的远程跟踪分支。因此,对于远程分支
master
refs/heads/master
将映射到
refs/remotes/origin/master
。前导的
+
还告诉Git覆盖远程跟踪分支,而不管更改是否可以快速转发:毕竟,您通常希望远程跟踪分支与远程上的状态完全匹配,因此如果在那里重写历史记录(应该避免)或重命名分支,您可能希望远程跟踪分支仍然尊重这一点

现在,当您指定refspec时(使用
git-fetch
git-pull
),默认映射将被覆盖。而是使用您的映射。例如,当您使用
git fetch origin master:foo
时,本地分支
foo
会快速转发(如果可能)以指向远程分支
master
。因此,这实际上是一种更新本地分支的好方法,而不必签出它:如果您省略了前导的
+
,那么如果不是快进合并,则更新本地引用(分支)将失败,因此您也可以安全地避免冲突

但是回到
git pull
——运行命令时发生了什么?正如我所说,pull只是一个fetch和一个merge,因此您的
git pull
命令首先执行以下操作:

git fetch origin <remote-branch>:<local-branch>
git获取来源:
因此,远程分支从远程获取,如果是快进合并,本地分支将更新。这正是您想要的:更新

然后,git pull的合并部分发生了;为此,Git通常运行
Git merge FETCH\u HEAD
FETCH\u HEAD
是对上次获取的分支的引用。在本例中,它指向
。因此,在进入
之后,正在执行的命令是
git merge
。运行
git merge
将合并到当前分支中

因此,当您在
上运行
git pull origin:
时,您将正确地更新
以匹配远程分支,但随后还将这些更改合并到当前分支
。这就是为什么您会在当前分支的日志中看到该分支的更改;他们只是合并了


如果您想避免这种情况,根据我上面的解释,只需对refspec使用
git-fetch
。它已经正确地更新了本地分支(如果可以的话),而不会影响当前分支。

是否包含冒号周围的空格?因为那些不应该在那里。谢谢你的回答。当您说“在本例中,它指向。因此,在获取到之后,正在执行的命令是git merge。而运行git merge将合并到当前分支。”……这里是什么?您是否正在将远程跟踪分支与本地持有的分支合并?如果是这样的话,你怎么能使用refspec呢?我想我的部分困惑是…何时使用冒号,何时只使用空格?e、 g.
git fetch origin:
git merge origin
相比?通常,除非您明确希望提取到不同的本地跟踪分支,否则不应手动使用refspec。如果遇到默认refspec不正常的情况,则应调整配置。因此,您可能永远不需要带有
fetch
的refspec。使用
,不要使用它