git: squash/fixup earlier commit

12 浏览
0 Comments

git: squash/fixup earlier commit

假设你有:

A-B-C

现在你的构建/测试失败了。修复应该合并到A中。

我的当前工作流程如下:

$ git commit -m "fixA"
A-B-C-fixA
$ git rebase -i A~1

然后在A中合并fixA,结果是:

A'-B-C

是否有一条命令可以做类似这样的操作:

A-B-C +(包含对A的修复的索引)

$ git commit -supperdupper A

结果:

A'-B-C

0
0 Comments

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操作的一些解决方法和建议。对于更详细的示例,可以参考这个链接

0
0 Comments

在我的当前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操作的麻烦,提高工作效率。

源链接:https://github.com/ohmu/git-crust

0
0 Comments

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。通过添加别名,可以进一步简化使用的过程。

0