繁体   English   中英

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

[英]Can I have two tracking branches in Git (separate for push and rebase)?

我团队的工作流程如下:

  • 在任何时候,我们都有一个以上的活跃分支; 对于两个不同版本的应用程序,开发平台分为两个或多个分支(比方说, v4即将发布的版本, v5 ,即将在未来发布)。 我们经常将v4合并到v5
  • 没有人直接在v4v5工作,我们在我们的forK中处理功能分支并创建pull请求,指向上游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 push -u之后只是说git rebase ,那么在推送时我会指定远程跟踪分支,这不是我想要的。

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

是否有可能获得这种行为?

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

[1]在这个场景origin/v4 ,它可以在我开始的时候,比如说v4 ,或者它的遥控器。 假设我可以自己保持v4origin/v4同步。

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

组态

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

要将origin/v4设置为SOMETHING_FOR_V4rebase-upstream ,我们可以简单地执行:

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使用它了。

更“可移植”的方法将添加一个别名,该别名包含脚本的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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM