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.rbfor 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 a2)撤銷工作區中文件a的修改
git checkout a3、如果已被提交,則需要先回退當前提交到工作區,然後撤銷文件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 |