-
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
你最终会得到一个单独的提交 —— 第二个提交替换了第一个提交的结果。
|
注意
|
重要的是要理解,当你修改你的上一次提交时,你并不是在修复它,而是在**完全替换**它,用一个新的、改进的提交来取代旧的提交。实际上,就好像之前的提交从未发生过一样,它不会出现在你的仓库历史中。 修改提交的明显价值在于对你上次的提交进行小的改进,而不会用“哎呀,忘记添加一个文件”或“糟糕,修复上次提交中的一个错字”之类的提交信息弄乱你的仓库历史。 |
|
注意
|
只修改那些仍然是本地的且尚未推送的提交。修改之前已推送的提交并强制推送分支会给你的协作者带来问题。有关当你这样做时会发生什么以及如果你处于接收端如何恢复的更多信息,请阅读变基的危险。 |
取消暂存已暂存的文件
接下来的两节将演示如何处理你的暂存区和工作目录的更改。好的地方是,你用来确定这两个区域状态的命令也会提醒你如何撤消对它们的更改。例如,假设你更改了两个文件并想将它们作为两个单独的更改提交,但你意外地输入了 `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
$ 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` 确实是一个危险的命令,特别是如果你提供了 `--hard` 标志。然而,在上述场景中,你的工作目录中的文件没有被触及,所以它是相对安全的。 |
目前,你只需要了解关于 `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 checkout -- |
如果你想保留你对该文件所做的更改但现在仍然需要把它暂时搁置,我们将在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
$ 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
|
重要提示
|
重要的是要理解 `git restore |