# 交互式暫存
Git 自帶的一些腳本可以使在命令行下工作更容易。 本節的幾個互交命令可以幫助你將文件的特定部分組合成提交。 當你修改一組文件后,希望這些改動能放到若干提交而不是混雜在一起成為一個提交時,這幾個工具會非常有用。 通過這種方式,可以確保提交是邏輯上獨立的變更集,同時也會使其他開發者在與你工作時很容易地審核。 如果運行?`git add`?時使用?`-i`?或者?`--interactive`?選項,Git 將會進入一個交互式終端模式,顯示類似下面的東西:
~~~
$ 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: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>
~~~
可以看到這個命令以非常不同的視圖顯示了暫存區 - 基本上與?`git status`?是相同的信息,但是更簡明扼要一些。 它將暫存的修改列在左側,未暫存的修改列在右側。
在這塊區域后是命令區域。 在這里你可以做一些工作,包括暫存文件、取消暫存文件、暫存文件的一部分、添加未被追蹤的文件、查看暫存內容的區別。
## 暫存與取消暫存文件
如果在?`What now>`?提示符后鍵入?`2`?或?`u`,腳本將會提示想要暫存哪個文件:
~~~
What now> 2
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>>`?提示符后不輸入任何東西并直接按回車,Git 將會暫存之前選擇的文件:
~~~
Update>>
updated 2 paths
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 1
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 文件,使用?`3`?或?`r`(撤消)選項:
~~~
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 3
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: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 1
staged unstaged path
1: unchanged +0/-1 TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
~~~
如果想要查看已暫存內容的區別,可以使用?`6`?或?`d`(區別)命令。 它會顯示暫存文件的一個列表,可以從中選擇想要查看的暫存區別。 這跟你在命令行指定?`git diff --cached`?非常相似:
~~~
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 6
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 會幫你輕松地完成。 從交互式提示符中,輸入?`5`?或?`p`(補丁)。 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`?來啟動同樣的腳本。
更進一步地,可以使用?`reset --patch`?命令的補丁模式來部分重置文件,通過?`checkout --patch`?命令來部分檢出文件與?`stash save --patch`?命令來部分暫存文件。 我們將會在接觸這些命令的高級使用方法時了解更多詳細信息。
- 前言
- Scott Chacon 序
- Ben Straub 序
- 獻辭
- 貢獻者
- 引言
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 命令行
- 1.5 安裝 Git
- 1.6 初次運行 Git 前的配置
- 1.7 獲取幫助
- 1.8 總結
- 2. Git 基礎
- 2.1 獲取 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 Git 別名
- 2.8 總結
- 3. Git 分支
- 3.1 分支簡介
- 3.2 分支的新建與合并
- 3.3 分支管理
- 3.4 分支開發工作流
- 3.5 遠程分支
- 3.6 變基
- 3.7 總結
- 4. 服務器上的 Git
- 4.1 協議
- 4.2 在服務器上搭建 Git
- 4.3 生成 SSH 公鑰
- 4.4 配置服務器
- 4.5 Git 守護進程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的選擇
- 4.10 總結
- 5. 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一個項目貢獻
- 5.3 維護項目
- 5.4 總結
- 6. GitHub
- 6.1 賬戶的創建和配置
- 6.2 對項目做出貢獻
- 6.3 維護項目
- 6.4 管理組織
- 6.5 腳本 GitHub
- 6.6 總結
- 7. Git 工具
- 7.1 選擇修訂版本
- 7.2 交互式暫存
- 7.3 儲藏與清理
- 7.4 簽署工作
- 7.5 搜索
- 7.6 重寫歷史
- 7.7 重置揭密
- 7.8 高級合并
- 7.9 Rerere
- 7.10 使用 Git 調試
- 7.11 子模塊
- 7.12 打包
- 7.13 替換
- 7.14 憑證存儲
- 7.15 總結
- 8. 自定義 Git
- 8.1 配置 Git
- 8.2 Git 屬性
- 8.3 Git 鉤子
- 8.4 使用強制策略的一個例子
- 8.5 總結
- 9. Git 與其他系統
- 9.1 作為客戶端的 Git
- 9.2 遷移到 Git
- 9.3 總結
- 10. Git 內部原理
- 10.1 底層命令和高層命令
- 10.2 Git 對象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用規格
- 10.6 傳輸協議
- 10.7 維護與數據恢復
- 10.8 環境變量
- 10.9 總結
- A. 其它環境中的 Git
- A1.1 圖形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Eclipse 中的 Git
- A1.4 Bash 中的 Git
- A1.5 Zsh 中的 Git
- A1.6 Powershell 中的 Git
- A1.7 總結
- B. 將 Git 嵌入你的應用
- A2.1 命令行 Git 方式
- A2.2 Libgit2
- A2.3 JGit
- C. Git 命令
- A3.1 設置與配置
- A3.2 獲取與創建項目
- A3.3 快照基礎
- A3.4 分支與合并
- A3.5 項目分享與更新
- A3.6 檢查與比較
- A3.7 調試
- A3.8 補丁
- A3.9 郵件
- A3.10 外部系統
- A3.11 管理
- A3.12 底層命令