我有一个Git存储库,看起来像这样:
A <- B <- C <- D <- HEAD
我希望分支的头部指向A,即,我希望B、C、D和head消失,我希望头部与A同义。
听起来我可以尝试重新设置基础(不适用,因为我已经在两者之间进行了更改),也可以恢复。但如何恢复多次提交?我一次回复一个吗?订单重要吗?
我有一个Git存储库,看起来像这样:
A <- B <- C <- D <- HEAD
我希望分支的头部指向A,即,我希望B、C、D和head消失,我希望头部与A同义。
听起来我可以尝试重新设置基础(不适用,因为我已经在两者之间进行了更改),也可以恢复。但如何恢复多次提交?我一次回复一个吗?订单重要吗?
当前回答
为此,您只需使用revert命令,指定要恢复的提交范围。
考虑到您的示例,您必须这样做(假设您在分支“master”上):
git revert master~3..master
或git revert B…D或git return D C B
这将使用B、C和D的反向提交在本地创建一个新的提交(这意味着它将撤消这些提交带来的更改):
A <- B <- C <- D <- BCD' <- HEAD
其他回答
还原共享存储库上的一组提交的简单方法是将git-rever与git-rev列表结合使用。后者将为您提供一个提交列表,前者将自己进行还原。
有两种方法可以做到这一点。如果要在一次提交中还原多次提交,请使用:
for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert --no-commit $i; done
这将恢复您需要的一组提交,但将所有更改保留在工作树上,之后应照常提交。
另一种选择是对每个还原的更改进行一次提交:
for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert --no-edit -s $i; done
例如,如果您有一个提交树
o---o---o---o---o---o--->
fff eee ddd ccc bbb aaa
要将更改从eee还原为bbb,请运行
for i in `git rev-list eee^..bbb`; do git revert --no-edit -s $i; done
可能比这里的其他方法不那么优雅,但我一直使用get-reset--hardHEAD~N来撤销多次提交,其中N是您想要返回的提交次数。
或者,如果不确定确切的提交次数,只需多次运行git-reset--hardHEAD^(返回一次提交),直到达到所需的状态。
与Jakub的回答类似,这允许您轻松选择要还原的连续提交。
# Revert all commits from and including B to HEAD, inclusively
git revert --no-commit B^..HEAD
git commit -m 'message'
我觉得有用的干净方式
git revert --no-commit HEAD~3..
git commit -m "your message regarding reverting the multiple commits"
此命令仅使用一次提交来还原最后3次提交。
也不重写历史,因此不需要强制推送。
这个帮助创建范围。意思是HEAD~3..与HEAD~3..HEAD相同
使用Git还原
也可以使用restore命令:
A <- B <- C <- D <- HEAD
假设你希望HEAD看起来和A完全一样,确保你已经找到了最新的主人。然后剪一根新树枝。
git switch -c feature/flux-capacitor # synonymous with checkout -b
git restore --source A .
git add .
git commit
git push
restore命令将所有内容(.)更改为--source提交时的内容。然后将其提交给本地分支,并将其推送到源。然后,您可以对其进行公关。
这样做的好处是不会改变其他人可能以其为基础的任何历史。它也为未来的人们留下了有用的历史。
文档:git restore