UDN-企业互联网技术人气社区

板块导航

浏览  : 1535
回复  : 0

[翻译] 《Git in Practice》翻译 技巧44 互动式变基操作:git rebase --int...

[复制链接]
zhaoyx的头像 楼主
发表于 2015-9-28 14:13:20 | 显示全部楼层 |阅读模式
本帖最后由 zhaoyx 于 2015-9-28 14:12 编辑

技巧44 互动变基操作:git rebase --interactive

你可能私下想过,在本章所看到的各种重置操作、拣选操作以及间隔提交操作,如果能有什么方式把它们组合起来用于修改分支的历史记录使其在推送到别的地方之前成为你想要的样子,那就太好了。Git 为此提供了一个有效的工具:rebase命令的--interactive(或-i参数)。

接下来的例子,你会了解如何处理空提交。通常你很少会提交一次空提交;只是通过这个例子来演示一下rebase命令是如何处理它们的。当你处理完提交冲突以后,可能会产生一些空提交,它们不再包含任何修改内容。如果你有一组每次新的提交生成都会触发一些事件的监控系统,你想在这个监控系统中触发一些事件又不想改变任何文件,你也可能会人为制造一些空提交。让我们来在 inspiration 分支上创建一个空提交:

  • 切换到版本库目录:比如,
    cd /Users/mike/GitInPracticeRedux/
  • 执行
    git checkout inspiration
  • 执行
    git commit --allow-empty --message="Empty commit"
    来创建一个空提交。会产生类似下面的输出:
    # git commit --allow-empty --message="Empty commit" [inspiration 26596ad] Empty commit

问题
你希望交互式的变基分支历史。

解决方案
  • 切换到版本库目录:比如,
    cd /Users/mike/GitInPracticeRedux/
  • 执行
    git checkout inspiration
  • 执行
    git rebase --interactive v0.1


会出现一个文本编辑器,内容看起来类似下面这样:
list6.9.jpg



  • ① 显示的是 v0.1-release 分支上的最后一个提交。它出现在此是因为我们正在向 v0.1 基线做变基,这个操作涉及到 inspiration 分支到 v0.1 基线之间的所有提交。在你的新分支中可能包含某些提交是不合适的;但是正如文本中提到的,如果你从文本中删除包含相应提交的行,这样该提交就会从变基后的提交中被删除。它的效果和如果发生冲突时你使用git rebase --skip跳过这个提交是一样的。更强大的是,如果你在这里剪切掉一行,然后执行另外一个git rebase --interactive操作时,这时候这个提交还是存在的(提交会在被所有分支分离的90天之后被完全清除),再把它粘贴回来,这个提交就会在那次变基操作中被应用进去。

  • ② 显示的是 inspiration 分支的最后一次提交。它和变基到 v0.1-release 分支上的原提交内容是完全一样的(尽管SHA-1 值不同)。

  • ③ 显示的是没有修改的空提交。它被 # 号注释掉了。空提交是不应该被保留的,所以变基操作自动将它们移除掉了。

  • ④ 显示的是正在执行变基操作的范围(725c33a..5d4ad83)以及被变基到哪个提交上。本例中,725c33a 就是v0.1 基线提交。

  • ⑤ 指的是每个提交在互动变基中可选择的变基命令的其中一条。变基操作会由上至下的依次按照列表中每个提交执行特定的命令(会跳过被删除的提交)。pick 命令意味着提交被应用进本次变基操作。如果当前文本不进行修改直接保存关闭,每个提交都是被选取的,那么此次git rebase --interactive命令将会和执行git rebase命令是一样的结果。

  • ⑥ 命令是指,当执行到它时会应用此提交,同时打开一个编辑器,允许你修改提交说明。当你在准备推送之前意识到某个提交说明很简略而希望修改的时候,这个命令就非常有用了。

  • ⑦ 表现的就如同存在一个合并冲突一样。在提交应用之前,你会被拉进一个命令行,你可以编辑提交内容,然后使用 --continue/--skip/--abort 继续之后的变基操作。当你想要微调某个提交时,这个就很有帮助了,可能将提交修改的更清晰,或者分解成一个问题对应一个的多次提交。

  • ⑧ 合并两个或多个提交为一个。如果提交被标注为 squash ,它之前的提交(或之前的多次提交,如果前一个提交也被标注为 squash )不会被应用,直到最后一个相邻的被标注为 squash 的提交出现。至此会提示输入提交说明,默认的提交说明是所有被压缩的提交的说明信息的合集。这个命令对于合并多次提交很有用;可能前一次提交时少了一个文件,在第二次提交才被加进来。提交被压缩成一个,意味着当它们被推送到远程版本库时,没有人知道在第一次提交时曾发生了这个失误。

  • ⑨ 和 squash 命令非常相似,但是它不会要求一个新的提交说明,而是使用第一个提交的说明。这被应用在当你想要合并一些提交但是不需要改变提交说明信息的时候。

  • ⑩ 这个命令和之前命令不同,它不是执行在某个提交对象上的。相应的,其他命令会在 exec 执行后执行。当进行变基操作时,它可以用来打印调试信息。

编辑并保存此文本文件,未注释的内容如下。



会产生类似下面的输出。

图示 6.7 展示了执行互动变基后 inspiration 分支的状态。和你第一次执行git rebase前不同,这条分支现在包含了两个提交,较新的这个提交之前是先被提交的,并且它现在包含了两条提交的内容。

你现在已经通过互动式变基成功的将 inspiration 分支变基到了 v0.1 基线提交上。现在可以使用git push --set-upstream origin inspiration命令推送这条分支。



讨论
尽管复杂,git rebase --interactive支持各种强大的工作流(本书稍后会讨论一些)。典型的,我经常会在推送分支到上游时使用互动式变基;它允许我仔细评估和考量我的提交历史记录应该是怎样。我考虑的因素包括当前是否存在任何多余的提交记录或者仅仅是用于整理以前提交的提交记录,是否有任何提交说明需要改进,是否有任何提交需要重新修订使之看起来更合理,以及是否存在任何应该删除或移动到其他分支的提交。git rebase --interactive作为一个相当有效的回顾和修订工具,允许我为我之前所有的提交做上述考虑,使它们形成一个有序的排列。

本书第三部分将介绍一些工作流,git rebase --interactive将是其中起关键作用的部分。




相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部