撤销操作 —— Git 学习笔记 12
撤銷操作
寫在前面:有些撤消操作是不可逆的。 這是在使用 Git 的過程中,會因為操作失誤而導致之前的工作丟失的少有的幾個地方之一。
修改最新提交
有時候我們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有 --amend 選
項的提交命令嘗試重新提交:
如果自上次提交以來你還未做任何修改(例如,在上次提交后馬上執行此命令),那么快照會保持不變,而你所修改的只是提交信息。文本編輯器啟動后,可以看到之前的提交信息。 編輯后保存會覆蓋原來的提交信息。
如果你忘了提交一些文件,那么把這些文件加入暫存區后,這個命令會將暫存區中的文件提交。
例如第一次提交:
git commit -m 'initial commit'這時候發現forgotten_file這個文件沒有暫存,按理說應該在第一次提交??梢赃@樣操作:
$ git add forgotten_file $ git commit --amend最終你只會有一個提交,第二次提交將代替第一次提交的結果。
咱們實操一下。
$ git status On branch master Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file: bar.cUntracked files:(use "git add <file>..." to include in what will be committed)hello.c按理說應該把 hello.c 也加入索引,但是給忘了:
$ git commit -m "abcdefg" [master 1380bcd] abcdefg1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 bar.c為了補救,可以運行:
$ git add hello.c$ git commit --amend這時候文本編輯器會啟動,可以看到之前的提交信息。 編輯后(比如我在后面添加了幾個加號)保存,退出文本編輯器。這時候命令行顯示:
[master 8f19240] abcdefg+++Date: Fri Sep 7 21:08:07 2018 +08002 files changed, 0 insertions(+), 0 deletions(-)create mode 100644 bar.ccreate mode 100644 hello.c可以看到,后面的這次提交和之前的提交合并了,最終只有一次提交。
實際上,不管最新提交如何,你都可以編輯文件,再更新索引(比如git add或者git rm),最后發出git commit --amend來修正最新提交。
用圖來說明就是:
取消暫存的文件
如果誤將某個文件暫存了,可以用
git reset HEAD <file>舉個例子。
$ git add * $ git status On branch master Changes to be committed:(use "git reset HEAD <file>..." to unstage)renamed: README.md -> READMEmodified: CONTRIBUTING.md實際上你不想暫存 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.mdCONTRIBUTING.md 文件已經是修改未暫存的狀態了。
如果想知道這個命令的細節,可以參考我的博文 git reset 命令詳解(二)
提示:雖然在調用時加上 --hard 選項可以讓 git reset 成為一個危險的命令(可能導致工作目錄中所有當前進度丟失!),但本例中工作目錄中的文件并不會被修改。不加選項地調用 git 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可以看到那些修改已經被撤消了, CONTRIBUTING.md 確實回到了上次提交時的樣子。
注意:你需要知道 git checkout -- [file] 是一個危險的命令, 它就像是 git reset -- hard[branch] file,不僅用某次提交中的那個文件來更新索引,同時也會覆蓋工作目錄中對應的文件 —— 這樣對工作目錄并不安全!
寫在最后:在 Git 中任何 “已提交” 的東西幾乎總是可以恢復的。甚至那些被刪除的分支中的提交或使用 –amend 選項覆蓋的提交也可以恢復。然而,任何你“未提交”的東西丟失后很可能再也找不回來。
參考資料
【1】《Pro Git》(Scott Chacon, Ben Straub Version 2.1.14, 2018-05-19)
【2】《Git 版本控制管理(第2版)》,人民郵電出版社
總結
以上是生活随笔為你收集整理的撤销操作 —— Git 学习笔记 12的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux awk 日志分析,Linux
- 下一篇: 2020年中国人工智能商业落地研究报告