-
A1. 附录 A:其他环境下的 Git
- A1.1 图形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 总结
-
A2. 附录 B:在你的应用程序中嵌入 Git
-
A3. 附录 C:Git 命令
2.4 Git 基础 - 撤销操作
撤销操作
在任何阶段,你都可能想要撤销某些操作。在这里,我们将回顾一些用于撤销你所做更改的基本工具。请小心,因为你无法总是撤销某些撤销操作。这是 Git 中为数不多的,如果操作错误可能会丢失某些工作的地方。
一个常见的撤销操作发生在当你提交过早,可能忘记添加一些文件,或者你弄乱了提交消息。如果你想重做该提交,请进行你忘记的附加更改,暂存它们,然后使用 --amend
选项再次提交
$ git commit --amend
此命令采用你的暂存区域并将其用于提交。如果你自上次提交以来没有进行任何更改(例如,你在上一次提交后立即运行此命令),那么你的快照将看起来完全相同,你将只会更改你的提交消息。
相同的提交消息编辑器会启动,但它已经包含你先前提交的消息。你可以像往常一样编辑消息,但它会覆盖你先前的提交。
例如,如果你提交后意识到你忘记暂存想要添加到此提交的文件中的更改,你可以这样做
$ git commit -m 'Initial commit'
$ git add forgotten_file
$ git commit --amend
你最终会得到一个提交 — 第二个提交替换了第一个的结果。
注意
|
重要的是要理解,当你修改你的最后一次提交时,你并不是在修复它,而是完全用一个新的、改进的提交替换它,该提交将旧的提交移开并将新的提交放在其位置。实际上,就好像以前的提交从未发生过一样,它不会显示在你的存储库历史中。 修改提交的明显价值在于对你的最后一次提交进行小的改进,而不会用诸如“哎呀,忘记添加文件”或“糟糕,修复上次提交中的错字”之类的提交消息来混乱你的存储库历史记录。 |
注意
|
仅修改仍然是本地的且尚未推送到任何地方的提交。修改先前推送的提交并强制推送分支会导致你的协作者出现问题。有关执行此操作时发生的情况以及如果在接收端如何恢复的更多信息,请阅读 变基的风险。 |
取消暂存已暂存的文件
接下来的两个部分演示了如何使用你的暂存区域和工作目录更改。好处是,你用于确定这两个区域状态的命令还会提醒你如何撤消对它们的更改。例如,假设你更改了两个文件并想将它们作为两个单独的更改提交,但你意外地键入了 git add *
并暂存了它们。你如何取消暂存其中一个?git status
命令会提醒你
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
在“要提交的更改”文本的正下方,它说使用 git reset HEAD <file>…
来取消暂存。因此,让我们使用该建议来取消暂存 CONTRIBUTING.md
文件
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
该命令有点奇怪,但它有效。CONTRIBUTING.md
文件已修改但再次未暂存。
注意
|
的确, |
目前,你只需要知道关于 git reset
命令的这个神奇的调用方式。 在重置解密中,我们将更详细地介绍 reset
的作用,以及如何掌握它来做一些真正有趣的事情。
撤销对已修改文件的修改
如果你意识到你不想保留对 CONTRIBUTING.md
文件的更改怎么办? 你如何轻松地撤销修改 — 将其恢复到你上次提交时的状态(或者最初克隆时的状态,或者无论你如何将其放入工作目录)? 幸运的是,git status
也会告诉你如何做到这一点。 在上一个示例输出中,未暂存的区域如下所示
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
它非常明确地告诉你如何放弃你所做的更改。 让我们按照它说的做
$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
你可以看到更改已被还原。
重要提示
|
重要的是要理解 |
如果你想保留对该文件所做的更改,但现在仍然需要将其移开,我们将在Git 分支中介绍暂存和分支; 这些通常是更好的方法。
请记住,在 Git 中提交的任何内容几乎总是可以恢复的。 即使是已删除的分支上的提交,或使用 --amend
提交覆盖的提交也可以恢复(请参阅数据恢复进行数据恢复)。 但是,你丢失的任何从未提交的内容都可能永远无法再次看到。
使用 git restore 撤消操作
Git 版本 2.23.0 引入了一个新命令:git restore
。 它基本上是 git reset
的替代方案,我们刚刚介绍过。 从 Git 版本 2.23.0 开始,Git 将使用 git restore
而不是 git reset
来执行许多撤消操作。
让我们回顾一下我们的步骤,并使用 git restore
而不是 git reset
来撤消操作。
使用 git restore 取消暂存已暂存的文件
接下来的两节将演示如何使用 git restore
处理暂存区和工作目录更改。 好处是,你用来确定这两个区域状态的命令还会提醒你如何撤消对它们的更改。 例如,假设你更改了两个文件并希望将它们作为两个单独的更改提交,但是你不小心输入了 git add *
并暂存了它们。 你如何取消暂存其中一个? git status
命令会提醒你
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: CONTRIBUTING.md
renamed: README.md -> README
在“要提交的更改”文本下方,它说使用 git restore --staged <file>…
来取消暂存。 因此,让我们使用该建议来取消暂存 CONTRIBUTING.md
文件
$ git restore --staged CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
CONTRIBUTING.md
文件已被修改,但再次未暂存。
使用 git restore 撤销对已修改文件的修改
如果你意识到你不想保留对 CONTRIBUTING.md
文件的更改怎么办? 你如何轻松地撤销修改 — 将其恢复到你上次提交时的状态(或者最初克隆时的状态,或者无论你如何将其放入工作目录)? 幸运的是,git status
也会告诉你如何做到这一点。 在上一个示例输出中,未暂存的区域如下所示
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
它非常明确地告诉你如何放弃你所做的更改。 让我们按照它说的做
$ git restore CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.md -> README
重要提示
|
重要的是要理解 |