項目版本管理Git使用詳細教程

前言

記得剛開始做項目開發(fā)的時候都是一個人完成一個項目,單打獨斗的開發(fā),也不知道什么是團隊開發(fā),沒有這個概念,隨著工作后來知道公司里項目都是團隊開發(fā),這個時候這么多人怎么開發(fā)一個項目呢,難道用u盤拷貝嘛,后來知道有這個一個項目版本管理工具前期SVN比較流行后面,開始使用Git 這樣團隊·在做項目開發(fā)基于git 版本管理就會很輕松

快速上手

初始化本地倉庫

項目中使用git需要把項目初始化為git倉庫這里要自行安裝git 通過git --version查看git版本是否安裝成功

  1. 初始化項目git倉庫
    找到項目根路徑 通過命令git init初始化本地倉庫

  2. 把項目代碼添加到倉庫
    通過 git add .來添加點代表所有文件。添加本地倉庫成功后,java文件會變成綠色

  3. 提交文件到本地倉庫通過git commit -m "First commit" m后面表示提交的注釋信息

關(guān)聯(lián)遠程倉庫

這里我們以GitHub作為項目遠程倉庫例子到遠程倉庫的頁面上,復(fù)制倉庫地址

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

  1. 關(guān)聯(lián)遠程倉庫地址到本地倉庫
git remote add origin {遠程倉庫地址}
# Sets the new remote

  1. push到遠程倉庫

把本地項目代碼push同步到遠程倉庫通過git push -u origin master命令來實現(xiàn),master代表遠程主分支。

忽略文件

在項目中有一些代碼,是不需要提交的每次更新,比如,class字節(jié)文件,也就是targer文件,還有開發(fā)工具的生成的一些文件,jar文件,屬性文件,等等,這個時候我們就可以通過編寫.gitignore 把不需要的提交的文件目錄添加到.gitignore文件中就可以啦

  1. 忽略規(guī)則

通過在項目下定義.gitignore文件,在該文件中定義相應(yīng)的忽略規(guī)則,來管理當(dāng)前文件夾下的文件的Git提交行為

在.gitingore 文件中,遵循相應(yīng)的語法,在每一行指定一個忽略規(guī)則。如:

*.log
*.temp
/vendor
  1. 語法規(guī)則

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

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

