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

时间:2011-02-28 21:01:47

标签: 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

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

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

4 个答案:

答案 0 :(得分:36)

我认为避免git checkout trunkgit pullgit checkout branch周期的最简单方法是使用this answer

git fetch upstream trunk:trunk

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

答案 1 :(得分:22)

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

只需fetch origin/trunkmerge直接在您正在处理的分支机构中 这是Mark Longair的建议: git: fetch and merge, don’t pull


Oliver(upvoted)中提及

his answer

git fetch upstream trunk:trunk

作为he comments

  

你可以跳过合并,只需快进,使用单行。

它会将本地分支trunk快进到远程分支的HEAD。

点击“git: update a local branch without checking it out?

了解详情

答案 2 :(得分:8)

我同意VonC's answer,但认为回答“如果你在另一个分支上你如何快进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

更新2012-10-20:这个脚本只是一个简单的例子;对于执行相同操作但用于将任意commit-ish合并到本地分支的脚本(只要合并是快进的),请参阅Jefromi's answer to a similar question

答案 3 :(得分:-4)

尝试以下方法:

$ git pull trunk branch