前言

記得剛開始做專案開發的時候都是一個人完成一個專案,單打獨鬥的開發,也不知道什麼是團隊開發,沒有這個概念,隨著工作後來知道公司裡專案都是團隊開發,這個時候這麼多人怎麼開發一個專案呢,難道用u盤拷貝嘛,後來知道有這個一個專案版本管理工具前期SVN比較流行後面,開始使用Git 這樣團隊·在做專案開發基於git 版本管理就會很輕鬆

快速上手

初始化本地倉庫

專案中使用git需要把專案初始化為git倉庫這裡要自行安裝git 通過git --version 檢視git版本是否安裝成功

  1. 初始化專案git倉庫

    找到專案根路徑 通過命令git init初始化本地倉庫

  2. 把專案程式碼新增到倉庫

    通過 git add .來新增點代表所有檔案。新增本地倉庫成功後,java檔案會變成綠色

  3. 提交檔案到本地倉庫通過git commit -m "First commit" m後面表示提交的註釋資訊

關聯遠端倉庫

這裡我們以GitHub作為專案遠端倉庫例子到遠端倉庫的頁面上,複製倉庫地址

這裡可以使用https或者ssh兩種遠端連線方式,htts比較方便直接連線使用,ssh需要配置對呀key和toke,但是比http更加的安全,這裡我為了方便就使用https,一般在公司專案都會使用ssh的

  1. 關聯遠端倉庫地址到本地倉庫
git remote add origin {遠端倉庫地址}
# Sets the new remote
  1. push到遠端倉庫

把本地專案程式碼push同步到遠端倉庫通過git push -u origin master命令來實現,master代表遠端主分支。

忽略檔案

在專案中有一些程式碼,是不需要提交的每次更新,比如,class位元組檔案,也就是targer檔案,還有開發工具的生成的一些檔案,jar檔案,屬性檔案,等等,這個時候我們就可以通過編寫.gitignore 把不需要的提交的檔案目錄新增到.gitignore檔案中就可以啦

  1. 忽略規則

通過在專案下定義.gitignore檔案,在該檔案中定義相應的忽略規則,來管理當前資料夾下的檔案的Git提交行為

在.gitingore 檔案中,遵循相應的語法,在每一行指定一個忽略規則。如:

*.log
*.temp
/vendor
  1. 語法規則

gitignore註釋用'#', *表示匹配0個或多個任意字元,所以上面的模式就是要忽略所有的xml檔案,log檔案和apk檔案。

.gitignore配置檔案用於配置不需要加入版本管理的檔案,配置好該檔案可以為版本管理帶來很大的便利

