如何在git中快进其他跟踪分支?

Bla*_*cal 28 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 fast-forwarded to current version of origin/trunk.
(trunk) $ git checkout branch
(branch) $ git merge trunk
(branch) $ git push
Run Code Online (Sandbox Code Playgroud)

我不喜欢"git checkout trunk/git pull/git checkout branch"循环.它通常与Visual Studio合并,抱怨我的所有文件和项目都在磁盘上发生了变化,并且应该重新加载它们.两个结帐.而拉.合并.合并是不可避免的,但由于git如何工作,它应该能够在主干上进行快进,而不需要检查它.

但我不知道这个命令,而我的google-foo在这方面让我失望了.谁知道怎么样?

Oli*_*ver 38

我认为,最简单的避免的方式git checkout trunk,git pull,git checkout branch循环就是用这样的回答:

git fetch upstream trunk:trunk
Run Code Online (Sandbox Code Playgroud)

这完全符合您的要求 - 将您的本地分支快进trunk到远程分支的HEAD.

  • 对于不熟悉通用"上游"术语的初学者,`git fetch origin trunk:trunk`. (6认同)

Von*_*onC 24

你真的需要更新本地trunk分支吗?

只要fetch origin/trunkmerge它直接在分支您正在使用.
这就是Mark Longair的建议:git:fetch而且merge,不是pull.


奥利弗他的回答中提到(upvoted):

git fetch upstream trunk:trunk
Run Code Online (Sandbox Code Playgroud)

正如他评论说:

您可以使用单线程跳过合并并简单地快进.

它确实将本地分支快进trunk到远程分支的HEAD.

查看更多" git:更新本地分支而不检查它? "

  • :)我不得不说我有点吓坏了你碰巧提到了那篇文章(谢谢!)以回复一位同名的用户在第一行提到... (9认同)
  • 使用`git fetch upstream trunk:trunk`你可以跳过合并,只需快进,使用一行.见[我的回答](http://stackoverflow.com/a/21601318/177710). (2认同)

Mar*_*air 8

我同意VonC的回答,但认为回答" master如果你在另一个分支上如何快进?" 这个问题可能会很有趣.无论如何.我不认为有办法做到这一点只用瓷的命令,但该脚本做这项工作(很明显,你会想改变master,以trunk你的情况):

#!/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
Run Code Online (Sandbox Code Playgroud)

更新2012-10-20:这个脚本只是一个简单的例子; 对于执行相同但是将任意commit-ish合并到本地分支的脚本(只要合并是快进的),请参阅Jefromi对类似问题的回答.