-
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 命令
7.2 Git 工具 - 交互式暂存
交互式暂存
在本节中,你将会看到几个交互式的 Git 命令,它们可以帮助你构造你的提交,从而只包括某些特定的组合和部分文件。如果你大量修改了很多文件,然后决定将这些修改分成几个有侧重点的提交,而不是一个大而混乱的提交,这些工具将会非常有用。通过这种方式,你可以确保你的提交是逻辑上独立的变更集,并且可以很容易地被与你一起工作的开发人员审查。
如果你运行 git add
命令时带上 -i
或 --interactive
选项,Git 会进入一个交互式 shell 模式,显示如下内容:
$ git add -i
staged unstaged path
1: unchanged +0/-1 TODO
2: unchanged +1/-1 index.html
3: unchanged +5/-1 lib/simplegit.rb
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now>
你可以看到,这个命令向你展示了一个与你可能已经习惯的暂存区域截然不同的视图 — 基本上,它与你使用 git status
命令所获得的信息相同,但更加简洁和信息量更大。它列出了你已经暂存的更改(在左侧)和未暂存的更改(在右侧)。
接下来是 “Commands” 部分,它允许你执行许多操作,例如暂存和取消暂存文件、暂存文件的一部分、添加未跟踪的文件以及显示已暂存内容的差异。
暂存和取消暂存文件
如果你在 What now>
提示符下输入 u
或 2
(表示 update),则系统会提示你选择要暂存的文件。
What now> u
staged unstaged path
1: unchanged +0/-1 TODO
2: unchanged +1/-1 index.html
3: unchanged +5/-1 lib/simplegit.rb
Update>>
要暂存 TODO
和 index.html
文件,你可以输入数字
Update>> 1,2
staged unstaged path
* 1: unchanged +0/-1 TODO
* 2: unchanged +1/-1 index.html
3: unchanged +5/-1 lib/simplegit.rb
Update>>
每个文件旁边的 *
表示该文件被选择进行暂存。如果在 Update>>
提示符下什么都不输入,然后按 Enter 键,Git 会将所有选中的文件暂存起来。
Update>>
updated 2 paths
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> s
staged unstaged path
1: +0/-1 nothing TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
现在你可以看到 TODO
和 index.html
文件已经暂存,而 simplegit.rb
文件仍然未暂存。 如果你想取消暂存 TODO
文件,可以使用 r
或 3
(revert 的缩写) 选项。
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> r
staged unstaged path
1: +0/-1 nothing TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Revert>> 1
staged unstaged path
* 1: +0/-1 nothing TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Revert>> [enter]
reverted one path
再次查看你的 Git 状态,可以看到你已经取消暂存了 TODO
文件。
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> s
staged unstaged path
1: unchanged +0/-1 TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
要查看你已经暂存的更改的 diff,可以使用 d
或 6
(diff 的缩写) 命令。它会显示一个已暂存文件的列表,你可以选择想要查看暂存 diff 的文件。 这很像在命令行上指定 git diff --cached
。
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> d
staged unstaged path
1: +1/-1 nothing index.html
Review diff>> 1
diff --git a/index.html b/index.html
index 4d07108..4335f49 100644
--- a/index.html
+++ b/index.html
@@ -16,7 +16,7 @@ Date Finder
<p id="out">...</p>
-<div id="footer">contact : support@github.com</div>
+<div id="footer">contact : email.support@github.com</div>
<script type="text/javascript">
通过这些基本命令,你可以使用交互式添加模式来更轻松地处理你的暂存区。
暂存补丁
Git 还可以暂存文件的某些部分,而不是全部。 例如,如果你对 simplegit.rb
文件进行了两处更改,并且只想暂存其中一个,而不想暂存另一个,那么在 Git 中非常容易做到。 从上一节解释的相同交互式提示符中,键入 p
或 5
(patch 的缩写)。 Git 将询问你希望部分暂存哪些文件;然后,对于所选文件的每个部分,它将显示文件差异的块,并询问你是否要逐个暂存它们。
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd5ecc4..57399e0 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -22,7 +22,7 @@ class SimpleGit
end
def log(treeish = 'master')
- command("git log -n 25 #{treeish}")
+ command("git log -n 30 #{treeish}")
end
def blame(path)
Stage this hunk [y,n,a,d,/,j,J,g,e,?]?
此时你有很多选择。 键入 ?
会显示你可以执行的操作的列表。
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ?
y - stage this hunk
n - do not stage this hunk
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
通常,如果要暂存每个代码块,你将键入 y
或 n
,但是在某些文件中暂存所有代码块或稍后跳过代码块决策也可能很有用。 如果你暂存了文件的一部分,而将另一部分保持未暂存状态,则你的状态输出将如下所示。
What now> 1
staged unstaged path
1: unchanged +0/-1 TODO
2: +1/-1 nothing index.html
3: +1/-1 +4/-0 lib/simplegit.rb
simplegit.rb
文件的状态很有趣。它显示了几行已暂存,几行未暂存。你已部分暂存此文件。此时,你可以退出交互式添加脚本并运行 git commit
来提交部分暂存的文件。
你也不需要在交互式添加模式下进行部分文件暂存 —— 你可以通过在命令行上使用 git add -p
或 git add --patch
来启动相同的脚本。
此外,你可以使用补丁模式通过 git reset --patch
命令部分地重置文件,使用 git checkout --patch
命令检出文件的部分,以及使用 git stash save --patch
命令隐藏文件的部分。 当我们深入了解这些命令的更高级用法时,我们将详细介绍每个命令。