首先,我以前在这里看到了这个问题的答案,但是它被这么多的"答案"掩埋,这些"答案"没有正确地回答我的问题,以至于我找不到它。
因此,它去了:我如何将git恢复到历史记录中的先前版本,以便成为我当前历史的新提交?
基本上,这是我想使用版本控制系统最基本的事情。简单地进行重置不起作用,因为它丢弃了我的历史记录,一个简单的还原也无法工作,因为有时它会给我错误消息(如果没有任何错误消息,我想做的事情应该是可能的(。
编辑:如果我只是做git revert
,则会发生此错误:
git revert HEAD~1
error: could not revert f1b44e3... Towards translating API to kernel.
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
简单地" checkout
the Commit"。这将用历史记录中的仓库的指定快照(提交(覆盖您当前的工作目录,并使您可以按照自己的意愿进行和提交新的工作集。如果您之后立即commit
,则您的存储库将具有与您执行checkout
的提交相同的文件系统内容(假设您没有其他尚未上演或上演更改(
这将不是重写历史记录,也不会编辑或删除任何以前的提交 - 因此它的工作类似于MediaWiki上的"回滚":
cd ~/git/your-repo-root
git log
# find the commit id you want
git checkout <commitId> .
# IMPORTANT NOTE: the trailing `.` in the previous line is important!
git commit -m "Restoring old source code"
另请参见:回滚旧的git订单在公共仓库中
关于.
(dot(
.
(dot(字符的意思是"当前目录" - 它不是git的任何特殊或独特的东西,它是在Windows,Linux,MacOS甚至MS-DOS上相同的标准命令行文件系统约定。它的工作类似于..
的含义"父目录"。我建议阅读以下内容:
- https://askubuntu.com/questions/54900/what-do-and-mean-when-when-in-in-a-folder
- https://superuser.com/questions/37449/what-are-and-and-in-a-a-directory
- Linux中的双点(..(和单点是什么?
- https://unix.stackexchange.com/questions/118175/what-are-are-some-uses-of-single-period-double-double-period-period-in-the-shell-command
关于checkout
请注意:checkout
是GIT中的一个过载命令 - 它可能意味着切换分支(LA svn switch
(或从历史程序中获取特定的文件或提交并放入工作空间(LA svn update -r <id>
(。这也可能意味着其他事情:https://git-scm.com/docs/git-checkout-我很感激它会让人们感到困惑,尤其是我自己使用TF多年后开始使用git(在其中"结帐"中,"签约"意味着其他一些东西完全(。
编辑:我看到您要保留历史记录,因此下面的答案被无效。但是,它仍然有用。您可以在编辑器中重新排序行,然后继续。
现在,回到原始答案。
您可以尝试rebase命令。
git rebase -i HEAD~n
n
比当前和要恢复为当前的提交数量大约要多。假设,删除最后3个提交:
git rebase -i HEAD~4
一旦您在那里,它将在VIM或Nano(或其他编辑器(中打开。只需删除承诺删除的行,然后退出编辑器即可。
在VIM中,将是esc
和类型:exit
enter
。
现在,只需推动它。这将导致错误,所以推动力量。
git push -f
您可能也必须指定分支名称和上游。那应该做到!
此方法完全删除了糟糕的consits ,因此它不仅会随着恢复更改添加新提交。
这是文档:https://git-scm.com/docs/rebase
使用git还原https://git-scm.com/docs/git-revert
git revert HEAD~1
记下当前头的提交哈希
-
git reset --hard <old-commit>
-
git reset --soft <previous-HEAD>
-
git add . && git commit -m "message"
完成!