我有一个Git存储库,看起来像这样:

A <- B <- C <- D <- HEAD

我希望分支的头部指向A,即,我希望B、C、D和head消失,我希望头部与A同义。

听起来我可以尝试重新设置基础(不适用,因为我已经在两者之间进行了更改),也可以恢复。但如何恢复多次提交?我一次回复一个吗?订单重要吗?


当前回答

我觉得有用的干净方式

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

可能比这里的其他方法不那么优雅,但我一直使用get-reset--hardHEAD~N来撤销多次提交,其中N是您想要返回的提交次数。

或者,如果不确定确切的提交次数,只需多次运行git-reset--hardHEAD^(返回一次提交),直到达到所需的状态。

在我看来,一个非常简单和干净的方法可以是:

回到A

git checkout -f A

将master的头指向当前状态

git symbolic-ref HEAD refs/heads/master

save

git commit

如果你

合并提交和您无法恢复,并且你不介意粉碎你要还原的历史,

那么你可以

git reset --soft HEAD~(number of commits you'd like to revert)
git commit -m "The stuff you didn't like."
git log
# copy the hash of your last commit
git revert <hash of your last (squashed) commit>

然后,当您想要推送更改时,请记住使用-f标志,因为您修改了历史记录

git push <your fork> <your branch> -f

首先确保您的工作副本未被修改。

然后:

git diff --binary HEAD commit_sha_you_want_to_revert_to | git apply

然后就承诺吧。不要忘记记录还原的原因。