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