我该如何从本地仓库撤销这些提交?
HEAD:
在重置提交之前,我们应该了解 HEAD... HEAD 就是你当前工作目录中的状态。它由一个提交号表示。
Git 提交:
每个更改都被分配给一个提交,用一个唯一的标签表示。提交不能被删除。所以如果你想要回到上一个提交,可以简单地使用 git reset
。
有两种方法可以进入最后一个提交:
方法 1:(如果你不知道提交号码,但想要移动到第一个提交)
git reset HEAD~1 # It will move your head to last commit
方法2:(如果您知道要重置到的提交,请直接重置到已知提交)
git reset 0xab3
#提交编号
注意:如果您想了解最近的提交,请尝试git log -p -1
这是图形表示:
只需使用 git reset --hard <上一个正确的 SHA 值>
来撤销您的更改并创建新的提交。您也可以使用 git checkout -- <错误的文件名>
。
git reset --soft HEAD~1
git status
在主分支上
您的分支领先于'origin/master' 1个提交
(使用"git push"将本地提交发布)要提交的更改:
(使用"git restore --staged ..."取消暂存)
新文件: file1
git log --oneline --graph
- 90f8bb1 (HEAD -> master) 第二次提交 \
- 7083e29 初始存储库提交 \
在选择具体工具(命令)之前,请先确定您需要什么,而不是盲目运行命令。
如果您想要编辑您的最后一次提交,有一个命令可以使用。
优点:它允许您更正最后一次提交的消息,并添加更多的更改。
git commit --amend
真的想要撤销最后一次提交(因为有大量更改或者您想要全部丢弃)。
优点:重置命令将返回到当前版本之前的版本,有效地撤消了最后一次提交。
A. 软重置
优点:软标记。它保证了在撤消版本中所做的修改的保存。运行该命令后,更改将出现在您的工作副本中,作为未提交的本地修改。
git reset --soft HEAD~1
B. 强制重置
优点:如果您不想保留这些更改,只需使用--hard
标志。请确保仅在确信不再需要这些更改时执行此操作。
git reset --hard HEAD~1
优点:
这个命令会告诉 Git 将 HEAD 指针向后移动一个提交。但是,文件的修改不会受到影响。现在,如果你运行 git status
,应该仍然能够看到本地文件的更改。
git reset HEAD~1
根据您的需求使用。
如果您想要删除错误文件,您应该执行以下操作:
git reset --soft <您最后一个正确的提交哈希值>
。
在这里,如果您执行git status
,您将会在暂存区中看到这些文件。您可以选择错误的文件并将它们从暂存区中移除,如下所示:
git reset 错误文件1 错误文件2 错误文件3
现在您只需添加需要推送的文件:
git add 正确文件1 正确文件2
提交更改:
git commit -v
或 git commit -am "信息"
然后推送:
git push origin master
但是,如果您不关心更改的文件,您可以硬重置为以前正确的提交,并将所有内容推送到服务器上。方法如下:
git reset --hard <your_last_good_commit_hash_here>
git push origin master
如果您已经将错误的文件发布到服务器上,您可以使用--force
标志向服务器推送并编辑历史记录。
git push --force origin master
在IntelliJ IDEA中,您只需按下Alt+9,右键单击提交列表中的某个标记,并选择:"Reset Current Branch to Here..."即可打开Git存储库日志。
每次需要撤销一个或多个提交时,我所做的是:
git reset HEAD~<n>
// 撤销最近的 n 个提交
git status
// 可选。现在所有文件都是红色的(未暂存)。
现在,我可以仅添加和提交我需要的文件:
git add <file names> & git commit -m "message" -m "details"
git checkout <filename>
git push origin <branch name> -f
// 使用-f参数来强制推送。当您想保持历史记录干净时,变基和删除提交是最好的选择, 在向公共分支提供补丁时非常有用。
如果您必须删除最上面的提交,则可以使用以下一行命令:
git rebase --onto HEAD~1 HEAD
但是如果你想要撤销你所做的多个提交中的其中一个,比如:
a -> b -> c -> d -> 主分支
而你想要撤销提交 'c'
git rebase --onto b c
这将把'b'作为'd'的新基础,消除'c'
为了撤销最近的本地提交,但不丢弃其更改,我在 ~/.gitconfig
中设置了这个方便的别名。
[alias]
undo = reset --soft HEAD^
然后我只需使用git undo
,这非常容易记忆。
git reflog
已经接近你所描述的内容,但它给用户更多的控制权来确定需要(撤销)做的事情。但是请注意,“撤销”在各个地方的工作方式不同,人们会期望这个功能实现许多不同的事情。撤销上一个提交?撤销上一个操作?如果最后一个操作是推送,如何撤销,(重置并推送)还是(撤销并推送)? - Romain Valeri