我有一个Git存储库,看起来像这样:
A <- B <- C <- D <- HEAD
我希望分支的头部指向A,即,我希望B、C、D和head消失,我希望头部与A同义。
听起来我可以尝试重新设置基础(不适用,因为我已经在两者之间进行了更改),也可以恢复。但如何恢复多次提交?我一次回复一个吗?订单重要吗?
我有一个Git存储库,看起来像这样:
A <- B <- C <- D <- HEAD
我希望分支的头部指向A,即,我希望B、C、D和head消失,我希望头部与A同义。
听起来我可以尝试重新设置基础(不适用,因为我已经在两者之间进行了更改),也可以恢复。但如何恢复多次提交?我一次回复一个吗?订单重要吗?
当前回答
使用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
其他回答
这些都不适用于我,所以我有三次提交要恢复(最后三次提交),所以我做到了:
git revert HEAD
git revert HEAD~2
git revert HEAD~4
git rebase -i HEAD~3 # pick, squash, squash
工作起来很有魅力:)
这是Jakub回答中提供的解决方案之一的扩展。
我面临的情况是,我需要回滚的提交有些复杂,其中几个提交是合并提交,我需要避免重写历史。我无法使用一系列git-restore命令,因为我最终在添加的反转更改之间遇到了冲突。我最终使用了以下步骤。
首先,检查目标提交的内容,同时将HEAD留在分支的顶端:
git checkout -f <target-commit> -- .
(--确保<targetcommit>被解释为提交而不是文件;.指的是当前目录。)
然后,确定在回滚的提交中添加了哪些文件,因此需要删除这些文件:
git diff --name-status --cached <target-commit>
添加的文件应在行的开头显示为“A”,并且不应有其他差异。现在,如果需要删除任何文件,请暂存这些文件以进行删除:
git rm <filespec>[ <filespec> ...]
最后,提交回复:
git commit -m 'revert to <target-commit>'
如果需要,请确保返回到所需状态:
git diff <target-commit> <current-commit>
应该没有区别。
我很沮丧,这个问题无法得到回答。其他所有问题都与如何正确还原和保存历史有关。这个问题说:“我希望分支的头部指向A,即我希望B、C、D和head消失,我希望头部与A同义。”
git checkout <branch_name>
git reset --hard <commit Hash for A>
git push -f
我在阅读Jakub的帖子时学到了很多东西,但公司里的一些人(可以在没有Pull Request的情况下推送到我们的“测试”分支)推送了五次错误的提交,试图修复他在五次提交之前犯的错误。不仅如此,还接受了一到两个拉取请求,但现在情况很糟糕。所以忘掉它吧;我找到了最后一个好的提交(abc1234),并运行了基本脚本:
git checkout testing
git reset --hard abc1234
git push -f
我告诉在这个仓库工作的其他五个人,他们最好记录下过去几个小时的变化,并从最新的测试中删除/重新广播。故事结束。
如果您想暂时恢复功能的提交,那么可以使用以下一系列命令。
下面是它的工作原理
git log --pretty=oneline | grep 'feature_name' | cut -d ' ' -f1 | xargs -n1 git revert --no-edit
首先确保您的工作副本未被修改。
然后:
git diff --binary HEAD commit_sha_you_want_to_revert_to | git apply
然后就承诺吧。不要忘记记录还原的原因。