git代码回滚的几种方式
這還是第一次寫關于git的文章,讓我不由的想起了大學那會還沒有接觸到git時的如噩夢般的版本控制。
每次如果代碼要有大的改動都要提前copy一份出來,最后以至于有多少次大的改動就有多少分文件,而且每一個都不敢刪,寫到這好想配個圖,雖然我不造配哪個圖合適啊,反正就是類似于1,2,3,4,5...。
言歸正傳,我們要說的是后悔藥。
在工作中我們一定都發生過這種情況,希望把代碼會滾到某個節點中,git有多中代碼的回滾方式,這里做一個總結。
首先我們到區分幾個概念,工作區,暫存區,版本庫,。
工作區
所謂工作區,即我們電腦中所看到的目錄。
版本庫
在工作區有一個隱藏目錄.git,這是Git的版本庫。
暫存區
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
下圖顯示了三者之間的關系,這是我們了解git的基礎
圖中左側為工作區,右側為版本庫。在版本庫中左側區域是暫存區(stage),右側標記為 "master / other" 的是 master 分支或其他分支所代表的目錄樹。
當對工作區修改(或新增)的文件執行 "git add" 命令時,暫存區的目錄樹被更新。
當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
而我們這里所謂的后悔藥就是要講代碼會滾到某個提交歷史的方法,下面就針對各種不同情況一一講解。
丟棄尚未被提交到暫存區的代碼
1.git co -- file
其中 “--” 參數是必須的,否則就會變成切換分支。
2.git stash 儲藏
git stash操作適用于,當你的工作進行到一半,此時還不想要提交,但是又必須切換到其他分支工作的時候。
執行命令
stash 命令就會將你此時工作區的代碼存起來,待你想繼續工作時,執行
git stash apply你就可以重新應用你最后一次stash的內容了。此時的代碼就回到了你上次到一半的內容上了。
已經提交到暫存區
1.git reset
git reset HEAD~1暫存區的目錄樹會被重寫,最后一次提交的內容會被丟棄,但是工作區不受影響。
但是加上 “--hard” 參數后,暫存區和工作目錄都同步到你指定的提交。也就是HEAD~1.
2.git rm --cached file
改命令會直接從暫存區刪除文件,工作區則不做出改變。
已經提交到分支上的代碼
1.git checkout HEAD . / git checkout HEAD file
當執行該命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件,替換暫存區和以及工作區中的文件。這個命令是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。
2.git reset --hard
其使用方法與上面講的git reset一樣,都是改變了暫存區的HEAD索引。
已經提交到遠程的代碼
1.git revert
git revert HEAD 撤銷前一次 commit
git revert HEAD^ 撤銷前前一次 commit
git revert fa042ce57 撤銷指定的版本,撤銷也會作為一次提交進行保存。
與reset不同的是:
revert不會舍棄原來的提交記錄,而是生成了一次新的提交。
reset是撤回到某個指定的版本,而revert則是將某個指定的版本撤銷,也就是撤回到指定版本之前的一個版本上。
總結
以上是生活随笔為你收集整理的git代码回滚的几种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVN仓库迁移
- 下一篇: Openstack 安装部署指南翻译系列