我可以在Git中有两个跟踪分支(分别用于推送和rebase)吗?

时间:2015-03-18 09:34:29

标签: git git-workflow

我团队的工作流程如下:

  • 我们有任何一个活跃的分支机构;对于两个不同版本的应用程序(或者说,v4即将发布的版本,以及v5,对于 - 在遥远的未来发布)。我们会定期将v4合并到v5
  • 没有人直接在v4v5上工作,我们处理我们的分支中的功能分支并创建拉取请求,指向上游v4v5(使用Atlassian Stash)

我们说我创造了一个新的发展。我创建了一个新分支:

git checkout -b SOMETHING_FOR_V4 v4

现在我在SOMETHING_FOR_V4。我提交并推送:

git push -u origin SOMETHING_FOR_V4

我已使用-u设置了远程跟踪分支,因此下次更新内容时,我可以执行git push而无需指定分支,Git会知道在哪里推送。

但是时间过去了,我想要改变。

我需要明确告诉git rebase origin/v4

相反,我可以在创建分支时将origin/v4设置为我的跟踪分支,但是当我按下时,我必须每次都说git push origin SOMETHING_FOR_V4

我想要的是让Git足够聪明,知道最重要的事情。 如果我在执行git rebase之后只是说git push -u,那么在推送时我会指定远程跟踪分支,这不是我想要的。

基本上我想要单独跟踪分支用于git push (我第一次推送的那个)并为git rebase (在v4v5之上重新定义,这取决于我开始[1])。

是否有可能出现这种行为?

或者,我会使用什么命令来了解自己是否更接近"到v4v5(我正在考虑自动化别名中的fetch-and-rebase)?

[1]在这种情况下v4,它可能会在我开始的时候(例如origin/v4或其远程)进行重新定位。我们可以说我可以自己同步v4origin/v4

1 个答案:

答案 0 :(得分:2)

目前没有内置的方法可以实现您的目标。但如果你自己无法处理这个案子,那么git就不会是git。

配置

为了实现此功能,我们必须配置我们想要重新绑定的分支。 Git让您可以自由添加任何您能想象到的配置;所以让我们调用此配置键branch.<name>.rebase-upstream

要将origin/v4设为rebase-upstream SOMETHING_FOR_V4,我们可以这样做:

git configure branch.SOMETHING_FOR_V4.rebase-upstream origin/v4

Shell脚本

现在我们需要一个脚本来读取此配置并将其传递给rebase

以下脚本将尝试读取当前分支的配置;如果您现在没有任何分支,或者当前分支机构没有rebase-upstream配置,它会发出警告。

#!/bin/sh

current_branch="$(git symbolic-ref --short -q HEAD)"
if [ $? == 1 ]; then
    echo "You are on no branch!" >&2
    exit 1
fi

upstream="$(git config --get branch.$current_branch.rebase-upstream)"
if [ $? == 1 ]; then
    echo "No rebase-upstream reference configured for $current_branch (config: branch.$current_branch.rebase-upstream)" >&2
    exit 1
fi

echo "Rebase $current_branch onto $upstream"
git rebase "$upstream"

用法

要轻松使用此脚本,您现在有两种可能性。

您可以在路径中的某处添加脚本并将其命名为git-rebase-upstream(或类似);领先的git-是这里的重要部分。 Git在您的路径中查找以git-开头的可执行文件,并将它们作为命令使用。现在,您可以通过git rebase-upstream使用它。

更多&#34;便携式&#34;方法将添加一个别名,该别名包含脚本的shell函数。优点是,如果要在多台计算机上同步git配置和命令,则只需备份全局.gitconfig

添加名为rebase-upstream的别名如下所示:

git config --global alias.rebase-upstream '!f() { current_branch="$(git symbolic-ref --short -q HEAD)"; if [ $? == 1 ]; then echo "You are on no branch!" >&2; exit 1; fi; upstream="$(git config --get branch.$current_branch.rebase-upstream)"; if [ $? == 1 ]; then echo "No rebase-upstream reference configured for $current_branch (config: branch.$current_branch.rebase-upstream)" >&2; exit 1; fi; echo "Rebase $current_branch onto $upstream"; git rebase "$upstream"; }; f'

如果您想为这两种方法使用较短的别名(ru),可以使用

git config --global alias.ru '!git rebase-upstream'