git: squash/fixup earlier commit
Git的版本1.7.0引入了--autosquash选项,用于rebase操作,可以实现修复之前的提交。同时,commit命令也引入了--fixup和--squash选项,可以更方便地进行操作。通过一些别名设置,甚至可以将整个过程合并为一个命令。
为了获得最大的便利性,建议升级到最新的Git版本。
从以上引用的git文档中可以看出,自1.7.0版本的Git开始,rebase命令新增了"fixup"操作,可以将变更压缩成一个提交,并且不会改变现有的日志信息。此外,还新增了--autosquash选项,可以与新的"fixup"操作一起使用。
在1.7.3版本的Git中,rebase命令还会查看rebase.autosquash配置,并根据命令行参数中是否给出--autosquash参数来进行相应操作。
在1.7.4版本的Git中,commit命令引入了--fixup和--squash选项,以便更方便地进行交互式rebase的后续操作。
另外,"git rebase --autosquash"可以使用SHA-1对象名称来指定要修复的提交(例如"fixup! e83c5163")。
以上是关于修复之前提交的Git操作的一些解决方法和建议。对于更详细的示例,可以参考这个链接。
在我的当前git工作流中,使用--fixup
/--squash
命令非常频繁,以至于我写了一个新的git-fixup
命令来自动处理大部分繁琐的部分:
git fixup
命令会将修改的文件按照最新的提交分组显示git fixup -a
命令会将所有这些更改作为--fixup
更改提交,并与其对应的“父”提交一起提交git fixup -r
命令会自动对所有的fixup提交执行git rebase --autosquash
很多更改的情况下,仅仅使用上述三个命令就足以完成工作,不需要复制粘贴提交ID或者阅读git log
来查找正确的--fixup
目标。
原因:
Git的--fixup
和--squash
选项被广泛用于合并和整理提交历史。这些选项允许将多个提交合并成一个,或者将修改应用到之前的提交中。然而,使用这些选项时,需要手动处理一些繁琐的步骤,例如查找正确的提交ID或执行rebase操作,这可能会导致工作流程变得复杂和冗长。
解决方法:
为了简化和自动化这些繁琐的步骤,可以使用git-fixup
命令。该命令通过分组显示修改的文件、提交相应的fixup更改和执行自动rebase操作,大大简化了使用--fixup
/--squash
选项的工作流程。通过使用git fixup
命令,可以避免手动查找提交ID或执行rebase操作的麻烦,提高工作效率。
git的squash和fixup命令是在1.7版本中添加的。通过这两个命令,我们可以将多个commit合并成一个或者将一个commit合并到另一个commit中。
上面的代码是用来创建一些别名,以便更容易地使用git的squash和fixup命令。这些别名被添加到~/.gitconfig文件中。具体的别名定义如下:
[alias]
fixup = !sh -c 'REV=$(git rev-parse $1) && git commit --fixup $@ && git rebase -i --autosquash $REV^' -
squash = !sh -c 'REV=$(git rev-parse $1) && git commit --squash $@ && git rebase -i --autosquash $REV^' -
这里定义了两个别名,分别是fixup和squash。fixup命令用于将一个commit合并到另一个commit中,squash命令用于将多个commit合并成一个。具体的使用方法如下:
$ git commit -am 'bad commit'
$ git commit -am 'good commit'
$ git add . # Stage changes to correct the bad commit
$ git fixup HEAD^ # HEAD^ can be replaced by the SHA of the bad commit
上面的代码首先提交了两个commit,其中一个是错误的commit,另一个是正确的commit。然后通过git add命令将修改添加到正确的commit中。最后使用git fixup命令将错误的commit合并到正确的commit中。
这里需要注意的是,错误的commit可以是多个,不一定只有一个。使用fixup命令时,可以将多个错误的commit合并到一个正确的commit中。
另外,还可以通过添加--autostash选项来自动保存当前工作目录的修改。这样在进行rebase操作时不会丢失当前的修改。可以将上面的fixup命令修改为:
fixup = !sh -c 'REV=$(git rev-parse $1) && git commit --fixup $@ && git rebase -i --autosquash --autostash $REV^' -
这样就可以在使用fixup命令时自动保存当前的修改了。
总之,通过使用git的squash和fixup命令,我们可以更方便地合并和修改commit。通过添加别名,可以进一步简化使用的过程。