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