首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何撤消Git中最近的本地提交?

问如何撤消Git中最近的本地提交?
EN

Stack Overflow用户
提问于 2009-05-29 18:09:14
回答 100查看 12M关注 0票数 25.1K

我无意中将错误的文件提交到Git,但还没有将提交推到服务器。

如何撤消来自本地存储库的提交?

EN

回答 100

Stack Overflow用户

回答已采纳

发布于 2009-05-29 18:13:42

撤消提交和重做

代码语言:javascript
复制
$ git commit -m "Something terribly misguided" # (0: Your Accident)
$ git reset HEAD~                              # (1)
[ edit files as necessary ]                    # (2)
$ git add .                                    # (3)
$ git commit -c ORIG_HEAD                      # (4)
  1. git reset是负责撤销的命令。当将您的工作树(磁盘上文件的状态)保持不变时,它将撤消您的上次提交。,您需要在再次提交它们之前再次添加它们)。
  2. 修改工作树文件。
  3. git add您想要包含在新提交中的任何内容。
  4. 提交更改,重用旧的提交消息。reset将旧头复制到.git/ORIG_HEAD;-c ORIG_HEAD将打开一个编辑器,编辑器最初包含来自旧提交的日志消息,并允许您编辑它。如果不需要编辑消息,可以使用-C选项。

或者,要编辑上一次提交(或仅仅编辑它的提交消息),commit --amend将在当前索引中向前一次提交中添加更改。

若要删除(而不是还原)已推送到服务器的提交,必须使用git push origin main --force[-with-lease]重写历史记录。取而代之的是--force-with-lease,正如git手册中所指出的

如果您已经发布了重写历史,那么您应该了解重写历史的含义。

进一步阅读

确定SHA-1用于您希望还原的提交。有了这个值之后,使用上面解释的命令序列。

HEAD~和HEAD~1是一样的。如果您想要取消多次提交,那么本文盖特里的头是什么?是很有帮助的。

票数 27.4K
EN

Stack Overflow用户

发布于 2011-07-28 22:22:20

如果你不知道它是如何工作的,取消提交是有点可怕的。但如果你真的理解的话,这其实是非常容易的。我将向您展示撤销提交的4种不同方法。

假设你有这个,C是你的头,(F)是你文件的状态。

代码语言:javascript
复制
   (F)
A-B-C
    ↑
  master

备选案文1:git reset --hard

您希望销毁提交C,并丢弃任何未提交的更改。你这样做:

代码语言:javascript
复制
git reset --hard HEAD~1

结果是:

代码语言:javascript
复制
 (F)
A-B
  ↑
master

现在B是头。因为您使用了--hard,所以您的文件在提交B时被重置为它们的状态。

备选案文2:git reset

也许提交C不是一个灾难,但只是有点差。您希望撤消提交,但在进行更好的提交之前,请将更改保存一段时间进行编辑。再从这里开始,用C作为你的头:

代码语言:javascript
复制
   (F)
A-B-C
    ↑
  master

这样做,省去了--hard

代码语言:javascript
复制
git reset HEAD~1

在这种情况下,结果是:

代码语言:javascript
复制
   (F)
A-B-C
  ↑
master

在这两种情况下,HEAD只是最近提交的指针。执行git reset HEAD~1时,请告诉Git将头指针移回一次提交。但是(除非您使用--hard),您将保留原来的文件。现在,git status显示了您已签入C的更改。您没有丢失任何东西!

备选方案3:git reset --soft

对于最轻的触摸,您甚至可以撤消提交,但保留文件和 索引。

代码语言:javascript
复制
git reset --soft HEAD~1

这不仅使您的文件独处,甚至使您的索引独处。当您执行git status时,您将看到索引中有相同的文件。实际上,在这个命令之后,您可以执行git commit,然后重新执行刚才的提交。

选项4:您做了git reset --hard,需要将代码拿回来

还有一件事:假设您的像第一个示例那样销毁了一个提交,那么,然后发现您需要它,毕竟?运气不好,对吧?

不,还有办法把它拿回来。键入以下内容

代码语言:javascript
复制
git reflog

您将看到移动到的(部分)提交沙斯 (即散列)列表。找到已销毁的提交,然后执行以下操作:

代码语言:javascript
复制
git checkout -b someNewBranchName shaYouDestroyed

你现在已经复活了。提交实际上不会在Git中被销毁约90天,所以你通常可以回去拯救一个你不是有意要摆脱的。

票数 12.2K
EN

Stack Overflow用户

发布于 2011-06-16 17:27:23

有两种方法可以“撤消”上一次提交,具体取决于您是否已经将提交公开(推到远程存储库):

如何撤消本地提交

假设我是本地提交的,但现在我要删除该提交。

代码语言:javascript
复制
git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

要将一切恢复到上次提交之前的方式,我们需要在reset之前对提交进行HEAD

代码语言:javascript
复制
git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

现在,git log将显示我们的最后一次提交已经被删除。

如何撤消公开提交

如果您已经将提交公之于众,您将希望创建一个新提交,它将“恢复”您在以前提交(当前头)中所做的更改。

代码语言:javascript
复制
git revert HEAD

您的更改现在将被恢复并准备好提交:

代码语言:javascript
复制
git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

有关更多信息,请访问https://git-scm.com/book/en/v2/Git-Basics-Undoing-Things。

票数 2.6K
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/927358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档