如何在git中快进其他跟踪分支?
我们正在使用我们所有人都使用的单一远程存储库模型。我们为新特性进行分支,并重新整合到主干分支中。我们的工作流程是,当其他功能集成到主干中时,我们应该将主干集成到工作分支中 因此,我们经常这样做:如何在git中快进其他跟踪分支?,git,Git,我们正在使用我们所有人都使用的单一远程存储库模型。我们为新特性进行分支,并重新整合到主干分支中。我们的工作流程是,当其他功能集成到主干中时,我们应该将主干集成到工作分支中 因此,我们经常这样做: (branch) $ git commit -a -m"blah blah blah" (branch) $ git fetch # origin/trunk is updated (branch) $ git checkout trunk (trunk) $ git pull # trunk is
(branch) $ git commit -a -m"blah blah blah"
(branch) $ git fetch # origin/trunk is updated
(branch) $ git checkout trunk
(trunk) $ git pull # trunk is fast-forwarded to current version of origin/trunk.
(trunk) $ git checkout branch
(branch) $ git merge trunk
(branch) $ git push
我不喜欢“git签出主干/git拉/git签出分支”循环。它通常与VisualStudio结合在一起,抱怨我的所有文件和项目在磁盘上都已更改,是否应该重新加载它们。两次结账。还有拉力。合并。合并是不可避免的,但由于git的工作方式,它应该能够在主干上进行快进,而不需要实际检查
但是我不知道这个命令,我的GoogleFoo让我失望了。有人知道怎么做吗?您真的需要更新本地
中继
分支吗
只需fetch origin/trunk
和merge
直接在您正在处理的分支中将其合并即可。这就是我们的建议:
在(向上投票)中提到: 作为: 您可以跳过合并,只需使用一行代码快速前进 它将本地分支
主干快进到远程分支的头部
请参阅“”中的详细信息尝试以下操作:
$ git pull trunk branch
我同意,但我认为回答“如果您在另一个分支上,如何快速前进master
”这个问题可能会很有趣。我不认为仅仅使用陶瓷命令就可以做到这一点,但这个脚本可以完成这项工作(显然,在您的情况下,您希望将master
更改为trunk
):
更新2012-10-20:这个脚本只是一个简单的例子;对于执行相同操作但用于将任意提交ish合并到本地分支(只要合并是快进的)的脚本,请参阅。我认为最简单的避免git签出主干的,git pull
,git签出分支的方法是使用:
这正是你想要的-快进你的本地分支trunk
到远程分支的负责人。:)我不得不说,我有点害怕你在回复第一行提到的同名用户时碰巧提到了那篇帖子(谢谢!),所以你的建议是“git merge origin/trunk”而不是签出/拉/签出/合并舞蹈?下次出现这种情况时,我会试试。使用git-fetch-upstream-trunk:trunk
可以跳过合并,只需使用一行程序快速前进。看。@Oliver说得好,我当时没看到你的答案(+1)。为了更具可见性,我在答案中加入了它。合并不适合重定正在进行的工作的场景,而Oliver的答案是这样的。首先签出分支,然后执行git pullgit://foo.com/someone/bar.git trunksll我的意思是,你应该能够一步到位,但如上所述,有些人认为这不是最好的主意。对不起,它并没有真正回答这个问题,因为它将当前分支与远程“主干”分支合并,我们希望将本地分支“主干”与远程分支“主干”合并(快进)当我在任何一个分支上运行并且没有修改它时。我认为git曾经做过类似的事情,但是当我在源代码中检查git-pull.sh时,我没有看到它仍然做的任何迹象。我只是使用了这个脚本-谢谢你的提示!我很惊讶这没有内置到git merge中。您可能会认为这是一个非常常见的用例。您可以使用git branch-f master origin/master
,但您不想这样做:如果这不是一个快进合并,您将丢失提交和冲突;我认为我在那里的脚本也做了同样的事情,但是更加充实了,所以你可以安全地将它用作git merge ff
@Jefromi:感谢你指出这一点-我已经用一个链接更新了我的答案。git-fetch-origin-trunk:trunk
适合那些对通用“上游”术语不熟练的初学者。
$ git pull trunk branch
#!/bin/sh
BRANCH=master
NEWER=origin/master
if [ x"$(git symbolic-ref HEAD)" = x"refs/heads/$BRANCH" ]
then
echo "This doesn't make sense if you're already on the branch '$BRANCH'"
echo "Just run: git merge $NEWER"
exit 1
fi
BRANCH_HASH=$(git rev-parse $BRANCH)
NEWER_HASH=$(git rev-parse $NEWER)
MERGE_BASE=$(git merge-base $BRANCH_HASH $NEWER_HASH)
if [ "$MERGE_BASE" = "$BRANCH_HASH" ]
then
git update-ref "refs/heads/$BRANCH" "$NEWER_HASH" "$BRANCH_HASH"
else
echo "$BRANCH can't be fast-forwarded to $NEWER"
exit 1
fi
git fetch upstream trunk:trunk