#               表示此為注釋,將被Git忽略
*.a             表示忽略所有 .a 結(jié)尾的文件
!lib.a          表示但lib.a除外
/TODO           表示僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
build/          表示忽略 build/目錄下的所有文件,過濾整個build文件夾;
doc/*.txt       表示會忽略doc/notes.txt但不包括 doc/server/arch.txt
 
bin/:           表示忽略當(dāng)前路徑下的bin文件夾,該文件夾下的所有內(nèi)容都會被忽略,不忽略 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:     表示忽略當(dāng)前路徑的 config.php 文件
 
/mtk/           表示過濾整個文件夾
*.zip           表示過濾所有.zip文件
/mtk/do.c       表示過濾某個具體文件
 
被過濾掉的文件就不會出現(xiàn)在git倉庫中(gitlab或github)了,當(dāng)然本地庫中還有,只是push的時候不會上傳。
 
需要注意的是,gitignore還可以指定要將哪些文件添加到版本管理中,如下:
!*.zip
!/mtk/one.txt
 
唯一的區(qū)別就是規(guī)則開頭多了一個感嘆號,Git會將滿足這類規(guī)則的文件添加到版本管理中。為什么要有兩種規(guī)則呢?
想象一個場景:假如我們只需要管理/mtk/目錄中的one.txt文件,這個目錄中的其他文件都不需要管理,那么.gitignore規(guī)則應(yīng)寫為::
/mtk/*
!/mtk/one.txt
 
假設(shè)我們只有過濾規(guī)則,而沒有添加規(guī)則,那么我們就需要把/mtk/目錄下除了one.txt以外的所有文件都寫出來!
注意上面的/mtk/*不能寫為/mtk/,否則父目錄被前面的規(guī)則排除掉了,one.txt文件雖然加了!過濾規(guī)則,也不會生效!
 
----------------------------------------------------------------------------------
還有一些規(guī)則如下:
fd1/*
說明:忽略目錄 fd1 下的全部內(nèi)容;注意,不管是根目錄下的 /fd1/ 目錄,還是某個子目錄 /child/fd1/ 目錄,都會被忽略;
 
/fd1/*
說明:忽略根目錄下的 /fd1/ 目錄的全部內(nèi)容;
 
/*
!.gitignore
!/fw/ 
/fw/*
!/fw/bin/
!/fw/sf/
說明:忽略全部內(nèi)容,但是不忽略 .gitignore 文件、根目錄下的 /fw/bin/ 和 /fw/sf/ 目錄;注意要先對bin/的父目錄使用!規(guī)則,使其不被排除。

注意 這里一般會出現(xiàn)問題.gitignore 文件明明配置了但是沒有生效

有兩種可能:

  1. .gitignore 文件配置有問題,比如我碰到過一次這個問題:我在 windows 系統(tǒng)下的 idea 中使用了 「Add to gitignore」 這個插件去添加需要被 ignore 的文件夾時候,它會在我的 .gitignore 文件中寫入:.idea\ ,實際上應(yīng)該是:/.idea/

  2. 在你添加新的 ignore 規(guī)則前,你曾經(jīng)已經(jīng)提交過這個規(guī)則對應(yīng)的文件,這時候你需要先把本地緩存刪除(改變成未 track 狀態(tài))使用指令:

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

git 常用命令

遠程倉庫相關(guān)命令

  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)操作相關(guān)命令

  1. 查看本地分支:git branch

  2. 查看遠程分支: git branch -r

  3. 創(chuàng)建本地分支: git branch [name] ----注意新分支創(chuàng)建后不會自動切換為當(dāng)前分支

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

  5. 創(chuàng)建新分支并立即切換到新分支:git checkout -b [name]

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

  7. 合并分支: git merge [name] ----將名稱為[name]的分支與當(dāng)前分支合并

  8. 創(chuàng)建遠程分支(本地分支push到遠程):git push origin [name]

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

版本(tag)操作相關(guān)命令

  1. 查看版本:git tag

  2. 創(chuàng)建版本:git tag [name]

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

  4. 查看遠程版本:git tag -r

  5. 創(chuàng)建遠程版本(本地版本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. 創(chuàng)建帶注釋的tag: git tag -a [name] -m 'yourMessage'

git分支

image

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

主分支

實際開發(fā)中,一個倉庫(通常只放一個項目)主要存在兩條主分支:masterdevelop分支。這個兩個分支的生命周期是整個項目周期。就是說,自創(chuàng)建出來就不會刪除,會隨著項目的不斷開發(fā)不斷的往里面添加代碼。master分支是創(chuàng)建git倉庫時自動生成的,隨即我們就會從master分支創(chuàng)建develop分支,如下圖所示。

image
  1. master:這個分支最為穩(wěn)定,這個分支代表項目處于可發(fā)布的狀態(tài)。

例如王二狗向master分支合并了代碼,那就意味著王二狗完成了此項目的一個待發(fā)布的版本,項目經(jīng)理可以認為,此項目已經(jīng)準備好發(fā)布新版本了。所以master分支不是隨隨便便就可以簽入代碼的地方,只有計劃發(fā)布的版本功能在develop分支上全部完成,而且測試沒有問題了才會合并到master上。

  1. develop:作為開發(fā)的分支,平行于master分支。

例如王二狗要開發(fā)一個注冊功能,那么他就會從develop分支上創(chuàng)建一個feature分支 fb-register(后面講),在fb-register分支上將注冊功能完成后,將代碼合并到develop分支上。這個fb-register就完成了它的使命,可以刪除了。項目經(jīng)理看王二狗效率很高啊,于是:“二狗你順帶把登錄功能也做了吧”。二狗心中暗暗罵道:日了個狗的,但是任務(wù)還的正常做,二狗就會重復(fù)上面的步驟:從develop分支上新創(chuàng)建一個名為fb-login的分支,喝杯咖啡繼續(xù)開發(fā),1個小時后登錄功能寫好了,二狗又會將這個分支的代碼合并回develop分支后將其刪除

支持分支

這些分支都是為了程序員協(xié)同開發(fā),以及應(yīng)對項目的各種需求而存在的。這些分支都是為了解決某一個具體的問題而設(shè)立,當(dāng)這個問題解決后,代碼會合并回主分支develop或者master后刪除,一般我們會人為分出三種分支

  1. Feature branches:這種分支和我們程序員日常開發(fā)最為密切,稱作功能分支
    必須從develop分支創(chuàng)建,完成后合并回develop分支
  1. Hotfix branches:這個分支主要為修復(fù)線上特別緊急的bug準備的

  2. Release branches:這個分支用來分布新版本。

參考

  1. git常用命令
  2. gitignore配置規(guī)則
  3. .gitignore不生效
?著作權(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)容

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