安全的git rebase

maa*_*nus 5 git rebase

很多时候,在处理一件事情时,我会发现一些不相关的代码中的丑陋,修复它并单独提交.通常,有多个这样的提交,因为我后来发现类似的问题.

最后,我重新定义(重新排序和压缩),以便提交更有意义.有时候,我会遇到合并冲突,有时候生成的工作树与变基前的工作树不同.

  • 即使没有冲突,也会出现这种差异吗?
  • 当差异发生时,有没有办法得到(巨大的闪烁)警告?

rye*_*nus 3

即使没有冲突,也会出现这种差异吗?

也许不是,但人为错误是我们应该始终考虑的一个因素。

当差异发生时,有没有办法得到(巨大的闪烁)警告?

这应该做:

git diff ORIG_HEAD HEAD
Run Code Online (Sandbox Code Playgroud)

要自动执行此操作,请使用post-rewrite钩子(请参阅Git Hooks):

重写后

该钩子由重写提交的命令调用(git commit --amend、git-rebase;当前 git-filter-branch 不调用它!)。它的第一个参数表示调用它的命令:当前是 amend 或 rebase 之一。将来可能会传递更多与命令相关的参数。

然后在钩子脚本中.git/hooks/post-rewrite我们可以比较ORIG_HEADHEAD,如果不同则发出警告:

git diff ORIG_HEAD HEAD
Run Code Online (Sandbox Code Playgroud)

要使钩子全局可用,请考虑 config core.hooksPath,例如:

#!/bin/sh

diff_rebase() {
    # echo "Old HEAD: $(git rev-parse ORIG_HEAD)"
    # echo "New HEAD: $(git rev-parse HEAD)"
    if ! git diff --quiet ORIG_HEAD HEAD; then
        >&2 echo "NOTE: diff detected after rebase!"
    else
        echo "rebase well done"
    fi
}

# bypass git amend
[ "$1" = "rebase" ] && diff_rebase
Run Code Online (Sandbox Code Playgroud)

然后将脚本保存为/usr/local/git-hooks/post-rewrite,并设置可执行权限。

注意:不幸的是,似乎有一个错误,即git rebase -i当使用自定义钩子目录时,交互式变基不会触发钩子。(我使用的是 git 2.9.2)