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