Git rebase而不是合并,正确的方法呢?

时间:2016-02-25 14:34:54

标签: git merge rebase

我希望使用rebase而不是merge来避免我的远程存储库上的重复分支交叉点。

为了让您更好地了解我想要达到的目标,请考虑以下情况:

$ git lg
* 2345678 hotfix (HEAD -> master)
* 1234567 foo (origin/master, origin/HEAD)

$ git push 
! [rejected]  master -> master (fetch first)

$ git fetch
$ git lg 
* 2345678 hotfix (HEAD -> master)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo

通常,解决此问题的标准方法是merge后跟push

$ git merge origin/master
$ git lg
* 4567890 Merge remote-tracking branch 'origin/master'
|\
* |  2345678 hotfix (HEAD -> master)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
$ git push

我不喜欢这种解决方案,因为在这种特殊情况下我可以轻松避免分支。所以,让我们用git reset --hard head~1恢复更改并尝试另一种解决方案:

$ git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: hotfix

$ git lg
* 2345678 hotfix (master)
| * 5678901 hotfix (HEAD)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo

现在出现了令人不快的部分,我必须将master移回HEAD

$ git branch -D master
$ git checkout -b master
$ git push
$ git branch --set-upstram-to=origin/master master
Branch master set up to track remote branch master from origin.
$ git lg 
* 5678901 hotfix (HEAD -> master, origin/master, origin/HEAD)
* 3456789 other change
* 1234567 foo

我的问题是如何简化我的rebase并避免令人不快的部分?

2 个答案:

答案 0 :(得分:3)

我认为最简单的方法是改变拉动工作流程。这里有几个选项。

首先,您可以使用out标记来提取

str

根据文档,--rebase在其默认配置中执行git pull --rebase 后跟git pull。使用fetch标记会将merge替换为--rebase:)

其次,您可以将默认值设置为始终使用merge

执行此操作
rebase

我会推荐第一种方法,因为设置rebase的默认值会让我感到紧张。我为git pull创建了一个别名git config --global pull.rebase true ,以便更轻松。这样我就能做出决定。

答案 1 :(得分:2)

问题是您直接在本地主分支上工作。当您对主分支进行一些本地更改并且在您启动之后还有上游更改时,您将遇到问题中描述的冲突。因此,避免这种情况的解决方案只是不直接在主分支上工作,而是在一个或多个其他本地分支上工作。

因此,您将修补程序更改放在单独的分支上,比如说hotfix_branch,然后正常获取/拉取主分支(没有任何冲突!)。当您想要提供修补程序更改时,请重新设置botfix分支以保持在新拉出的主分支之上,将修补程序分支合并到主分区并推送。

示例命令:

$ git pull master
$ git checkout -b hotfix_branch master
$ $EDITOR some.file
# Time passes and changes are made on origin/master
$ git add some.file
$ git commit -m "hotfix"
$ git pull master                           # No conflicts sine master is "clean"
$ git rebase master hotfix_branch      # This step might have merge conflicts but
                                       # if so those will come no matter what you
                                       # do with regards to branching
$ git checkout master
$ git merge hotfix_branch
$ git push

有一个很小的窗口,你可以在拉动和尝试推动主人之间对原点/主人进行新的更改,但如果是这样你只需要做

$ git checkout master                   # if not already on the master branch
$ git reset origin/master

然后再次从上面列表中的第二个pull master命令开始。