git reset, git checkout, git revert 区别 (译)
博客原文地址: http://blog.mexiqq.com/index.php/archives/3/
題記:團隊中大多數成員使用 sourceTree 和 github 兩款 git 工具,然而大家對于圖形化工具提供的 reset,checkout,revert 功能點并不是很了解,甚至于混淆,然后憑借猜測去使用。功夫不負有心人,在嘗試過多次沖突處理或分支開發的坑后,終于形成了自己的一套使用方式,可喜可賀。然而問題的解決方案的并不是效率最高的,內部的執行過程我們也不清楚,這對于一個自律的程序藝術家是無法接受的。基于這個問題,翻譯這篇博客,為 git 中高級用戶的 undo 操作提供參考。鼓勵在熟悉命令行操作再通過圖形化工具提高開發效率。水平有限,釋疑為主,翻譯為輔
Reset Checkout and Revert
原文地址:https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting
git reset, git checkout, git revert 命令是最有用的三條 git 命令。他們可以幫助你撤銷 repo 的一些操作,并且前兩條命令既可以用于 commit 級別,也可以用于 file 級別。
因為他們很相似,所以很容易混淆。這片文章,我們將比較他們的相同和不同之處。
閱讀本文前需要了解 git repo 的三大 components,分別是 working directory(代碼倉庫) staged snapshot(快照:add的緩存庫) commit history(commit歷史) ,這將更好的幫助你理解這三條命令。
commit 級別的操作
傳遞給 git reset 和 git checkout的參數會決定命令的作用范圍。當命令并不包括含一個文件路徑時,命令作用于整個 commit。
Reset:
在 commit 級別上,git reset 命令移動 HEAD 到當前分支的一個 commit, 這可以用來撤銷當前分支的一些 commit 。
例如,下面的命令會讓 `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可徹底刪除沒有提交的改動。】
checkout
到現在為止,你應該已經熟悉 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 的代碼很有用。然而,如果再次添加新的提交就無法返回原先的狀態。因此,你應該在修改前總是創建一個新的分支。
Revert
git revert 命令通過創建一次新的 commit 來撤銷一次 commit 所做出的修改。這種撤銷的方式是安全的,因為它并不修改 commitm history, 比如下邊的命令將會查出倒數第二次(即當前commit的往前一次)提交的修改,并創建一個新的提交,用于撤銷當前提交的上一次 commit。
git checkout hotfix
git revert HEAD~2
如下圖所示:
File 級別的操作
git reset 和 git checkout 命令同樣可以接受一個可選的文件路徑作為參數,這樣可以將操作限制在一個單獨的文件中。
Reset:
當調用一個文件路徑時,git reset 命令會更新 staged snapshot 去匹配某次 commit。 下面的命令將會使文件回退一個 commit。
git reset HEAD~1 [文件](不建議使用)
【--soft、--mixed、--hard標記此時不起作用,會更新staged snapshot,但不更新working directory】
Checkout
git checkout 命令 和 git reset 類似,除了它會更新 working directory, 而不是 staged snapshot
如下命令將會更新 working directory 去匹配某次 commit
git checkout HEAD~1 [文件]
Summary:
| 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 | 不支持 | |
總結
以上是生活随笔為你收集整理的git reset, git checkout, git revert 区别 (译)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: squid代理服务器(捎带的SNAT)
- 下一篇: 2.7-源码编译安装