git rebase 命令的理解问题

image.png

image.png

问题一:
  有一条代码线master线,同时有条新需求开发线dev线。master线从B开出分支dev线后,一直在做bug修复(C,D)。如下图:
image.png

 

此时,dev线需要合并master线修复的bug,以免重复开发。那我们可以用到git rebase命令。

执行:git rebase --onto master dev,成功后,dev线就会合并C和D提交的记录。如下图:

image.png

疑问:按照书中的解释,
git rebase --onto master dev 命令属于用法3,
参数中 newbase是master sine是deve, till 应该是当前分支 dev
因此rebase --onto master dev 命令的解释不就是 将当前分支(dev) dev之后的提交到 till提交点(也是dev)之间的提交 应用到master上,好像这种理解没有一个提交会应用到master上吧?

问题2:git rebase master 命令如何理解?

阅读 2.4k
1 个回答

你被书上那些弯弯绕绕的东西搞糊涂了,也想的太复杂了,实际开发几乎用不到这么多复杂的玩意。简单点理解就行了,你可以把rebase理解成带有commit排序功能的merge,也就是rebase的效果就是merge之后再按照commit时间顺序重排(而merge则是按照提交顺序排列的)

所以你其实只要先把rebase的地方全部换成merge就理解了吧?比如git rebase master就等同于git merge master,之后再重排commit,也就是按照commit时间顺序合并master分支到当前的分支上,而不是按照提交顺序合并。同理,git rebase --onto master dev的效果就是把dev分支合并到master分支去。这里官方文档描述的其实更明确:

       The current branch is reset to <upstream>, or <newbase> if the --onto option was supplied. This has the exact same effect as git reset --hard <upstream> (or <newbase>). ORIG_HEAD is set to point at
       the tip of the branch before the reset.

并且官方文档还有个示例:

       First let’s assume your topic is based on branch next. For example, a feature developed in topic depends on some functionality which is found in next.

               o---o---o---o---o  master
                    \
                     o---o---o---o---o  next
                                      \
                                       o---o---o  topic

       We want to make topic forked from branch master; for example, because the functionality on which topic depends was merged into the more stable master branch. We want our tree to look like this:

               o---o---o---o---o  master
                   |            \
                   |             o'--o'--o'  topic
                    \
                     o---o---o---o---o  next

       We can get this using the following command:

           git rebase --onto master next topic

rebase最直观的作用其实就是修剪枝叉,如果通过merge合并,在分支图上(终端下可以用命令git log --oneline --graph查看)可能会看到分支互相合并产生的枝叉,被rebase过的提交记录会非常好看,就是一条笔直的树干

另,这些东西更建议去看git官方文档,会更清晰一些,比如你的这些东西都可以在git rebase --help看到:

GIT-REBASE(1)    Git Manual  GIT-REBASE(1)

NAME
       git-rebase - Reapply commits on top of another base tip

SYNOPSIS
       git rebase [-i | --interactive] [<options>] [--exec <cmd>]
               [--onto <newbase> | --keep-base] [<upstream> [<branch>]]
       git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
               --root [<branch>]
       git rebase (--continue | --skip | --abort | --quit | --edit-todo | --show-current-patch)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题