我们想要撤消最后 2 次都推送到原始主控的提交。在 tortoise git 中,我们可以查看历史记录,然后单击上次提交后的第 3 个,然后选择“将 master 重置为此”,我们猜测这意味着恢复到此版本。
但是,当您选择此选项时,您必须从以下三个选项之一中进行选择:
不幸的是,我们不知道我们应该选择这 3 个选项中的哪一个 - 我们只想撤消最后两次提交并及时返回。
下一个问题是此操作是在远程源、您的存储库、您的工作目录还是这三者的组合上发生?例如,是否必须在还原后进行提交和推送,或者它是否为您执行此操作?
我们会猜测 HARD 是我们想要的 - 它会将存储库(不确定是哪个)和我们的本地源代码恢复到以前的版本。如果是这种情况,为什么这不是默认值,另外两个选项的用例是什么?要么你想恢复,要么不恢复,如果你只恢复远程仓库,而不是你的本地工作文件,那么你将处于混乱状态。
我们没有任何本地修改的文件。
请注意,我们非常渴望一个不会破坏 git 的解决方案(我们过去曾破坏过 git,不得不创建一个新的 repo)。也许另一种方法是可行的,例如检出以前的版本,然后在最新版本的顶部检入,但我们不知道如何执行此操作。
我们知道我们可以做这样的事情:
git checkout [revision]
Run Code Online (Sandbox Code Playgroud)
但是我们如何告诉 git 我们想要让这个版本成为新的 head 或者用这个替换 head 呢?我猜我们不能只提交,因为没有什么可提交的,因为我们不再是主人。顺便说一句,如果您查看上一个。版本,修改它,然后提交,你提交什么,提交到哪里?
我已经阅读了https://www.atlassian.com/git/tutorials/undoing-changes但它没有解决本地和远程 repos 之间的关系。如果要撤消的提交全部推送到远程源主机,则不清楚恢复远程源、本地存储库和工作目录的方法是什么——所有 3 项都必须恢复到 3 次提交之前的提交。我们真的不在乎这是通过重置还是还原来完成的——我们只需要一种方法来做到这一点,它适用于所有 3 个位置。
正确的接收方可能是这样的:
git status (we are on master with a clean working dir)
git git revert HEAD~2
git commit -m "revert"
git push origin mater
Run Code Online (Sandbox Code Playgroud)
但是我们从来没有在例子中看到过这组步骤,如果可能的话,宁愿用 tortoise git 来做。
小智 52
有两种方法可以做到这一点。
对于第一个解决方案,您可以使用以下命令:
git reset --hard <commit-id>
Run Code Online (Sandbox Code Playgroud)
这会将您当前所在的分支的头带到特定的“commit-id”,这对您来说是正确且正确的。
git push -f origin <branch-name>
Run Code Online (Sandbox Code Playgroud)
该命令将强制推送到您所在的分支。该命令与上述命令的组合可以使您从最顶部开始删除分支中所有不必要的提交,直到这个“commit-id”
笔记: This won't remove the "commit-id" everything up till the "commit-id" will be removed from your branch.
对于第二种解决方案,您可以使用以下命令:
git revert <commit-id>
Run Code Online (Sandbox Code Playgroud)
此命令用于恢复您尝试撤消的特定“commit-id”。
如果您错误地将另一个分支合并到不同的分支中,那么您可以使用此命令来恢复合并请求:
git revert -m 2 <commit-id>
Run Code Online (Sandbox Code Playgroud)
此命令用于恢复或删除合并提交“commit-id”中发生的所有更改。这将允许恢复合并提交“commit-id”,并且还将删除此合并带来的所有提交更改。但它不会删除合并带来的提交
小智 8
这个解决方案节省了我的时间
1) git reset --hard 93827927ed6e245be27f94c93c7e3574e85b91c6 (这是你的提交ID)
2) git reset HEAD~1
3) git stash
4) git add 。
5) git commit -m "你的新提交信息在这里"
6) git push --force
有两种选择:
revertreset --hard和push --force。如果您不确定,请使用revert,这是最安全的选择。
如果您真的非常喜欢删除提交并且不关心更改的历史记录,请使用reset --hard和push --force。这有以下后果:
下一个问题是此操作是在远程源、您的存储库、您的工作目录还是这三者的组合上发生?例如,是否必须在还原后进行提交和推送,或者它是否为您执行此操作?
一般来说,TortioseGit 中的所有更改都在您的克隆(“工作副本”)中。也推送总是手动操作
我们会猜测 HARD 是我们想要的 - 它会将存储库(不确定是哪个)和我们的本地源代码恢复到以前的版本。如果是这种情况,为什么这不是默认值,另外两个选项的用例是什么?
因为hard删除提交和历史,这是一个危险的操作。您也可以删除其他人的更改!
其他两个选项的用例是什么?
请参阅git reset --mixed、--soft 和 --hard 之间的区别是什么?
我认为您对恢复和重置感到困惑,请参阅撤消更改:
\n\n恢复
\n\n\n\n\ngit revert 命令撤消已提交的快照。但是,它不是从项目历史记录中删除提交,而是找出如何撤消该提交引入的更改,并附加一个新的提交以及结果内容。这可以防止 Git 丢失历史记录,这对于修订历史记录的完整性和可靠的协作非常重要。
\n
重置
\n\n\n\n\n如果 git revert 是撤消更改的 \xe2\x80\x9csafe\xe2\x80\x9d 方法,则可以将 git\n Reset 视为危险方法。当您使用 git reset 撤消(并且提交不再被任何引用或引用日志引用)时,\n 无法检索原始副本\xe2\x80\x94,这是永久撤消。使用此工具时必须小心,因为它是仅有的可能会丢失您的工作的 Git 命令之一。
\n
也许在你的情况下最好使用恢复:
\n\n\n\n在这种情况下,您只需创建新的提交,这将恢复特定的提交,没有历史记录更改。您可以在本地执行此操作,然后推送到远程。
\n\n如果您仍然想要重置并且不需要保留本地更改,则可以进行硬重置:
\n\n\n\n然后你应该强制推送:
\n\ngit push -f\nRun Code Online (Sandbox Code Playgroud)\n