標籤:

git 中如何撤銷部分修改?

我以前用過 svn ,我想要的就是跟 svn revert 一樣的功能。比如現在修改了 a b 兩個文件,沒有 git add 也沒有 commit ,想要撤銷修改。我只知道可以 git reset --hard ,但這樣會把所有修改都撤銷,如果我只想撤銷 a 的修改怎麼辦?


從我Note里貼出來給你,注意這裡的Index是本地緩存,Working Directory指的是本地還沒有提交到緩存里的修改。

for index -- Unstaging a Staged File / undo a added file

$ git reset HEAD benchmarks.rb

for Working directory -- Unmodifying a Modified File

git checkout -- benchmarks.rb

Or revert deleted folders

git checkout -- /root/vdi/vdia/third_party/ClientPlatform/src/

曾經把自己Note里的一些高級指令整理後寫成《Git Cookbook》放在這裡:http://blog.sevenche.com/2014/02/Git-cook-book/


以提問中修改了兩個文件a、b為例,假設需要撤銷文件a的修改,則修改後的兩個文件:

1、如果沒有被git add到索引區

git checkout a 便可撤銷對文件a的修改

2、如果被git add到索引區,但沒有做git commit提交

1)使用git reset將a從索引區移除(但會保留在工作區)

git reset HEAD a

2)撤銷工作區中文件a的修改

git checkout a

3、如果已被提交,則需要先回退當前提交到工作區,然後撤銷文件a的修改

1)回退當前提交到工作區

git reset HEAD^

2)撤銷工作區中文件a的修改

git checkout a

補充:靈活使用以上操作的關鍵在於理解git中工作區、索引區的概念和git reset命令hard、mixed(default)、soft三種模式的區別,網上有很多這方面的文章,不再贅述。


Git常用的撤銷操作 之前的總結 希望可以幫到你

基本狀態標識

  • A- = untracked 未跟蹤
  • A = tracked 已跟蹤未修改
  • A+ = modified - 已修改未暫存
  • B = staged - 已暫存未提交
  • C = committed - 已提交未PUSH

各狀態之間變化

  • A- -&> B : git add &
  • B -&> A- : git rm --cached &
  • B -&> 刪除不保留文件 : git rm -f &
  • A -&> A- : git rm --cached &
  • A -&> A+ : 修改文件
  • A+ -&> A : git checkout -- &
  • A+ -&> B : git add &
  • B -&> A+ : git reset HEAD &
  • B -&> C : git commit
  • C -&> B : git reset --soft HEAD^
  • 修改最後一次提交:git commit --amend


git reset --hard -- a

上述有誤,以下為更正:

git checkout -- a


對於日常開發中,代碼版本管理是必不可少,如何管理各種狀態,下面的幾個點介紹下

1.首頁了解下git所處的4種區 (工作區, 暫存取,本地倉庫, 遠程倉庫)

  • git add . (git add &) :加入到暫存區
  • git commit -m "add: xxx" : 加入到本地倉庫
  • git push origin master : 加入到遠程倉庫

2. git的5種狀態

  • Origin(未修改)
  • Modified(已修改)
  • Staged(已暫存)
  • Committed(已提交)
  • Pushed(已推送)

3. git diff 對比修改

  • 已修改,未暫存:git diff
  • 已暫存,未提交: git diff --cached
  • 已提交,未推送: git diff master origin/master

4. 撤銷修改(觀看上面的圖)

  • 已修改,未暫存:git checkout . (git checkout &)
  • 已暫存,未提交: git reset (git reset --hard 會覆蓋)
  • 已提交,未推送: git reset --hard origin/master (遠程倉庫覆蓋本地倉庫)
  • 已推送: git reset --hard & (如果要覆蓋遠程必須強制推 git push -f)

#怎麼修改遠程的commit message? :《修改Git message》

來源:秒懂Git的區和狀態


推薦git客戶端工具SmartGit,你只要打開已經納入git版本控制的項目,就可以用SmartGit進行管理,例如commit、revert等等操作


修改了兩個文件a與b並且沒有add和commit,此時這兩個文件通過git status -s可以看到M狀態,若想單獨撤銷某一個文件修改,恢復到上一次提交時的狀態,可以執行git checkout -- [filename],即可將filename文件的上一個提交狀態檢出到當前工作區,filename就是要檢出的文件名。不影響其他文件。

git checkout -- a


git reset hard 是恢復了工作區的代碼,就是commit以後的地方,git soft 是恢復緩存區代碼,就是 add .那個位置的

盡量不要用git reset hard這個命令


捷徑:

git stash

git stash pop

即回到編輯狀態。


如果add 了一個a文件,想撤銷呢


經過測試: git checkout a 可行


推薦閱讀:

Git如何在本地查看遠端倉庫超前本地提交的日誌信息?僅僅是日誌信息哦
為什麼git默認不區分文件夾大小寫?
gg———good use of git,一個實用的git分支模型
自學Git,有哪些書籍或者好的學習資源?

TAG:Git |