改进git rebase工作流程

时间:2013-12-05 23:50:10

标签: git

我目前正在使用功能分支工作一个非常简单的git工作流程,并在推送之前重新定位到master。

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是如何工作的但是一直打字有点乏味,我怀疑有一些更快的方法来实现我正在做的但却找不到它们。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

嗯,你可以在合并之后使用git pull --rebase ,这就是:

  

-r   --rebase

     

在获取后,将当前分支重新定位在上游分支的顶部。如果有一个对应的远程跟踪分支   自上次以来,上游分支和上游分支都进行了重组   如果获取,则rebase使用该信息来避免非本地化   变化。

     

如果你想让git pull一直使用--rebase,请参阅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;)

可以带来多少乐趣

答案 2 :(得分: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

当然你也可以在开头添加结账并在结尾处推送

...在git 1.9.3(osx)上测试过,未测试如果存在冲突会发生什么