git reset, git checkout, git revert 區別 (譯)

博客原文地址: http://blog.mexiqq.com/index.php/archives/3/php

題記:團隊中大多數成員使用 sourceTree 和 github 兩款 git 工具,然而你們對於圖形化工具提供的 reset,checkout,revert 功能點並非很瞭解,甚至於混淆,而後憑藉猜想去使用。功夫不負有心人,在嘗試過屢次衝突處理或分支開發的坑後,終於造成了本身的一套使用方式,可喜可賀。然而問題的解決方案的並非效率最高的,內部的執行過程咱們也不清楚,這對於一個自律的程序藝術家是沒法接受的。基於這個問題,翻譯這篇博客,爲 git 中高級用戶的 undo 操做提供參考。鼓勵在熟悉命令行操做再經過圖形化工具提升開發效率。水平有限,釋疑爲主,翻譯爲輔git

Reset Checkout and Revert

原文地址: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

請輸入圖片描述

commit 級別的操做

傳遞給 git resetgit checkout的參數會決定命令的做用範圍。當命令並不包括含一個文件路徑時,命令做用於整個 commit工具

Reset:

commit 級別上,git reset 命令移動 HEAD 到當前分支的一個 commit, 這能夠用來撤銷當前分支的一些 commitspa

例如,下面的命令會讓 `hotfix` 分支回退兩個 commits命令行

git checkout hotfix翻譯

git reset HEAD~2

先前在 HEAD 以前的兩次 commit 如今處在 HEAD 以後,這意味着他們在下一次 git 提交時被做爲垃圾刪掉,換句話說這兩次提交會被拋棄。以下圖所示:

請輸入圖片描述

git reset用於撤銷未被提交到遠端的改動。除了能夠移動當前分支的HEAD,你能夠經過不一樣的標記選擇修改 staged snapshot 或者 working directory

  • --softstaged snapshotworking directory 都未被改變 (建議在命令行執行後,再輸入 git status 查看狀態)

  • --mixedstaged snapshot 被更新, working directory 未被更改。【這是默認選項】(建議同上)

  • --hardstaged snapshotworking 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 resetgit 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:

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 不支持
相關文章
相關標籤/搜索