我该如何在git中跟踪分支的引用?

11

我希望使用git在本地跟踪Github上的pull request随着请求的更新(例如添加更多提交)。 Github有一种方式,您可以通过检出只读refs / pull /来处理发送到您的repo的拉取请求。

换句话说,如果有人向我的存储库提交拉取请求,我可以在本地检索该请求:

git fetch upstream pull/123/head:123
git checkout 123

当有人更新了那个拉取请求时,问题就来了。我不知道该如何更新本地分支,因为git pull无法更新我的本地副本:

$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=<remote>/<branch> 123

我已经尝试过:

git branch --set-upstream-to=upstream/refs/pull/123/head 123
git branch --set-upstream-to=upstream/refs/pull/123 123
git merge --ff-only refs/pull/123/head
merge: refs/pull/123/head - not something we can merge

看起来您引用了错误的上游分支,我原本期望是像 git branch --set-upstream-to=origin/pull/123 这样的。在从远程获取之后,您可以使用 git branch -a 检查所有分支引用。 - morxa
你也可以运行 git branch -a -vv 命令来检查你的本地 123 分支是否正在追踪远程分支。 - gzh
@morxa 我试过了,但是不起作用。 - newguy
你说的“它不工作”是什么意思?有什么输出结果吗? - morxa
@morxa 它显示了远程/上游的许多分支,但没有显示任何拉取引用。 - newguy
显示剩余3条评论
2个回答

3
我也遇到过同样的问题,现在分享一下我是如何解决它的。
使用 --set-upstream-to 的想法行不通,因为远程引用似乎不是一个分支。这听起来很奇怪,但我认为这与远程引用存储的位置有关(分支在 refs/heads 中,但拉取请求在 refs/pull 中)。
然而,您可以在 git 配置中为您的远程添加一个 refspec 到您的 fetch 规则。
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

你甚至可以在gitconfig中添加一个git别名,将单个pr号码添加到你的refspecs中(当你完成时再添加一个别名删除它)。你可以在origin后使用任何你想要的东西,但这是一个常见的选择。

有了这个,当你执行git fetch origin命令时,git也会更新pr的引用。接近完成:

git checkout -b pr/${prnum} --track origin/pr/${prnum}

完成!现在你的本地分支pr/123跟踪远程分支remotes/origin/pr/123。后者只在本地仓库中有效,但每次执行git fetch(包括执行git pull时)都会与拉取请求分支同步。

注意:不太旧的git版本还应该允许用以下命令替换上面的checkout命令

git checkout pr/123

这将创建分支pr/123,并正确设置跟踪引用remotes/origin/pr/123


1
非常有用!如果您不想手动编辑.git/config,也可以使用git config --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*' - franferrax

-2
 git fetch origin pull/123/head:123

如果这个工作正常运行,那就意味着你正在从远程的origin获取,而不是从远程的upstream获取。

为了链接到此次获取创建的本地分支 123,你需要:

 git branch --set-upstream-to=origin/pull/123 123

如果有人更新了该PR,请检查该PR是否没有被rebase。
如果是的话,您需要获取PR分支并重置本地分支。

git fetch
git reset --hard 123 origin/pull/123

git branch -avv 返回什么? - VonC
是的,我指的是远程仓库被命名为upstream。git branch -avv显示123分支没有跟踪,还有一堆remotes/upstream/分支,但没有pull/123。 - newguy
那么问题就在这里:远程 repo upstream 是否有一个 pull/123 分支? - VonC
我的意思是:在其他地方克隆那个上游仓库,然后运行 git br -avv 命令:你能在新克隆的仓库中看到 feature/pull/123 分支吗? - VonC
1
升级到2.7.2可能没有必要,但这样做也不会有任何坏处。 - VonC
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接