如何撤消 Git 中的提交

在使用 Git 时,有时您可能想要撤消/还原您所做的最新提交。

在 git 中撤消提交的最简单方法是使用 revert 选项。

git revert <COMMIT-NAME>

这将撤消最近的提交。

实际上有两种方法可以实现这一点。

  • git revert – 恢复 git 存储库的先前状态,并使更改反映在 git log
  • git reset:让它看起来像你刚刚从未存在过的提交(基本上删除提交)

还原现有提交

当你想撤消 Git 中的提交但又希望它反映在 Git 日志中时(历史文档在你需要之前感觉是不必要的),你应该使用 git revert 领域。

以下是语法 git revert 领域:

git revert <COMMIT-NAME>

提交名称可以是您用来指代提交的任何内容。 它可以是提交的 SHA1 校验和(您在执行提交时会得到它)、标签、引用名称……任何唯一标识提交的内容。

让我给你看一个 example.

让我在 git 中初始化一个文件。

$ git commit -m "init commit"
[master (root-commit) b1adf72] init commit
 1 file changed, 3 insertions(+)
 create mode 100644 README.md

$ echo "a new line in readme" >> README.md

我先 cat README 以验证其内容。

$ cat README.md
# Heading

A readme is useless if it is empty. But this readme is even more useless because it wastes the reader's time.
a new line in readme

然后我将它添加到暂存使用 git add . 我做出一个承诺,“一个永远存在的承诺”。

$ git commit -m 'a commit that will live on for ever'
[master b731901] a commit that will live on for ever
 1 file changed, 1 insertion(+)

进行该提交给了我对该提交的引用(它是 master b731901). 现在,我通过执行返回到上一次提交的状态 git revert 并提及该承诺。

$ git revert master b731901
[master 01c9be7] Revert "a commit that will live on for ever"
 1 file changed, 1 deletion(-)

为了确保提交反映在 Git 日志中,我运行了 git log. 在这里它在那里。

$ git log
commit 01c9be75eff7b5ae48c6c35bbb7c63ac1ebc3fcd (HEAD -> master)
Author: Pratham Patel <[email protected]>
Date:   Mon Feb 28 21:29:36 2022 +0530

    Revert "a commit that will live on for ever"

    This reverts commit b731901deaa30851832c07b7cb7ed535b68d473d.

commit b731901deaa30851832c07b7cb7ed535b68d473d
Author: Pratham Patel <[email protected]>
Date:   Mon Feb 28 21:29:12 2022 +0530

    a commit that will live on for ever

commit b1adf72e535921ff966ff78f062943b717e78a08
Author: Pratham Patel <[email protected]>
Date:   Mon Feb 28 21:20:43 2022 +0530

    init commit

但是,README 文件就像从未被修改过一样。 它反映了它在 Git 中“初始提交”提交时所处的状态。

$ cat README.md
# Heading

A readme is useless if it is empty. But this readme is even more useless because it wastes the reader's time.

删除承诺的存在。

如果你想让它看起来像你错误创建的提交从一开始就不存在,使用 git reset.

提交是 Git 存储库的快照。 Git 有一个引用变量,叫做 HEAD; 您在查看日志时可能已经看到了这一点 git log.

这个变量 HEAD 用于指向您正在处理的分支的最新提交。

让我在 git 中启动文件更改。

$ git commit -m "init commit"
[master (root-commit) b1adf72] init commit
 1 file changed, 3 insertions(+)
 create mode 100644 README.md

$ echo "a new line in readme" >> README.md

$ cat README.md
# Heading

A readme is useless if it is empty. But this readme is even more useless because it wastes the reader's time.
a new line in readme

让我们确认此更改:

$ git add .

$ git commit -m "a commit that i will regret later on"
[master fb58caf] a commit that i will regret later on
 1 file changed, 1 insertion(+)

现在,我将通过使用 git reset 命令完全删除它来撤消此提交。

$ git reset --soft HEAD~1

让我们看一下 git 提交历史。

$ git log
commit b1adf72e535921ff966ff78f062943b717e78a08 (HEAD -> master)
Author: Pratham Patel <[email protected]>
Date:   Mon Feb 28 21:20:43 2022 +0530

带有消息“我稍后会后悔的确认”的确认去了哪里?

它被完全删除是因为我移动到 HEAD 指向的倒数第二个引用(由 HEAD~1).

幸运的是,我们在“README.md”文件上完成的所有工作都不会受到删除提交的影响。

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   README.md

--soft 标志确保在执行时唯一修改的东西 git reset command是git保存的日志。

如果您还想将 git 存储库的内容恢复到以前的状态,请使用 --hard 班德拉, 小心.

结论

要在 git 提交的上下文中执行撤消,我们使用 git revert 这是一个在日志中反映 git 存储库实际历史的操作。 尽管, git reset 完全从历史中删除提交。

git revert 这是两者中更安全的选择,只有在情况需要时才应避免。