git reset 命令详解(二)—— Git 学习笔记 08
git reset 命令詳解(二)
上一篇博文git reset 命令詳解(一)講了 git reset 命令的基本原理和用法,這篇博文談一談 git reset 的另一種用法——后面跟一個路徑(或文件)。
恢復索引中的文件到某個版本
假設版本庫中是文件file.txt的V1版本,HEAD、Index和工作目錄都和版本庫一致。這時候修改了file.txt文件,并把它(V2版本)加入Index。如下圖所示:
現在,運行 git reset file.txt (這其實是 git reset --mixed HEAD file.txt 的簡寫形式),它會讓索引看起來像 HEAD, 所以它本質上只是將 file.txt 從 HEAD 復制到索引中。如下圖:
仔細對比這兩幅圖,你會發現 git reset file.txt 有 “取消暫存文件” 的實際效果。它和 git add 所做的事相反。這就是為什么 git status 命令的輸出會建議運行此命令來取消暫存一個文件。例如:
$ git add * $ git status On branch master Changes to be committed:(use "git reset HEAD <file>..." to unstage)renamed: README.md -> READMEmodified: CONTRIBUTING.md另外,我們可以不讓 Git 從 HEAD 拉取數據,而是通過具體指定一個提交來拉取該文件的對應版本。 我們只需運行類似于 git reset eb43bf file.txt 的命令即可。依然用圖來說明:
以上是版本庫、Index 和工作目錄的狀態。
現在,執行git reset eb43 file.txt
壓縮提交(squashing commit)
假設你有一個項目,第一次提交中增加了文件 a,第二次提交增加了一個新的文件 b 并修改了 a,第三次提交再次修改了 a。如下圖:
你發現第二次和第三次提交其實是增加了一個軟件功能,把二者壓縮成一次提交更合理。那么可以這樣做:
首先,運行 git reset --soft HEAD~2 來將 HEAD 分支移動到一個舊一點的提交上(即你想要保留的最近一次提交):
然后,運行 git commit
現在你可以查看可到達的歷史,即將會推送的歷史,現在看起來有個 v1 版 file-a.txt 的提交,接著第二個提交將 file-a.txt 修改成了 v3 版并增加了 file-b.txt。 包含 v2 版本的文件已經不在歷史中了。
參考資料
《Pro Git》(Scott Chacon, Ben Straub Version 2.1.14, 2018-05-19)
總結
以上是生活随笔為你收集整理的git reset 命令详解(二)—— Git 学习笔记 08的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定义一个圆的类,输入半径,计算周长和面积
- 下一篇: matlab超出维度,求助。。。matl