-
1. 起步
-
2. Git 基础
-
3. Git 分支
-
4. 服务器上的 Git
- 4.1 协议
- 4.2 在服务器上部署 Git
- 4.3 生成 SSH 公钥
- 4.4 架设服务器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管服务
- 4.10 小结
-
5. 分布式 Git
-
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
最终你只有一个提交——第二个提交取代了第一个提交的结果。
|
注意
|
重要的是要理解,当你修改最后一个提交时,你不是在“修复”它,而是在用一个全新的、改进的提交“替换”它,它将旧的提交推开,并将新的提交放在它的位置上。实际上,这就像之前的提交从未发生过一样,并且不会出现在你的仓库历史记录中。 修改提交的明显价值在于对你最后一个提交进行小的改进,而不会用“哦,忘了添加文件”或“该死,修复最后一个提交中的拼写错误”之类的提交信息弄乱你的仓库历史记录。 |
|
注意
|
只修改尚未推送到任何地方的本地提交。修改已推送的提交并强制推送分支将给你的协作者带来麻烦。关于发生这种情况以及如何处理接收方的信息,请阅读 Rebase 的危险。 |
取消暂存一个已暂存的文件
接下来的两个部分演示了如何处理你的暂存区和工作目录更改。好处是,你用来确定这两个区域状态的命令也会提醒你如何撤销对它们的更改。例如,假设你更改了两个文件,并希望将它们作为两个单独的更改提交,但你意外地键入了 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 详解 中更详细地介绍 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
|
重要提示
|
重要的是要理解 |