美文网首页程序员
【Git 笔记】Git Rebase 操作的分析与整理

【Git 笔记】Git Rebase 操作的分析与整理

作者: 58bc06151329 | 来源:发表于2017-04-23 11:56 被阅读1029次

    文前说明

    作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

    本文仅供学习交流使用,侵权必删。
    不用于商业目的,转载请注明出处。

    Git 提交步骤

    图例中,有主干 master,支线分支 branch
    其中,master 提交 ID 记录为:C1 → C2 → C3 → C4
    branch 提交 ID 记录为:C1 → C2 → C5 → C6

    Merge 操作

    branch 分支上执行 git merge master 命令。

    Merge 步骤

    master 代码与 branch 代码合并,那么需要处理两个分支之间的冲突,只需要处理一次,最终生成 C7 提交。最终 branch 分支的提交 ID 记录为:C1 → C2 → C3 → C4 → C5 → C6 → C7。其中 C3、C4、C5、C6 提交记录中的顺序由提交的时间决定。

    Rebase 操作

    rebase 操作的前提是 工作区本地库 不能有任何修改存在。
    rebase 分支前,先执行 fetch 下载最新的代码,否则可能会存在最终不能 push 的情况。
    尽量少用 --force 或者 -f 参数,进行强制性操作。

    Rebase 步骤

    首先会产生 rebase 分支(master)的备份,放到(no branch )临时分支中。再将支线分支(branch)的每一次提交修改,以补丁的形式,一个个的重新应用到主干分支上。这个过程是一个循环应用补丁的过程,期间只要补丁产生冲突,就会停止循环,等待手动解决冲突。这个冲突指的是上一个合并后版本与补丁之间的冲突。(例如:C5 补丁时,需要解决的是 C4C5 的冲突,C6 补丁时,需要解决的是 C4 + C5 版本与 C6 之间的冲突),手动解决冲突完成,通过 git add 命令更新内容,执行 git rebase --continue 命令继续后续循环,通过 git rebase --skip 命令,可以跳过某一次补丁(存在上一轮冲突的解决方案中,已经包含了这一轮的补丁内容,这样会使补丁无效,需要跳过),通过 git rebase --abort 命令,可以在循环执行过程中,进行回滚,循环完成后执行命令无效。
    循环完成后会更新 branch 分支,删除(no branch)临时分支。最终 branch 分支提交 ID 记录为 C1 → C2 → C3 → C4 → C5' → C6'。之前的 C5C6 提交将被删除。

    检查代码无问题后,通过 git push origin branch 命令更新提交内容。如果发现分支合并有错误,就只能删除本地分支,重新下载分支,重新进行 rebase 操作。

    使用 Rebase 的必要性和注意事项:

    使得历史变得更加清晰,保持了良好的版本迭代,容易追溯,方便回滚。
    公共分支并行开发,rebase 可能会引发本地历史 commit 记录与服务端历史记录不一致,rebase 之后,只能强行用 --force 推送代码,这样做会进行非线性提交,强制更新服务端的历史记录,就很有可能会造成其他开发人员 commit 丢失的情况。因此一个分支多人维护情况下,尽量少用 rebase

    快捷操作:

    branch 分支上执行 git pull origin master --rebase 命令,相当于执行:git fetch + git rebase
    每次都加 --rebase 似乎有些麻烦,可以指定某个分支在执行 git pull 时默认采用 rebase 方式:

    $ git config branch.master.rebase true
    

    如果觉得所有的分支都应该用 rebase,那就设置:

    $ git config --global branch.autosetuprebase always
    

    这样对于新建的分支都会设定上面的 rebase=true 了。已经创建好的分支还是需要手动配置的。

    高级应用:

    可以使用 git rebase -i commitid 或者 git rebase --interactive commitid 进入 rebase交互模式。(从整个分支commit初始阶段置commitID设置位置)。
    进入交互模式后,提供了一些交互命令。

    #Commands:
    #p, pick = use commit
    #r, reword = use commit, but edit the commit message
    #e, edit = use commit, but stop for amending
    #s, squash = use commit, but meld into previous commit
    #f, fixup = like "squash", but discard this commit's log message
    
    • 交互模式下,直接置换提交的顺序就能达到重新排序的效果。
    • 如果判断不会发生冲突,使用 squash 命令,可以合并当前提交与前一个提交,并且会调用编辑器合并 commit 信息。
    • 如果指定 edit,可以修改当前 commit 信息或者提交的内容、分割当前分支。
    • 交互模式下,可以直接删除提交。
    • 交互修改完成后保存退出,通过 rebase --continue 完成 rebase 操作。

    相关文章

      网友评论

        本文标题:【Git 笔记】Git Rebase 操作的分析与整理

        本文链接:https://www.haomeiwen.com/subject/xknezttx.html