#               表示此為註釋,將被Git忽略
*.a 表示忽略所有 .a 結尾的檔案
!lib.a 表示但lib.a除外
/TODO 表示僅僅忽略專案根目錄下的 TODO 檔案,不包括 subdir/TODO
build/ 表示忽略 build/目錄下的所有檔案,過濾整個build資料夾;
doc/*.txt 表示會忽略doc/notes.txt但不包括 doc/server/arch.txt bin/: 表示忽略當前路徑下的bin資料夾,該資料夾下的所有內容都會被忽略,不忽略 bin 檔案
/bin: 表示忽略根目錄下的bin檔案
/*.c: 表示忽略cat.c,不忽略 build/cat.c
debug/*.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo: 表示忽略/foo,a/foo,a/b/foo等
a/**/b: 表示忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh 表示不忽略bin目錄下的run.sh檔案
*.log: 表示忽略所有 .log 檔案
config.php: 表示忽略當前路徑的 config.php 檔案 /mtk/ 表示過濾整個資料夾
*.zip 表示過濾所有.zip檔案
/mtk/do.c 表示過濾某個具體檔案 被過濾掉的檔案就不會出現在git倉庫中(gitlab或github)了,當然本地庫中還有,只是push的時候不會上傳。 需要注意的是,gitignore還可以指定要將哪些檔案新增到版本管理中,如下:
!*.zip
!/mtk/one.txt 唯一的區別就是規則開頭多了一個感嘆號,Git會將滿足這類規則的檔案新增到版本管理中。為什麼要有兩種規則呢?
想象一個場景:假如我們只需要管理/mtk/目錄中的one.txt檔案,這個目錄中的其他檔案都不需要管理,那麼.gitignore規則應寫為::
/mtk/*
!/mtk/one.txt 假設我們只有過濾規則,而沒有新增規則,那麼我們就需要把/mtk/目錄下除了one.txt以外的所有檔案都寫出來!
注意上面的/mtk/*不能寫為/mtk/,否則父目錄被前面的規則排除掉了,one.txt檔案雖然加了!過濾規則,也不會生效! ----------------------------------------------------------------------------------
還有一些規則如下:
fd1/*
說明:忽略目錄 fd1 下的全部內容;注意,不管是根目錄下的 /fd1/ 目錄,還是某個子目錄 /child/fd1/ 目錄,都會被忽略; /fd1/*
說明:忽略根目錄下的 /fd1/ 目錄的全部內容; /*
!.gitignore
!/fw/
/fw/*
!/fw/bin/
!/fw/sf/
說明:忽略全部內容,但是不忽略 .gitignore 檔案、根目錄下的 /fw/bin/ 和 /fw/sf/ 目錄;注意要先對bin/的父目錄使用!規則,使其不被排除。

注意 這裡一般會出現問題.gitignore 檔案明明配置了但是沒有生效

有兩種可能:

  1. .gitignore 檔案配置有問題,比如我碰到過一次這個問題:我在 windows 系統下的 idea 中使用了 「Add to gitignore」 這個外掛去新增需要被 ignore 的資料夾時候,它會在我的 .gitignore 檔案中寫入:.idea\ ,實際上應該是:/.idea/

  2. 在你新增新的 ignore 規則前,你曾經已經提交過這個規則對應的檔案,這時候你需要先把本地快取刪除(改變成未 track 狀態)使用指令:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

git 常用命令

遠端倉庫相關命令

  1. 檢出倉庫: git clone git://github.com/jquery/jquery.git

  2. 檢視遠端倉庫: git remote -v

  3. 新增遠端倉庫: git remote add [name] [url]

  4. 刪除遠端倉庫:git remote rm [name]

  5. 修改遠端倉庫:git remote set-url --push [name] [newUrl]

  6. 拉取遠端倉庫:git pull [remoteName] [localBranchName]

  7. 推送遠端倉庫:git push [remoteName] [localBranchName]

如果想把本地的某個分支test提交到遠端倉庫,並作為遠端倉庫的master分支,或者作為另外一個名叫test的分支,如下:

$git push origin test:master // 提交本地test分支作為遠端的master分支

$git push origin test:test // 提交本地test分支作為遠端的test分支

分支(branch)操作相關命令

  1. 檢視本地分支:git branch

  2. 檢視遠端分支: git branch -r

  3. 建立本地分支: git branch [name] ----注意新分支建立後不會自動切換為當前分支

  4. 切換分支: git checkout [name]

  5. 建立新分支並立即切換到新分支:git checkout -b [name]

  6. 刪除分支:git branch -d [name] ---- -d選項只能刪除已經參與了合併的分支,對於未有合併的分支是無法刪除的。如果想強制刪除一個分支,可以使用-D選項

  7. 合併分支: git merge [name] ----將名稱為[name]的分支與當前分支合併

  8. 建立遠端分支(本地分支push到遠端):git push origin [name]

  9. 刪除遠端分支:git push origin :heads/[name] $ git push origin :[name]

版本(tag)操作相關命令

  1. 檢視版本:git tag

  2. 建立版本:git tag [name]

  3. 刪除版本:git tag -d [name]

  4. 檢視遠端版本:git tag -r

  5. 建立遠端版本(本地版本push到遠端): git push origin [name]

  6. 刪除遠端版本:git push origin :refs/tags/[name]

  7. 合併遠端倉庫的tag到本地:git pull origin --tags

  8. 上傳本地tag到遠端倉庫: git push origin --tags

  9. 建立帶註釋的tag: git tag -a [name] -m 'yourMessage'

git分支

這裡git基本使用 參考 廖雪峰老師 git基本使用教程

主分支

實際開發中,一個倉庫(通常只放一個專案)主要存在兩條主分支:masterdevelop分支。這個兩個分支的生命週期是整個專案週期。就是說,自創建出來就不會刪除,會隨著專案的不斷開發不斷的往裡面新增程式碼。master分支是建立git倉庫時自動生成的,隨即我們就會從master分支建立develop分支,如下圖所示。

  1. master:這個分支最為穩定,這個分支代表專案處於可釋出的狀態。

例如王二狗向master分支合併了程式碼,那就意味著王二狗完成了此專案的一個待發布的版本,專案經理可以認為,此專案已經準備好釋出新版本了。所以master分支不是隨隨便便就可以簽入程式碼的地方,只有計劃釋出的版本功能在develop分支上全部完成,而且測試沒有問題了才會合併到master上。

  1. develop:作為開發的分支,平行於master分支。

例如王二狗要開發一個註冊功能,那麼他就會從develop分支上建立一個feature分支 fb-register(後面講),在fb-register分支上將註冊功能完成後,將程式碼合併到develop分支上。這個fb-register就完成了它的使命,可以刪除了。專案經理看王二狗效率很高啊,於是:“二狗你順帶把登入功能也做了吧”。二狗心中暗暗罵道:日了個狗的,但是任務還的正常做,二狗就會重複上面的步驟:從develop分支上新建立一個名為fb-login的分支,喝杯咖啡繼續開發,1個小時後登入功能寫好了,二狗又會將這個分支的程式碼合併回develop分支後將其刪除

支援分支

這些分支都是為了程式設計師協同開發,以及應對專案的各種需求而存在的。這些分支都是為了解決某一個具體的問題而設立,當這個問題解決後,程式碼會合並回主分支develop或者master後刪除,一般我們會人為分出三種分支

  1. Feature branches:這種分支和我們程式設計師日常開發最為密切,稱作功能分支

    必須從develop分支建立,完成後合併回develop分支

  2. Hotfix branches:這個分支主要為修復線上特別緊急的bug準備的

  3. Release branches:這個分支用來分佈新版本。

參考

  1. git常用命令
  2. gitignore配置規則
  3. .gitignore不生效