1. 程式人生 > 其它 >GIT 最佳實踐 轉載 https://www.cnblogs.com/jeff-liu/p/13850674.html

GIT 最佳實踐 轉載 https://www.cnblogs.com/jeff-liu/p/13850674.html

Git使用最佳實踐

git概述

git是一款分散式的版本控制系統。這與SVN這種集中式的版本控制系統最大的區別就是開發者可以commit修改到本地的git倉庫。解決多人同步開發程式碼的問題。

最基本git開發過程圖示:

Git本地有四個工作區域:

  • 工作目錄(working directory),
  • 暫存區(stage/index),
  • 版本庫(Repository或git directory),
  • 如果再加上遠端的git倉庫(remote directory)就可以分為四個工作區域。

檔案的四種狀態:

  • Untracked:未跟蹤,此檔案在資料夾中,但並沒有加入到git庫,不參與版本控制。通過git add狀態變為Staged
  • Unmodified:檔案已經入庫,未修改,即版本庫中的檔案快照內容與資料夾中的完全一致。這種型別的檔案有兩種去處,如果他被修改,就變為Modified;如果使用git rm移出版本庫,則變為Untracked。
  • Modified:檔案已修改,但僅僅是修改,沒進行其它的操作。這個檔案也有兩種去處,通過git add可以進入暫存staged狀態;使用git checkout則丟棄修改,返回到Unmodified狀態。這個git checkout即從庫中取出檔案,覆蓋當前修改!
  • Staged: 暫存狀態,執行git commit則將修改同步到庫中。這時庫中的檔案與本地檔案一致,又變為了Unmodified狀態。執行git reset HEAD取消暫存,檔案狀態變為Modified。

比較有趣的一點:一個檔案可以又在“暫存區”(先git add),又在“工作目錄”的修改狀態(再進一步修改)。

git的分支

為什麼要用多分支

只有一個分支會遇到下面的問題,例如:

  • 比如已經上線了一個版本,並且開始新版本的開發,已經提交了一些修改。但在版本使用了一段時間後發現bug要修改,這時就會很尷尬。修改程式碼只能在包含了一部分新功能的程式碼上進行改bug。
  • 還有一種情況,兩人開發兩個不同功能,一個功能先上線,那另外那個人的程式碼就一直不能提交。這個人的電腦的安全性就變得很重要,唯恐丟失開發的程式碼,另外也不利於公司跟蹤進度。如果第二個功能是多人開發,功能程式碼無法同步,就更無法實現了。

推薦的分支管理方法

首先,分支管理沒有silver bullet,暫時採用下面的分支管理方法:

  • master分支(主分支)- 生產環境下的正式版本。
  • develop分支- 平時開發環境的分支。
  • release分支- 來自於develop分支,最後必須合併回develop和master分支。完成所有預期的開發任務時,就可以從 develop 分支創建出 release 分支. 新建立的realse分上可以進行bug fix, 但是禁止在release分支上進行重大特性的更新。release分支屬於臨時性質,用完可以刪除。
  • hotfix分支- 生產環境下發現問題,需要立即修復。修復後需要merge到master分支、develop分支。hotfix分支也屬於臨時性質,用完可以刪除。
  • feature分支- 用來開發新特性的分支,來自於develop分支。完成開發時,合併回develop分支。feature分支也屬於臨時性質,用完可以刪除。

git日常操作

git-建立一個提交版本

#對當前head版本做出修改
git add . #檔案修改進入“暫存區”
git commit -m "一定要加註釋" #暫存區修改進入版本庫,建立版本記錄,head指向最新的版本
git log #可以檢視版本資訊(在IDEA中出現高亮時,可以按ctrl+Enter會開啟相應的IDE介面)

圖示

git-放棄對一個檔案的修改

# 如果檔案還沒有放入暫存區
git checkout -- <檔名> #放棄對某一個檔案已經做出的修改,回到head版本的該檔案

# 如果檔案已經放入暫存區
git reset HEAD <檔名> #取消暫存,取消暫存後會進入modified狀態,再如上操作。 
git checkout -- <檔名> #放棄對某一個檔案已經做出的修改,回到head版本的該檔案

git-回退到上一個版本

git reset --hard head~1 #回到上一個版本
git reset --hard head~100 #回到前面第100個版本
git reset --hard head #回到本版本,用來放棄更改
git reset --hard <commitid> #回到commit id指定的版本

圖示

