3

我团队的工作流程如下:

  • 在任何时候,我们都有不止一个活跃的分支;对于应用程序的两个不同版本(例如,v4对于即将发布的版本,以及v5在遥远的将来发布的版本),开发同时登陆 2 个或更多分支。我们定期合并v4v5.
  • 没有人直接在v4orv5上工作,我们在分支中处理功能分支并创建拉取请求,指向上游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(在我开始[1]的顶部v4v5从哪个开始)。

有可能得到这种行为吗?

或者,我将使用什么命令来确定自己是否“更接近”v4v5(我正在考虑在别名中自动获取和重新设置基准)?

[1] 在这种情况下,它可以重新建立在我开始的基础之上,或者说它v4的远程基础origin/v4。假设我可以自己处理保持v4origin/v4同步。

4

1 回答 1

2

就目前而言,没有内置的方法可以实现您想要做的事情。但是如果你不能自己处理这种情况,git 就不会是 git。

配置

为此,我们必须配置我们想要变基的分支。Git 让你可以自由地添加任何你能想象到的配置;所以我们称之为配置键branch.<name>.rebase-upstream

设置origin/v4rebase-upstreamforSOMETHING_FOR_V4我们可以简单地做:

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

外壳脚本

现在我们需要一个脚本来读取这个配置并将其传递给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.

更“便携”的方法将添加一个别名,其中包含脚本的 shell 函数。.gitconfig好处是,如果你想跨多台机器同步你的 git 配置和命令,你只需要备份你的全局。

添加一个名为的别名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'
于 2015-03-18T10:46:53.190 回答