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/

相关文章:

git rebase 在其他分支上

git - 是否可以将 git 提交标记为正在进行的工作?

git - 删除特定提交但之后保留所有提交

git - GitHub 存储库中的文件数

git-clone 内存分配错误

git - git可以自动识别相同的提交(具有不同的哈希值)

svn - 企业架构师: View the whole project's Subversion File History

linux - 用于有选择地排除 diff 文件的某些部分的交互式程序

git - 我应该将 master merge 到一个分支,然后再 merge 回 master 吗?

ruby-on-rails - 在 git 中管理 schema.rb 的首选方法是什么?