Git的常規操作

老毛發表於2021-11-03
作為一名開發人員,不管走到哪裡可能都會和程式碼倉庫發生不可描述的關係,從clone倉庫 => 新的功能分支 => 開發功能完成後提交 => 分支合併 => 打上標籤 => 部署到線上環境,這一系列操作都離不開這個程式碼版本管理工具Git,所以常見命令爛熟於心有助於我們提升效率。

克隆git倉庫

gitlab或者github有有兩種克隆方式,ssh協議和http協議。使用http只要輸入使用者名稱和密碼即可,使用ssh是要部署自己的公鑰到gitlab或者github上,在登入使用者的設定裡邊配置。查詢自己的公鑰,一般在自己電腦的以下目錄:

➜  ~ cd .ssh
➜  .ssh ls
id_rsa      id_rsa.pub  known_hosts

公鑰就是id_rsa.pub這個檔案中的內容,部署好之後就可以去克隆倉庫了。

分支操作

git checkout -b

好的,聽說你已經把名為Blog的倉庫克隆到本地,現在Leader安排你做一個評論的功能,那麼從終端進入專案一般是這個樣子:

➜  Blog git:(main)

假如生產環境部署的是main分支或者叫master,那麼新的功能應該從這個主分支檢出。

➜  Blog git:(main) git checkout -b comment
Switched to a new branch 'comment'

* comment
  ele
  main

git status / git add / git commit

到這裡就可以在這個分支上做你的功能了。當你寫到興起的時候,突然Leader告訴你線上有個問題急需要修復。你看似穩如老狗,實則慌得一匹。不過無論如何用腳都能想到要先儲存你做了一半的評論功能。於是你使用了以下命令:

➜  Blog git:(comment) ✗ git status
On branch comment
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

// 看到了熟悉的內容改動,表示放心,使用下面的命令把它們納入到版本管理
➜  Blog git:(comment) ✗ git add .
➜  Blog git:(comment) ✗ git commit -m "comment progress 50%"
[comment 006a55d] comment progress 50%
 1 file changed, 1 insertion(+), 1 deletion(-)

git log / git reset

這樣做固然可以,但是產生了一次提交記錄,其實還可以把你的修改先暫存起來,現在我們把這次提交重置掉,要進行重置我們需要知道上一個版本號:

➜  Blog git:(comment) git log --oneline

006a55d (HEAD -> comment) comment progress 50%
2bf17f8 (origin/main, origin/HEAD, main) loading
56131ba 優化樣式
cc91d8c abstract
a81dbe7 sitemap
b915f65 baidu

可以看到我們只要重置2bf17f8這一次就好了,但是注意需要保留辛苦寫的 程式碼(bug)。於是機智的使用了下面命令:

➜  Blog git:(comment) git reset --mixed 2bf17f8
Unstaged changes after reset:
M    README.md
➜  Blog git:(comment) ✗ git status
On branch comment
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   README.md

愉快的回到了未提交之前的狀態。如果你使用git reset --hard 2bf17f8,那麼就要恭喜了,之前的改動就全部丟失了,所以一定要慎重。

git stash

為了減少一次無用的提交,我們使用git stash來暫存未完成的評論功能:

➜  Blog git:(comment) ✗ git stash
Saved working directory and index state WIP on comment: 2bf17f8 loading
// 可以看到是以上次提交的資訊記錄本次stash的內容

接下來就可以處理Leader安排的緊急任務了,從主分支切出hot_fix分支

➜  Blog git:(main) git checkout -b hot_fix
Switched to a new branch 'hot_fix'

問題修復後儲存提交:

➜  Blog git:(hot_fix) ✗ git add .
➜  Blog git:(hot_fix) ✗ git commit -m "bug fixed"

git merge

切換分支到main合併hot_fix

➜  Blog git:(hot_fix) git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
➜  Blog git:(main) git merge hot_fix
Updating 2bf17f8..b85e853
Fast-forward
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

到這裡,就可以從main分支釋出新的版本到線上了,並且修復了線上的緊急問題。這時你的本地出現了沒有用的分支hot_fix:

➜  Blog git:(main) git branch
  comment
  ele
  hot_fix
* main

現在可以把它刪除掉了,使用命令:

➜  Blog git:(main) git branch -d hot_fix
Deleted branch hot_fix (was b85e853).

假如之前你還把它推送到了遠端,檢視所有遠端分支:

➜  Blog git:(main) git branch -r
  origin/HEAD -> origin/main
  origin/ele
  origin/hot_fix
  origin/main
(END)

那現在遠端的分支也沒有任何用途了,使用下面命令刪除遠端分支:

➜  Blog git:(main) git push origin -d hot_fix
To github.com:iicoom/Blog.git
 - [deleted]         hot_fix

現在又重新回到清爽的狀態,可以重新回到comment分支完成之前的功能:

➜  Blog git:(main) git checkout comment
Switched to branch 'comment'

// 把之前暫存的內容恢復
➜  Blog git:(comment) git stash pop
On branch comment
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (0553a4fa89f44ea5708a21d5c421c7b1115c40cb)

又可以happy的coding了。本文通過一個場景,重現了在實際工作中一些git命令的使用,希望對你有幫助。

相關文章