那些你應(yīng)該知道的,但是你一定不知道的 Git 騷操作
Hello 大家好,我是阿粉,作為團(tuán)隊(duì)中的主程阿粉經(jīng)常參與很多核心功能的開發(fā),而且很多時(shí)候一個(gè)需求沒做好中間又插入新的緊急的需求或者 bug 修復(fù),每次遇到這種情況,如果兩個(gè)地方代碼不沖突的話還好,可以直接在本分支修改然后提交,但是當(dāng)遇到需要修改同一個(gè)類文件的時(shí)候就比較麻煩了。這種情況如何優(yōu)雅的處理呢?讓阿粉來帶你了解 Git 的高級(jí)騷操作!
Git stash
git stash save messge 將本分支的修改暫存起來。
在詳細(xì)介紹這個(gè)功能之前我們先說一下 Git 的幾個(gè)空間,如下圖所示,圖片來自官網(wǎng)
工作區(qū)
工作區(qū)就是我們看到的文件夾,我們?cè)陧?xiàng)目當(dāng)中任何創(chuàng)建,修改的文件都存放在工作區(qū)中。我們通過 git clone 的時(shí)候就是直接把 git 倉(cāng)庫(kù)里面的文件下載到本地形成一個(gè)項(xiàng)目的工作區(qū)。在項(xiàng)目目錄下我們可以使用命令git status 查看當(dāng)前分支修改的文件列表。如下圖所示,會(huì)顯示出當(dāng)前工作區(qū)修改了哪些文件,哪些文件沒有被加入 git 管理,我們一覽無余。
暫存區(qū)
當(dāng)我們使用命令git add xx 命令的時(shí)候就把 xx 文件放入的暫存區(qū),如果全部文件都需要放入的話可以使用git add . 將所有修改的文件都加入暫存區(qū),這里的文件是為了下一步提交做準(zhǔn)備的。
Git 本地倉(cāng)庫(kù)
當(dāng)文件被上一步加入到暫存區(qū)的時(shí)候,下一步我們使用命令git commit -m message 即可將文件進(jìn)行提交到本地倉(cāng)庫(kù),然后在執(zhí)行g(shù)it push origin branch 命令將修改推送到遠(yuǎn)程倉(cāng)庫(kù)。
重點(diǎn)來了!
Git stash
上面的步驟都是正常的步驟,但是如果遇到前面阿粉說的這種情況,代碼寫到一半需要修改一個(gè) bug,但是這個(gè)時(shí)候也不想提交未寫完的代碼,那該怎么辦呢?這個(gè)時(shí)候 git stash 命令就能幫助你了。
我們?cè)诋?dāng)前修改代碼的分支里面先執(zhí)行一下git status 看下本地的修改,然后再執(zhí)行g(shù)it stash save 'message' 將本地修改暫存起來。如下圖所示,我們可以看到一開始顯示有四個(gè)新文件,在執(zhí)行了git stash 命令后再執(zhí)行g(shù)it status 命令顯示沒有修改了。
image-20200725140352378
這個(gè)時(shí)候我們就可以放心大膽的去修復(fù) bug,不管是在本分支,還是創(chuàng)建新的分支都沒有問題。假設(shè)我們花了三五分鐘把 bug 修復(fù)了,現(xiàn)在想繼續(xù)寫原來的需求怎么辦呢?很簡(jiǎn)單,我們只要在暫存區(qū)將我們的代碼恢復(fù)回來就好了。使用命令git stash pop 直接將最近一次 stash 的代碼 pop 出來,也可以通過命令git stash list 找到對(duì)應(yīng)的記錄對(duì)應(yīng)的記錄,采用 git stash apply xxx 命令也行。不過這里建議不要暫存太多,就放一個(gè)就好,直接使用 pop 彈出即可。如下圖所示:
可以看到我們修改的代碼又回來了!是不是很神奇!
找回清除的 stash 數(shù)據(jù)
再來點(diǎn)刺激的,既然我們能將代碼暫存起來,當(dāng)然也能將暫存區(qū)的數(shù)據(jù)刪除,萬(wàn)一一個(gè)不小心手抖,將暫存區(qū)的數(shù)據(jù)刪掉了怎么辦?不要以為不可能,阿粉就干過!畢竟手速太快,一行命令錯(cuò)了就沒了。刪除的命令我這里不說,大家想知道的自己查,阿粉只說刪除了過后怎么解決。刪除過后千萬(wàn)不要慌,我們執(zhí)行下面命令找到對(duì)應(yīng)的記錄,然后應(yīng)用回來就好。git log --graph --oneline --decorate $( git fsck --no-reflog | awk '/dangling commit/ {print $3}') 找到對(duì)應(yīng)的 id,然后git stash apply id 。如下圖所示:
仔細(xì)看上圖的命令執(zhí)行過程,會(huì)發(fā)現(xiàn)我們將刪除的代碼又找回來了,爽歪歪啊。(刪除的命令假裝沒有看到,然后提醒大家不管是提交還是暫存代碼備注信息都要寫清楚,不要每次都更新代碼,提交代碼,update,這樣的話就算找到丟失列表,你也不知道要恢復(fù)哪一個(gè))。上面截圖中為了演示多次使用了如下命令
- git status :查看工作區(qū)文件狀態(tài)
- git stash save 'messag' : 暫存工作區(qū)的文件
- git stash list: 查看所有暫存列表
- git stash apply id: 恢復(fù)暫存的文件
idea 對(duì)應(yīng)的功能
任何強(qiáng)大的命令在 IDE 里面都會(huì)有對(duì)應(yīng)的功能,同樣的git stash 的功能在 IDEA 里面也有可視化的操作,如下圖所示:
在這里我們可以 stash 相關(guān)代碼,也可以 apply 相關(guān)的代碼,操作起來簡(jiǎn)單方便?;謴?fù)的時(shí)候找到對(duì)應(yīng)的記錄,apply 一下就可以了,同樣的也可以進(jìn)行 drop 和 clear。apply 過后可以 drop 掉對(duì)應(yīng)的 stash,clear 命令謹(jǐn)慎操作,誤操作過后,參考上面命令進(jìn)行恢復(fù)。
Cherry-pick
下面介紹另一個(gè)強(qiáng)大的功能,還是上面的場(chǎng)景,我們拉取新的分支進(jìn)行 bug 的修復(fù),那么同樣的 bug 在當(dāng)前分支肯定也是存在的,按照常理來說我們也需要在當(dāng)前分支進(jìn)行同樣的代碼修改,不然后續(xù)提交過后,bug 會(huì)依然存在。那么問題來了,同樣的代碼不想寫兩遍怎么辦?這個(gè)時(shí)候就可以使用 git 的 cherry-pick 命令,將之前在其他分支的修改重放到當(dāng)前分支。
來全場(chǎng)跟著阿粉的步伐,我們整齊劃一模擬一下這個(gè)場(chǎng)景
假設(shè)我們當(dāng)前的需求代碼開發(fā)在分支 master 上面(當(dāng)然正常的代碼開發(fā)肯定是在 dev 分支,阿粉這里是以寫文檔的一個(gè)項(xiàng)目所以直接在 master 上面了,后面提到的測(cè)試環(huán)境也只是虛擬出來的),這個(gè)時(shí)候測(cè)試環(huán)境有個(gè)緊急 bug 需求修復(fù),本地的代碼沒寫完不想提交,通過上面的 stash 命令一頓操作,暫存的相關(guān)代碼,然后我們從測(cè)試環(huán)境拉取新的分支 bug01 ,將相關(guān)的 bug 修復(fù)了,并提交了代碼。阿粉這里模擬在 bug01 分支上面創(chuàng)建一個(gè)新文件,然后使用該命令放到 master 分支里面。
使用git checkout -b bug01 創(chuàng)建新的分支,增加,修改并提交 test-cherry-pick.md 文件,如下圖所示,復(fù)制提交過后的 ID,在這里是a755c56,然后我們使用git checkout master切換到 master 分支,這個(gè)時(shí)候 master 分支的 test-cherry-pick.md 文件并沒有在 bug01 分支的修改。下面我們使用該命令看下效果,
通過上面的操作,可以看到 master 分支已經(jīng)有了在 bug01 分支上面修改的代碼。爽歪歪啊!不得不說這個(gè)功能太強(qiáng)大了。到這里阿粉不得不致敬一下林納斯大佬。
小結(jié)一下cherry-pick 命令主要分兩步,第一步在其他分支上修改并提交代碼,第二步切換到同樣需要修改的分支,執(zhí)行命令從而達(dá)到效果。同樣的這個(gè)功能在 idea 中也有可視化的操作,只要在需要修改的分支,點(diǎn)擊該圖標(biāo)就好了。
關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
常規(guī)的操作都是在遠(yuǎn)程服務(wù)器上面已經(jīng)有了一個(gè)倉(cāng)庫(kù),我們通過git clone url 拉取相關(guān)代碼,但是有時(shí)候會(huì)是我們?cè)诒镜貏?chuàng)建了一個(gè)文件夾,并且初始化成為 git 倉(cāng)庫(kù)了,這個(gè)時(shí)候需要推送到遠(yuǎn)程服務(wù)器上面,這種情況我們現(xiàn)在遠(yuǎn)程服務(wù)器上創(chuàng)建倉(cāng)庫(kù),然后使用命令git remote add origin git@server-name:path/repo-name.git 推送到服務(wù)器上即可。
其他常用 git 命令
- git branch: 查看分支列表;
- git push origin master: 推送代碼到遠(yuǎn)程服務(wù)器;
- git checkout -b brandName或者新版本 git git switch -c brandName 創(chuàng)建并切換到新分支;
- git merge branchName : 合并某分支代碼到當(dāng)前分支;
- git log: 查看提交記錄;
總結(jié)
Git 作為代碼版本管理工具已經(jīng)成為主流了,全球最大的同性網(wǎng)站 GitHub 也是根據(jù) Git 而來的,這么好的一個(gè)工具強(qiáng)烈推薦大家都進(jìn)行使用,對(duì)于一些還是使用 svn,csv 的伙伴真的需要換一下了。Git 的出現(xiàn)其實(shí)是一個(gè)偶然,官網(wǎng)有它的介紹,喜歡的朋友可以去看看,廖雪峰老師寫過一個(gè) Git 的教程,很不錯(cuò),阿粉的這些騷操作也是在廖老師的網(wǎng)站上看到的,大家可以去深入學(xué)習(xí)一下。