git - 如何在不丢失文件的情况下撤消 git 提交?

标签 git version-control

这个问题在这里已经有了答案:





How do I undo the most recent local commits in Git?

(98 个回答)


2年前关闭。




以下是我在工作中经常发生的事情:

[user@macmini ~/code/project $] git add .
[user@macmini ~/code/project $] git commit -m "Fixed whatever bug"
[master 93a3c47] Fixed whatever bug
 3 files changed, 290 insertions(+)
 create mode 100644 .DS_Store
 create mode 100755 some-code.js
 create mode 100755 some-other-code.js

如您所见,我不小心提交了 .DS_Store在 Finder 中打开文件夹后 macOS 喜欢创建的文件。

在这种情况下,我通常会再次克隆 repo,复制并粘贴我的新代码,然后在没有 .DS_Store 的情况下再次提交。 .但我知道这不是干净的方法。

那么,我怎样才能干净利落地撤消提交呢?我试过 git reset --hard HEAD但它也会删除我的新文件。

最佳答案

git reset HEAD~1

这将“撤消”您的最后一次提交,而不会触及您的工作目录(我们的任何文件)。同git reset --mixed HEAD~1 .你也可以做git reset --soft HEAD~1 ,这将使所有文件都标记为提交。

如果您最喜欢您的提交,但只想对其内容或其提交消息进行小的更改,您可以修改当前的提交:
git rm .DS_Store
git commit --amend

这将提示您编辑提交消息(您可以保持不变),然后将使用您的更改修改提交。
git reset基本上意味着“将我当前的分支移动到给定的提交”,和 HEAD~1表示“上一次提交”。你的命令唯一的问题是它包含 --hard ,它说“哦,还要让我的所有文件看起来都像他们在那个提交中所做的那样”。

分支只是引用特定提交的标签;它可以自由移动(尽管如果你推了一个 Twig 然后你向后移动,当你尝试推或 pull 时会遇到问题)。

如果您觉得需要重新克隆存储库,git 中几乎总有更好的解决方案。在 git 中提交,其中的文件可以撤消、重做、移动,有时甚至可以复活。此外,提交是本地的:在您推送之前没有人看到它们。

关于git - 如何在不丢失文件的情况下撤消 git 提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53805732/

相关文章:

version-control - 如何在运行 'update'之前查看存储库中的文件

git - 尝试使用 git 设置文件名长度限制 - 权限被拒绝

Git cherry-pick 语法和 merge 分支

git - 嵌套的 Git 存储库?

git - Jenkins GitSCM 在特定文件夹中 checkout

version-control - Mercurial 会帮助我在两台电脑上工作吗?

linux - 通过代理 ssh 使用 Docker 错误

linux - 无法为命令行 Git 切换 GitLab 帐户

mysql - 是否可以对像 GIT 这样的数据库进行版本控制?

version-control - 虚拟机中的版本控制