注意:

  1. 這裡被回退掉的版本其實沒有丟失,還可以通過commit id找回來。

  2. 這裡的引數--hard的作用:**

    • 如果有--hard,則完全回退到上一版本,丟棄所有其它修改,清空暫存區,同步工作目錄到指定版本。
      例如已經commit了版本2,reset --hard到版本1,則版本1和2之間的變化部分會被徹底丟棄。

    • 沒有--hard,則該版本之後的變化會變為Modified狀態保留在工作目錄,只清空暫存區。
      例如已經commit了版本2,reset到head版本1,則版本1和2之間的變化部分會儲存到工作目錄,處於modified狀態。

git-比較一個檔案在兩個版本之間的不同

git diff head~1 head -- <檔名> #比較上一個版本和這一個版本某個檔案的不同
git diff head~1 -- <檔名> #比較上一個版本和目前正在修改的檔案的不同
git diff #只能比較出處於modified狀態的修改,如果所有變更都放到暫存區了,則無返回

git-建立一個分支並跳轉到這個新建分支,再推送到遠端倉庫

注意:如果這個新建的分支只是在本地短期使用,可以不必push到遠端倉庫中。

#建分支和切換分兩步完成
git branch <new branch name> #建立分支
git checkout <new branch name> #跳轉到新分支
# 或者 建分支和切換用一個命令完成
git checkout -b  <new branch name> #建立並跳轉到新分支

#------------遠端相關----------------------
git push --set-upstream origin <new branch name> #推新分支到遠端倉庫並在本地分支和遠端分支之間建立關聯
# 也可以分兩步完成,但推薦上面的方式
git push origin <new branch name> #推新分支到遠端倉庫
git branch --set-upstream-to=origin/<new branch name> <new branch name> #關聯本地分支到遠端分支,如果不是這個關聯,每一次pull或push的時候都需要明確指定本地和遠端分支。

git branch -v #檢視本地分支有哪些
git branch -r -v #檢視本地分支有哪些

git-打標籤

tag 是 Git 版本庫的一個快照,指向某個 commit 的指標。tag其實也是一種分支,只是這種分支無法再繼續被push新內容進去。

git tag -a "release_a.b.c" -m "this is a.b.c version" #打標籤, -a是標籤名 -m註釋
git push origin "release_a.b.c" #將這個新標籤推送到遠端倉庫

git tag #檢視標籤資訊
git show release_a.b.c #顯示被打標籤的commit的詳細資訊

git-在hotfix1分支完成開發後,合併到master分支

同理也可以從自己的臨時開發分支合併到feature_abc分支

git checkout -b hotfix1 release_a.b.c #從release_a.b.c這個標籤的版本上開一個新的修復分支
git push origin hotfix1 #將hotfix1分支推送到遠端倉庫
git branch --set-upstream-to=origin/hotfix1 hotfix1 #關聯本地分支到遠端分支
#做一些修改
git add .
git commit -m "改了什麼東西"
git push 
#經過測試沒問題,合併回master
git fetch
git checkout master
git pull #確保是遠端倉庫的最新程式碼
git merge hotfix1
git push #把merge後的結果推到遠端倉庫的master分支
#接下來應該打新標籤併發布到生產系統
git tag ...
# 如果此時還有開發分支也要merge到開發分支

git-從develop分支釋出正式版本的流程

git checkout -b release-2.1.0 develop #從develop分支上開一個新的釋出分支
# 修改版本號,移除包名中的snapshot等
git add .
git commit -m "release version 2.1.0"

#全部bug修復,經過測試沒問題,合併回master
git checkout master
git merge release-2.1.0
git push #把merge後的結果推到遠端倉庫的master分支
#接下來應該打新標籤併發布到生產系統
git tag -a "release-2.1.0" -m "release version 2.1.0"

# 如果此時還有開發分支也要改bug的修改合併到開發分支
git fetch
git checkout develop
git merge release-2.1.0
git push

# 最後將release分支刪除
git branch -d release-2.1.0

git-如何切換到一個遠端分支

例如接手另一個同事的任務時,要從他的遠端分支繼續開發。

git fetch #重新整理遠端倉庫資訊獲得遠端分支的資訊(如果遠端分支是新建的話)
git branch -r #檢視是否可以看到遠端分支了,例子中會是origin/feature2
git checkout -b feature2 origin/feature2 #從遠端分支基礎上,直接建立本地分支並切換到該分支