博客原文地址: http://blog.mexiqq.com/index.php/archives/3/php
題記:團隊中大多數成員使用 sourceTree 和 github 兩款 git 工具,然而你們對於圖形化工具提供的 reset,checkout,revert 功能點並非很瞭解,甚至於混淆,而後憑藉猜想去使用。功夫不負有心人,在嘗試過屢次衝突處理或分支開發的坑後,終於造成了本身的一套使用方式,可喜可賀。然而問題的解決方案的並非效率最高的,內部的執行過程咱們也不清楚,這對於一個自律的程序藝術家是沒法接受的。基於這個問題,翻譯這篇博客,爲 git 中高級用戶的 undo 操做提供參考。鼓勵在熟悉命令行操做再經過圖形化工具提升開發效率。水平有限,釋疑爲主,翻譯爲輔
git
原文地址:https://www.atlassian.com/git/tutorials/resetting-checking-out-and-revertinggithub
git reset, git checkout, git revert 命令是最有用的三條 git 命令。他們能夠幫助你撤銷 repo 的一些操做,而且前兩條命令既能夠用於 commit 級別,也能夠用於 file 級別。緩存
由於他們很類似,因此很容易混淆。這片文章,咱們將比較他們的相同和不一樣之處。安全
閱讀本文前須要瞭解 git repo 的三大 components,分別是 working directory
(代碼倉庫) staged snapshot
(快照:add的緩存庫) commit history
(commit歷史) ,這將更好的幫助你理解這三條命令。svg
傳遞給 git reset
和 git checkout
的參數會決定命令的做用範圍。當命令並不包括含一個文件路徑時,命令做用於整個 commit
。工具
在 commit
級別上,git reset
命令移動 HEAD
到當前分支的一個 commit
, 這能夠用來撤銷當前分支的一些 commit
。 spa
例如,下面的命令會讓 `hotfix` 分支回退兩個 commits命令行
git checkout hotfix翻譯
git reset HEAD~2
先前在 HEAD 以前的兩次 commit 如今處在 HEAD 以後,這意味着他們在下一次 git 提交時被做爲垃圾刪掉,換句話說這兩次提交會被拋棄。以下圖所示:
git reset用於撤銷未被提交到遠端的改動。除了能夠移動當前分支的HEAD,你能夠經過不一樣的標記選擇修改 staged snapshot 或者 working directory
--soft
: staged snapshot
和 working directory
都未被改變 (建議在命令行執行後,再輸入 git status 查看狀態)
--mixed
: staged snapshot
被更新, working directory
未被更改。【這是默認選項】(建議同上)
--hard
: staged snapshot
和 working directory
都將回退。
--hard 很危險,它會直接回退你以前全部的修改,使用前,能夠事先保存 commit id.
【這些標記常常和HEAD
一塊兒使用。例如,git reset --mixed HEAD
可撤銷全部緩存改動,可是保留他們在工做目錄下。git reset --hard HEAD
可完全刪除沒有提交的改動。】
到如今爲止,你應該已經熟悉 commit
級別的 git checkout
了。當你傳送一個 branch name
名字時,你將更換當前的分支.
git checkout hotfix
上面的命令會切換 HEAD 到不一樣的分支,而且更新當前的 working directory
去匹配。由於會覆蓋當前的本地更改,因此更換分支前git
強制你完全放棄或者提交存儲當前的更改。不一樣於 git reset
, git checkout
不會廢棄任何分支或提交。
你也能夠 checkout
到任何一次 commit
,經過提供 commit Id
做爲參數.
好比下面的命令。
git checkout HEAD~2/[commit id]
這對於 review
repo 的某個 version 的代碼頗有用。然而,若是再次添加新的提交就沒法返回原先的狀態。所以,你應該在修改前老是建立一個新的分支。
git revert
命令經過建立一次新的 commit
來撤銷一次 commit
所作出的修改。這種撤銷的方式是安全的,由於它並不修改 commitm history
, 好比下邊的命令將會查出倒數第二次(即當前commit的往前一次)提交的修改,並建立一個新的提交,用於撤銷當前提交的上一次 commit
。
git checkout hotfix
git revert HEAD~2
以下圖所示:
git reset
和 git checkout
命令一樣能夠接受一個可選的文件路徑做爲參數,這樣能夠將操做限制在一個單獨的文件中。
當調用一個文件路徑時,git reset
命令會更新 staged snapshot
去匹配某次 commit
。 下面的命令將會使文件回退一個 commit
。
git reset HEAD~1 [文件](不建議使用)
【--soft、--mixed、--hard標記此時不起做用,會更新staged snapshot,但不更新working directory】
git checkout
命令 和 git reset
相似,除了它會更新 working directory
, 而不是 staged snapshot
以下命令將會更新 working directory
去匹配某次 commit
git checkout HEAD~1 [文件]
commands | scope | common user cases | |
---|---|---|---|
git reset | Commit | Discard commits in a private branch or throw away uncommited changes | |
git reset | File | Unstage a file | |
git checkot | Commit | switch between branches or inspect old snapshot | |
git checkout | File | Discard changes in the working directory | |
git revert | commit | Undo commits in a public branch | |
git revert | File | 不支持 |