Git 如何回滚指定 author 的多个 commit

2018/05/14 Git

这是最近项目开发的过程中遇到的一个神奇的问题,同事需要把某个文件 file.txt 中,他做的相关修改都回滚。(已 push 到远端。) 但是问题在于别人也修改了相同的文件,如果直接回滚会把别人的更新也一起撤销。

第一个比较笨的办法是,把 HEAD 版本的 file.txt 文件和想要回滚的版本的 file.txt 做 diff,手动修改自己的部分。

如果 diff 数量比较少,是可以这么干的。不过由于想回滚的版本已经是几天前的了,所以显然不能这么干了。

1. Git 回滚的三种方式

参考:代码回滚:Reset、Checkout、Revert 的选择

总结一下:没有 push 的 commit,用 reset 回滚;已经 push 的 commit,用 revert 回滚。

2. 回滚指定 author 的所有 commit

参考:Revert all commits by a specific author since specific time

先获取指定 author 的 commit id 序列,然后一起回滚。

for sha in `git log --pretty=format:%H --author=myname file.txt`; do
        sharange="$sharange $sha";
done

git revert $sharange --no-commit
解决 conflict

在对 commit id 序列的 revert 操作中,发生冲突,会中断。

这时候需要手动解决 conflict,然后执行:

git revert —continue

继续回滚剩下的 commit id。

遇到 merge 节点错误

当某个 commit id 是个 mergr 的 commit 的时候,因为有多个父节点,所以 revert 无法自动选择回滚的父节点。 这时候需要用 ‘-m’ 参数指定回滚到哪个父节点。

参考:How to revert a merge commit that’s already pushed to remote branch?

选择 merge strategy

可以用 --strategy-option 参数来指定选择什么策略来 merge。

git revert $sharange --no-commit  --strategy-option=ours

我在这里使用了 --strategy-option=ours,意味着强制使用想要回滚的 commit id 版本来 merge 文件。

其他 strategy,见:

git-merge

git-revert

Search

    Table of Contents