3

我经常使用“修复!”,“壁球!” 和“rebase -i”来清理、纠正或只是摆弄最近的、未推动的历史。我想找到一种方法让 Git 自动选择哪个提交对交互式 rebase 最有意义,这样我就可以定义一个别名来进行快速交互式 rebase。

我认为在这种情况下最好的提交将是最近的祖先:

  • 出现在任何其他分支(本地或远程)
  • 有不止一个父母
  • 没有父母

第一个条件确保我不会重写可能影响其他人的提交。第二个确保我不会尝试“通过”合并来变基,这绝对不是我想要的。第三个只是一个健全性检查。

所以问题是,我如何使用 Git 找到那个提交?

4

2 回答 2

1

不完全是您要查找的内容,但是在git rebase没有给出起点的情况下调用将使 rebase 从上游分支开始,这在大多数情况下是一个完美的选择。进一步变基会导致您重写已发布的历史记录,这绝不是一个好主意。

于 2012-12-20T17:43:36.410 回答
0

所以它并不漂亮,但这就是我想出的。

#! /bin/sh

commit=$(git rev-parse HEAD)

while [ "$(git log --format="%p" -1 $commit | wc -w)" -eq 1 ] \
      && [ "$(git branch --all --contains $commit | wc -l)" -eq 1 ]
do
    commit=$(git rev-parse "$commit^")
done

echo $commit

我确信有一种更简单、更强大的方法可以实现这一点,但它似乎可以满足我的要求。非常欢迎提出建议和改进。(例如,最好只使用 Git 管道而不是依赖wc.)

于 2013-01-02T17:14:05.260 回答