鍍金池/ 教程/ Java/ 撤消操作
腳本 GitHub
Git 鉤子
分支與合并
撤消操作
5.4 總結(jié)
Git 對(duì)象
變基
Bash 中的 Git
補(bǔ)丁
Git 引用
項(xiàng)目分享與更新
總結(jié)
GitWeb
Visual Studio 中的 Git
外部系統(tǒng)
替換
Zsh 中的 Git
Git 命令
打包
使用強(qiáng)制策略的一個(gè)例子
總結(jié)
簽署工作
分支開發(fā)工作流
遠(yuǎn)程分支
總結(jié)
安裝 Git
Powershell 中的 Git
快照基礎(chǔ)
管理組織
Git 與其他系統(tǒng)
在服務(wù)器上搭建 Git
GitHub
Git 別名
憑證存儲(chǔ)
維護(hù)與數(shù)據(jù)恢復(fù)
包文件
子模塊
將 Git 嵌入你的應(yīng)用
獲取幫助
對(duì)項(xiàng)目做出貢獻(xiàn)
Git 分支
使用 Git 調(diào)試
Libgit2
Git 基礎(chǔ)
郵件
Git 內(nèi)部原理
維護(hù)項(xiàng)目
調(diào)試
向一個(gè)項(xiàng)目貢獻(xiàn)
總結(jié)
維護(hù)項(xiàng)目
命令行
分布式 Git
總結(jié)
JGit
儲(chǔ)藏與清理
管理
獲取與創(chuàng)建項(xiàng)目
總結(jié)
Rerere
Git 簡(jiǎn)史
Smart HTTP
總結(jié)
Eclipse 中的 Git
總結(jié)
引用規(guī)格
傳輸協(xié)議
查看提交歷史
自定義 Git
底層命令
Git 守護(hù)進(jìn)程
搜索
Git 基礎(chǔ)
Git 工具
關(guān)于版本控制
環(huán)境變量
其它環(huán)境中的 Git
高級(jí)合并
服務(wù)器上的 Git
第三方托管的選擇
遷移到 Git
遠(yuǎn)程倉庫的使用
GitLab
生成 SSH 公鑰
分支的新建與合并
配置服務(wù)器
交互式暫存
重寫歷史
重置揭密
Git 屬性
總結(jié)
初次運(yùn)行 Git 前的配置
記錄每次更新到倉庫
總結(jié)
分支管理
打標(biāo)簽
檢查與比較

撤消操作

在任何一個(gè)階段,你都有可能想要撤消某些操作。 這里,我們將會(huì)學(xué)習(xí)幾個(gè)撤消你所做修改的基本工具。 注意,有些撤消操作是不可逆的。 這是在使用 Git 的過程中,會(huì)因?yàn)椴僮魇д`而導(dǎo)致之前的工作丟失的少有的幾個(gè)地方之一。

有時(shí)候我們提交完了才發(fā)現(xiàn)漏掉了幾個(gè)文件沒有添加,或者提交信息寫錯(cuò)了。 此時(shí),可以運(yùn)行帶有 --amend 選項(xiàng)的提交命令嘗試重新提交:

$ git commit --amend

這個(gè)命令會(huì)將暫存區(qū)中的文件提交。 如果自上次提交以來你還未做任何修改(例如,在上次提交后馬上執(zhí)行了此命令),那么快照會(huì)保持不變,而你所修改的只是提交信息。

文本編輯器啟動(dòng)后,可以看到之前的提交信息。 編輯后保存會(huì)覆蓋原來的提交信息。

例如,你提交后發(fā)現(xiàn)忘記了暫存某些需要的修改,可以像下面這樣操作:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

最終你只會(huì)有一個(gè)提交 - 第二次提交將代替第一次提交的結(jié)果。

取消暫存的文件

接下來的兩個(gè)小節(jié)演示如何操作暫存區(qū)域與工作目錄中已修改的文件。 這些命令在修改文件狀態(tài)的同時(shí),也會(huì)提示如何撤消操作。 例如,你已經(jīng)修改了兩個(gè)文件并且想要將它們作為兩次獨(dú)立的修改提交,但是卻意外地輸入了 git add * 暫存了它們兩個(gè)。 如何只取消暫存兩個(gè)中的一個(gè)呢? 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

在 “Changes to be committed” 文字正下方,提示使用 git reset HEAD ... 來取消暫存。 所以,我們可以這樣來取消暫存 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

這個(gè)命令有點(diǎn)兒奇怪,但是起作用了。 CONTRIBUTING.md 文件已經(jīng)是修改未暫存的狀態(tài)了。

Note

雖然在調(diào)用時(shí)加上 --hard 選項(xiàng)可以令 git reset 成為一個(gè)危險(xiǎn)的命令(譯注:可能導(dǎo)致工作目錄中所有當(dāng)前進(jìn)度丟失?。纠泄ぷ髂夸泝?nèi)的文件并不會(huì)被修改。 不加選項(xiàng)地調(diào)用 git reset 并不危險(xiǎn) — 它只會(huì)修改暫存區(qū)域。

到目前為止這個(gè)神奇的調(diào)用就是你需要對(duì) git reset 命令了解的全部。我們將會(huì)在 重置揭密 中了解 reset 的更多細(xì)節(jié)以及如何掌握它做一些真正有趣的事。

撤消對(duì)文件的修改

如果你并不想保留對(duì) CONTRIBUTING.md 文件的修改怎么辦? 你該如何方便地撤消修改 - 將它還原成上次提交時(shí)的樣子(或者剛克隆完的樣子,或者剛把它放入工作目錄時(shí)的樣子)? 幸運(yùn)的是,git status 也告訴了你應(yīng)該如何做。 在最后一個(gè)例子中,未暫存區(qū)域是這樣:

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

它非常清楚地告訴了你如何撤消之前所做的修改。 讓我們來按照提示執(zhí)行:

$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

可以看到那些修改已經(jīng)被撤消了。

Important

你需要知道 git checkout -- [file] 是一個(gè)危險(xiǎn)的命令,這很重要。 你對(duì)那個(gè)文件做的任何修改都會(huì)消失 - 你只是拷貝了另一個(gè)文件來覆蓋它。 除非你確實(shí)清楚不想要那個(gè)文件了,否則不要使用這個(gè)命令。

如果你仍然想保留對(duì)那個(gè)文件做出的修改,但是現(xiàn)在仍然需要撤消,我們將會(huì)在 Git 分支 介紹保存進(jìn)度與分支;這些通常是更好的做法。

記住,在 Git 中任何 已提交的 東西幾乎總是可以恢復(fù)的。 甚至那些被刪除的分支中的提交或使用 --amend 選項(xiàng)覆蓋的提交也可以恢復(fù)(閱讀 數(shù)據(jù)恢復(fù) 了解數(shù)據(jù)恢復(fù))。 然而,任何你未提交的東西丟失后很可能再也找不到了。