Git 中 Reset、Revert、Checkout的區別


git reset 、 git checkout 和 git revert 是Git中常用命令。經常傻傻分不清他們之間的區別。最近工作不忙,抽出時間參考了其他文檔,對其總結了下。

 

提交層面的操作

傳給 git reset 和 git checkout 的參數決定了它們的作用域。如果其后參數不是 filename,這些操作對所有提交生效。注意,git revert沒有文件層面的操作。

Reset

在提交層面上,reset 將一個分支的末端指向另一個提交。這可以用來移除當前分支的一些提交。例:

git checkout hotfix git reset HEAD~2

hotfix分支末端的兩個提交現在變成了懸掛提交。下次Git執行垃圾回收的時候,這兩個提交會被刪除。

如果你的更改還沒有共享給別人,git reset是撤銷這些更改的簡單方法。

除了在當前分支上操作,你還可以通過傳入這些標記來修改你的緩存區或工作目錄:

  • –soft – 緩存區和工作目錄都不會被改變
  • –mixed – 默認選項。緩存區和你指定的提交同步,但工作目錄不受影響
  • –hard – 緩存區和工作目錄都同步到你指定的提交

資源網站大全 https://55wd.com 我的007辦公資源網站 https://www.wode007.com

Checkout

常見於切換不同分支。

git checkout hotfix

這個命令做的是將HEAD移到一個新的分支,然后更新工作目錄。因為這可能會覆蓋本地的修改,Git強制你提交或者緩存工作目錄中的所有更改,不然在checkout的時候這些更改都會丟失。和git reset不一樣的是,git checkout沒有移動這些分支。

除了分支之外,你還可以傳入提交的引用來checkout到任意的提交。這和checkout到另一個分支是完全一樣的:把HEAD移動到特定的提交。

git checkout HEAD~2

這對於快速查看項目舊版本來說非常有用。但如果你當前的HEAD沒有任何分支引用,那么這會造成HEAD分離。這是非常危險的,如果你接着添加新的提交,然后切換到別的分支之后就沒辦法回到之前添加的這些提交。因此,在為分離的HEAD添加新的提交的時候你應該創建一個新的分支

 

Revert

Revert撤銷一個提交的同時會創建一個新的提交。這是一個安全的方法,因為它不會重寫提交歷史。比如,下面的命令會找出倒數第二個提交,然后創建一個新的提交來撤銷這些更改,然后把這個提交加入項目中。

git checkout hotfix git revert HEAD~2

相比git reset,它不會改變現在的提交歷史。因此,git revert 可以用在公共分支上,git reset 應該用在私有分支上。

你也可以把git revert 當作撤銷已經提交的更改,而git reset HEAD 用來撤銷沒有提交的更改。

就像git checkout 一樣,git revert 也有可能會重寫文件。所以,Git會在你執行 revert 之前要求你提交或者緩存你工作目錄中的更改。

 

文件層面的操作

git reset和git checkout 命令也接受文件路徑作為參數。這時它的行為就大為不同了。

Reset

當檢測到文件路徑時,git reset 將緩存區同步到你指定的那個提交。比如,下面這個命令會將倒數第二個提交中的foo.py加入到緩存區中,供下一個提交使用。

git reset HEAD~2 foo.py

和提交層面的git reset一樣,通常我們使用HEAD而不是某個特定的提交。運行git reset HEAD foo.py 會將當前的foo.py從緩存區中移除出去,而不會影響工作目錄中對foo.py的更改。

–soft、–mixed和–hard對文件層面的git reset毫無作用,因為緩存區中的文件一定會變化,而工作目錄中的文件一定不變。

 

Checkout

Checkout一個文件和帶文件路徑git reset 非常像,除了它更改的是工作目錄而不是緩存區。不像提交層面的checkout命令,它不會移動HEAD引用,也就是你不會切換到別的分支上去。

比如,下面這個命令將工作目錄中的foo.py同步到了倒數第二個提交中的foo.py。

git checkout HEAD~2 foo.py

和提交層面相同的是,它可以用來檢查項目的舊版本,但作用域被限制到了特定文件。

如果你緩存並且提交了checkout的文件,它具備將某個文件回撤到之前版本的效果。注意它撤銷了這個文件后面所有的更改,而git revert 命令只撤銷某個特定提交的更改。

和git reset 一樣,這個命令通常和HEAD一起使用。比如git checkout HEAD foo.py等同於舍棄foo.py沒有緩存的更改。這個行為和git reset HEAD --hard很像,但只影響特定文件。

 

總結

 

命令 作用域 常用情景
git reset 提交層面 在私有分支上舍棄一些沒有提交的更改
git reset 文件層面 將文件從緩存區中移除
git checkout 提交層面 切換分支或查看舊版本
git checkout 文件層面 舍棄工作目錄中的更改
git revert 提交層面 在公共分支上回滾更改
git revert 文件層面 木有

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM