Git 基礎(chǔ)及 Check-in Dance

Check-in Dance

流程

  • (1) Run tests in local

    本地運行測試,保證測試通過,如果有失敗就立即修復(fù),直至測試成功:$ mvn test

  • (2) Check CI status
    檢查 CI 狀態(tài),確認現(xiàn)在可以拉取代碼

  • (3) Pull
    開發(fā)新代碼之前,從 CI 完全成功的那個最新版本檢出代碼:$ git pull --rebase

  • (4) Run tests in local
    本地運行測試,保證測試通過,如果有失敗就立即修復(fù),直至測試成功:$ mvn test

  • (5) Make changes
    按照 red -> green -> refactor 方式編寫代碼;

    • red:根據(jù) Task 拆分,添加一個新的測試 (由于目前沒有實現(xiàn)代碼,測試失?。?/li>
    • green:添加最少的實現(xiàn)代碼,使測試通過
    • refactor:識別代碼中的 bad smell,重構(gòu)代碼
  • (6) Run tests in local
    完成一個小特性以后,本地運行測試通過,如果有失敗就立即修復(fù),直至測試成功:$ mvn test

  • (7) Review Changes
    在 IntelliJ 下 Alt + 9 review Local Changes

  • (8) Commit to local
    本地提交,小步提交,寫清楚 Story 編號有意義的提交信息;

$ git add .
$ git commit -m "[US27149] Add entity validation in creation process"
  • (9) Check CI status
    檢查 CI 狀態(tài),確認現(xiàn)在可以拉取代碼;

  • (10) Pull
    從遠端拉取最新代碼:$ git pull --rebase
    如果有沖突,修復(fù)有沖突的文件,然后

$ git add .
$ git rebase --continue
  • (11) Run tests in local
    本地運行測試,保證測試通過,如果又失敗就立即修復(fù),直至測試成功:$ mvn test

  • (12) Push
    本地 commit 通過測試之后,盡早 push 到遠端,以便團隊其他人員在新代碼庫上工作:$ git push

  • (13) Check CI status
    查看自己 push 之后,CI 狀態(tài)正常

注意事項

  • (1) 在步驟10中,頻繁與遠端代碼庫合并,避免 big bang conflict。如果本地已經(jīng)較長時間沒有拉取代碼庫的代碼,并且觀察到其他成員已經(jīng)進行了較多 commit,而本地有未完成工作不能 commit,如何同步遠端代碼庫的代碼呢?

我們可以先暫存目前的工作,拉取遠端的最新代碼,然后取回目前的工作與遠端代碼進行合并。這樣可以將合并前移,盡量避免 big bang conflict。

$ git stash
$ git pull --rebase
$ git stash pop
  • (2) 本地測試通過之后,盡早 push,避免big bang conflict

Git 簡介

基礎(chǔ)知識

Git 有三種狀態(tài),你的文件可能處于其中之一:已提交(committed)、已修改(modified)和已暫存(staged)。 已提交表示數(shù)據(jù)已經(jīng)安全的保存在本地數(shù)據(jù)庫中。 已修改表示修改了文件,但還沒保存到數(shù)據(jù)庫中。 已暫存表示對一個已修改文件的當(dāng)前版本做了標(biāo)記,使之包含在下次提交的快照中。

由此引入 Git 項目的三個工作區(qū)域的概念:Git 倉庫、工作目錄以及暫存區(qū)域。

git-area.png

常用命令

$ git status                      # 查看文件處于什么狀態(tài)
$ git log                         # 查看提交歷史
$ git add <filename>              # 將需要提交的文件從 Working Directory 添加到 Staging Area
$ git commit -m <message>         # 將 Staging Area 中的文件快照永久性移動到 Repository
$ git commit --amend              # 修改上次提交
$ git pull --rebase               # 拉取遠端代碼,將本地修改衍合到本地最新代碼上
$ git push                        # 將本地提交推送到遠端倉庫
$ git merge <branchname>          # 合并分支
$ git checkout -b <branchname>    # 新建并切換 Working Directory 到新分支
$ git checkout -- <filename>      # 丟棄文件修改,還原文件狀態(tài)到上次提交的狀態(tài)
$ git revert HEAD~<number>        # 找到倒數(shù)第<number>個提交,并創(chuàng)建一個新的提交來撤銷之后的更改
$ git reset HEAD^ <filename>      # 將當(dāng)前的某個 file 從緩存區(qū)移出,不影響工作目錄對其進行的修改
$ git reset --hard HEAD~<number>  # 移除最后<number>個提交,并將緩存區(qū)和工作目錄同步到指定的提交 

代碼回滾

Revert

Revert 撤銷一個提交的同時會創(chuàng)建一個新的提交。這是一個安全的方法,因為它不會重寫提交歷史。比如,下面的命令會找出倒數(shù)第二個提交,然后創(chuàng)建一個新的提交來撤銷這些更改,然后把這個提交加入項目中。

$ git checkout hotfix
$ git revert HEAD~2
reverting.png

在提交層面上,reset 將一個分支的末端指向另一個提交。這可以用來移除當(dāng)前分支的一些提交。比如,下面這兩條命令讓 hotfix 分支向后回退了兩個提交。

$ git checkout hotfix
$ git reset HEAD~2

hotfix 分支末端的兩個提交現(xiàn)在變成了懸掛提交。也就是說,下次 Git 執(zhí)行垃圾回收的時候,這兩個提交會被刪除。換句話說,如果你想扔掉這兩個提交,你可以這么做。reset 操作如下圖所示:

resetting.png

如果你的更改還沒有共享給別人,git reset 是撤銷這些更改的簡單方法。當(dāng)你開發(fā)一個功能的時候發(fā)現(xiàn)「糟糕,我做了什么?我應(yīng)該重新來過!」時,reset 就像是 go-to 命令一樣。

除了在當(dāng)前分支上操作,你還可以通過傳入這些標(biāo)記來修改你的緩存區(qū)或工作目錄:

--soft – 緩存區(qū)和工作目錄都不會被改變
--mixed – 默認選項。緩存區(qū)和你指定的提交同步,但工作目錄不受影響
--hard – 緩存區(qū)和工作目錄都同步到你指定的提交

把這些標(biāo)記想成定義 git reset 操作的作用域就容易理解多了。

scope-of-reset.png

當(dāng)你傳入 HEAD 以外的其他提交的時候要格外小心,因為 reset 操作會重寫當(dāng)前分支的歷史。正如 rebase 黃金法則所說的,在公共分支上這樣做可能會引起嚴重的后果。下表總結(jié)了 reset、checkout 和 revert 應(yīng)用到文件層面和提交層面的常用場景。

命令 作用域 常用情景
git reset 提交層面 在私有分支上舍棄一些沒有提交的更改
git reset 文件層面 將文件從緩存區(qū)中移除
git checkout 提交層面 切換分支或查看舊版本
git checkout 文件層面 舍棄工作目錄中的更改
git revert 提交層面 在公共分支上回滾更改
git revert 文件層面 (然而并沒有)

CI 變紅之后的操作指導(dǎo)

責(zé)任人

  • (1) 提交之后 Working Directory 或 Stage Area 是否存在未 commit 的修改

    • 如果存在未 commit 的修改
$ git stash  # 保存目前的修改,工作區(qū)和暫存區(qū)內(nèi)容回到問題提交點的狀態(tài) 
$ git status # 確認狀態(tài)是否正確 
  • (2) 運行測試

    • 測試未通過,說明 push 之前沒有在本地運行測試,未按照 check-in dance 的步驟提交代碼

      可以自己打臉提醒一下,不要再犯,暫時放下其他工作,開始全力 Debug 吧

    • 測試通過,說明很有可能是因為本地環(huán)境與 CI 環(huán)境不同,比如數(shù)據(jù)不一致等原因

      可以自己打臉清醒一下,暫時放下其他工作,開始全力 Debug 吧

  • (3) bug 修復(fù)流程
$ git checkout -b hot-fix   # 創(chuàng)建并切換到 hot-fix 分支,在該分支修復(fù) bug
  • (4) 15分鐘之內(nèi),是否完成了 bug 修復(fù)

完成了 bug 修復(fù),并在本地經(jīng)過了測試驗證

$ git add .                   # 將修改保存到暫存區(qū),準備提交
$ git commit -m <message>     # 將修改提交到 hot-fix 分支
$ git checkout master         # 切換到 master 分支
$ git rebase master hot-fix   # 將 bug 修改過程在 master 分支重演
$ git pull --rebase           # 原則上 CI 紅了其他人不能提交,這一步可以忽略
$ git push                    # 將修改提交到遠端

未完成 bug 修復(fù)

$ git stash                   # 保存在 hot-fix 分支未完成的修復(fù)工作
$ git checkout master         # 切換到 master 分支
$ git revert <commit hash>    # 創(chuàng)建一個 revert 提交撤銷引入 bug 的修改
$ git pull --rebase           # 原則上 CI 紅了其他人不能提交,這一步可以忽略
$ git push                    # 回退 CI 的代碼,先修復(fù) CI,保證其他人可以提交
$ git checkout hot-fix        # 切換回 hot-fix 分支
$ git stash pop               # 恢復(fù)目前已經(jīng)進行的修復(fù)工作,繼續(xù)修復(fù)
$ git add .                   # 修復(fù)完成,將修改保存到暫存區(qū),準備提交
$ git commit -m <message>     # 將修改提交到 hot-fix 分支
$ git checkout master         # 切換到 master 分支
$ git rebase master hot-fix   # 將 bug 修改過程在 master 分支重演
$ git pull --rebase           # 原則上 CI 紅了其他人不能提交,這一步可以忽略
$ git push                    # 將修改提交到遠端    

其他成員

  1. CI 變紅之后暫停提交代碼,直至 CI 變綠

  2. CI 變綠之后

$ git stash                        # 保存目前的工作,如果工作區(qū)和暫存區(qū)是干凈的,忽略此步驟
$ git pull --rebase                # 拉取最新的修復(fù)之后的代碼
$ git stash pop                    # 恢復(fù)當(dāng)前工作區(qū),繼續(xù)工作

參考文獻

  1. 代碼回滾:Reset、Checkout、Revert-的選擇
  2. Git Branch and Merging
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 4,163評論 0 11
  • Git常用語法 [TOC] Git簡介 描述 ? Git(讀音為/g?t/。)是一個開源的分布式版本控制系統(tǒng),...
    君惜丶閱讀 3,963評論 0 13
  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來。這樣一來,任何一處協(xié)同...
    __silhouette閱讀 16,214評論 5 147
  • 首先嘗試用pip安裝mysqldb時,會發(fā)生錯誤找不到匹配版本,這時需要手動下載一個 MySQL-python-1...
    Py_Explorer閱讀 311評論 0 0
  • 小小的街巷 窄窄的街巷 緩緩走著 緩緩走過 回憶在這里留存 倘若是即將忘記 在這兒 便可找尋 從前的純樸美麗 可以...
    孫滸胡閱讀 203評論 0 0

友情鏈接更多精彩內(nèi)容