我们说我在不同的分支而不是<local-branch>
,称为<different-branch>
。
当我尝试从远程分支拉到本地分支时,我会执行以下操作:
git pull origin <remote-branch>:<local-branch>
而且,根据我的理解,这应该引入我的<local-branch>
,而不进入<different-branch>
。
但是,当我在git log
上查看<different-branch>
时,我发现这些提交来自<remote-branch>
?
当本地分支与我当前所在的分支不同时,如何从远程分支拉入本地分支?谢谢。
答案 0 :(得分:7)
将git pull
与refspec一起使用不会影响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
。所以这实际上是一种更新本地分支的好方法,而不必检查它:如果省略前导+
,那么如果它不是快进合并,则更新本地ref(分支)将失败,所以你也可以安全地抵御冲突。
但是回到git pull
- 当你运行命令时发生了什么?正如我所说,拉取只是一个提取和合并,所以你的git pull
命令首先这样做:
git fetch origin <remote-branch>:<local-branch>
因此远程分支从远程获取,本地分支更新 - 如果它是快进合并。这已经完全符合您的要求:更新<local-branch>
。
然而,git pull
的合并部分发生了;为此,Git通常运行git merge FETCH_HEAD
。 FETCH_HEAD
是对最后提取的分支的引用。在这种情况下,它指向<local-branch>
。因此,在获取<local-branch>
之后,正在执行的命令是git merge <local-branch>
。运行git merge
将合并到当前分支。
因此,当您使用<different-branch>
并运行git pull origin <remote-branch>:<local-branch>
时,您将正确更新<local-branch>
以匹配远程分支,但您也会将这些更改合并到当前分支中, <different-branch>
。这就是为什么你在当前分支的日志中看到该分支的变化;他们只是合并。
如果你想避免这种情况,根据我的解释,只需使用git fetch
和refspec。它将正确更新本地分支(如果可以),而不会影响当前分支。
答案 1 :(得分:2)
你总是可以走低技术:
public class mysubclass extends mysupclass {
public mysubclass (mysupclass a, mysupclass b) {
//call to constructor of superclass
mysupclass(a,b);
// code here
}
}
或者如果你练习rebase pulls
git fetch origin #fetches all the remote branches
git checkout <local-branch>
git merge origin/<remote-branch>
答案 2 :(得分:2)
如果您还想跟踪远程分支,可以使用以下内容:
git checkout --track -b local-branch origin/remote-branch
如果在上次提取后创建了远程分支,则可能需要先运行git fetch
。