改进git rebase工作流程

4

我目前正在使用非常简单的git工作流程,使用特性分支并在推送之前将其rebase到主分支上。

git checkout -b feature
.. make some commits
git checkout master
git pull

如果从拉取操作中没有任何更改:
git merge feature
git push

如果有更改:
git checkout feature
git rebase master
git checkout master
git merge feature
git push

虽然学习 git 的工作原理很不错,但每次都输入命令有点繁琐,我怀疑是否有更快捷的方法来实现我的目标,但我找不到。


你应该查看git-rebase man page中的示例,而不是先checkout再rebase,你可以直接使用git rebase master feature。但是请参考我的答案,这是更简单的方法... - Tobias Kienzler
顺便问一下,你知道《成功的Git分支模型》吗?非常值得一读。 - Tobias Kienzler
3个回答

4

您最短的步骤总共有6步(不更改大小写):

git checkout -b feature
.. make some commits
git checkout master
git pull
git merge feature
git push

这种技术在两种情况下都应该有效(包括6个步骤):

git checkout -b feature
.. make some commits
git fetch
git rebase origin/master
git checkout master
git merge feature

对于最后一次变基步骤,我建议使用 git merge --no-ff,以便可以轻松地识别工作。这避免了快进。 - steadweb

2

好的,您可以在合并后使用 git pull --rebase 命令,它可以完成以下操作:

-r --rebase

在获取(fetch)后,将当前分支(rebase)在上游(upstream)分支之上。如果有一个对应于上游分支的远程跟踪分支(remote-tracking branch)并且自上次获取(fetch)以来上游分支已经被重新设置(rebased),则该rebase使用该信息来避免rebase非本地更改。

如果您想让git pull始终使用--rebase而不是合并(merge),请参见git-config(1)中的 pull.rebase, branch.<name>.rebasebranch.autosetuprebase

注意

这是一种潜在的危险操作模式。它会重写历史记录,如果您已经发布了该历史记录,这样做可能会带来不良影响。请仔细阅读git-rebase(1),然后再使用此选项。

因此,总结一下:

git branch -b feature
...
git checkout master
git merge feature  # By the way, merge's --no-ff might interest you
git pull --rebase  # rebases feature onto the new-fetched head if necessary

请注意:如果您对master进行了更改,则此操作的结果与您的方式略有不同,因为git pull --rebase将自上次pull/push以来所有更改都变基到拉取的HEAD上,而您的方式会导致拉取的更改和您的master更改合并,然后再将feature变基于此。这在大多数情况下不重要(个人而言,我更喜欢在我的历史记录中没有不必要的pull引起的合并),但您仍应该意识到它...

图片示例,之前:

 /-O          origin/master
C--A--B       master
    \--F--G   feature

在您的方式之后:

 /-O-----\  
C--A--B--C*-----(FG)  (origin/)master - fast-forward merge (unless --no-ff)
          \-F-G-/     feature (rebased!)

git pull --rebase的方式:

 /-O
C--A--B--M*  => C--O--A--B--M*  (origin/)master
   \-F-G-/                      feature (not rebased!)

如果你希望最终结果是不同的话,可以考虑以下几种方法:
C--O--A--B--F--G

使用

git branch -b feature
...
git checkout master
git rebase feature
git pull --rebase

还要注意,你可以通过使用 git-rebase -i 命令来获得更多的乐趣 ;)


关于git-pull --rebase的详细讨论,请参考https://dev59.com/ZnE95IYBdhLWcg3wEpvo#4675513。 - Tobias Kienzler

2

也许一个好的别名可以稍微改善一下你的工作流程,我使用了这个别名。

# full rebase
frb = "!sh -c 'x=`git rev-parse --abbrev-ref HEAD` && echo "rebasing to $0 ..." && git rebase $0 && git checkout $0 && git rebase $x'"

使用(在功能分支上):

git frb master

当然,你也可以在开头添加一个checkout并在结尾处进行push操作。
... 在git 1.9.3(osx)上测试过,如果存在冲突则未经测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接