git的使用原則是可復(fù)用诉瓦,不重復(fù),需放進(jìn)git遠(yuǎn)程倉(cāng)庫(kù)的文件:源代碼待逞、第三方文件甥角。
不需放進(jìn)git遠(yuǎn)程倉(cāng)庫(kù)的文件:自動(dòng)生成的文件(如obj,exe等)识樱,因?yàn)樽詣?dòng)生成的文件在修改源代碼后會(huì)改變其內(nèi)容,如果push前目標(biāo)分支有更新震束,你需要先pull再rebase怜庸,那么因?yàn)樽詣?dòng)生成的文件會(huì)造成你需要手動(dòng)合并修改,這是徒勞的垢村,極易造成混亂割疾,為了避免這種狀況,自動(dòng)生成的文件不能被放進(jìn)遠(yuǎn)程倉(cāng)庫(kù)嘉栓。
git的工作方法(workflow)
1.并行分叉式——集中式工作流
2.并行分支式——功能分支工作流
3.串行排隊(duì)式——Gerrit
4.pull request——Githup(對(duì)遠(yuǎn)程倉(cāng)庫(kù)的合并修改都由倉(cāng)庫(kù)owner和管理員控制)
基本配置
git config --global user.name "thomson"
git config --global user.email "thomson@gmail.com"
@tips 基礎(chǔ)配置宏榕,自報(bào)家門(mén)user.name和user.email , 用--global說(shuō)明電腦上所有的git倉(cāng)庫(kù)都將用它標(biāo)記
git config --global color.ui true //配置git顯示不同顏色拓诸,更醒目
git config --global alias.st status //命令縮寫(xiě),st代表status麻昼,可以用git st代替git status
git config --global alias.co checkout //命令縮寫(xiě)
git config --global alias.cm commit //命令縮寫(xiě)
git config --global alias.br branch //命令縮寫(xiě)
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" //配置得五顏六色
@tips 如果想刪除這些快捷命令奠支,可以在.git/config里把 [alias] 下的對(duì)應(yīng)內(nèi)容刪掉
初始化倉(cāng)庫(kù)
mkdir <dirname> //在當(dāng)前路徑下創(chuàng)建一個(gè)新目錄
cd <dirname> //cd進(jìn)新建的目錄
pwd //顯示當(dāng)前的工作路徑
git init //把當(dāng)前目錄變成git可以管理的倉(cāng)庫(kù),相當(dāng)于在當(dāng)前目錄下新建一個(gè)空的git倉(cāng)庫(kù)抚芦,在當(dāng)前目錄下會(huì)新建一個(gè).git目錄倍谜,默認(rèn)隱藏(可以使用ls -ah查看),這是跟蹤管理版本庫(kù)的叉抡,不可手動(dòng)修改
添加尔崔、提交、查看文件修改記錄
git add <filename1> <filename2> <filename3> //正常添加后不會(huì)有提示(沒(méi)消息就是好消息褥民,哈哈)
git commit -m "describe commit info" //提交本地修改季春,字符串是提交說(shuō)明
git status //實(shí)時(shí)查看倉(cāng)庫(kù)當(dāng)前的狀態(tài)
git diff <filename> //查看文件的修改記錄
查看提交記錄和回退版本
git log //查看當(dāng)前分支的提交記錄
git log --pretty=oneline //每次提交記錄用一行顯示,在記錄很多時(shí)不會(huì)全部顯示消返,在:輸入數(shù)字N即可顯示當(dāng)前位置順序后的N條提交信息
git reset --hard HEAD^ //把當(dāng)前分支文件版本回退到前一版本鹤盒,HEAD代表前一版本,HEAD100代表第前100個(gè)版本侦副,這里HEAD指的是當(dāng)前分支
git reset --hard version_id //version_id代表提交版本號(hào)侦锯,可以回退到具體某個(gè)版本 @tips reset參數(shù)有--hard --soft --mixed,hard會(huì)刪除包括緩存的所有修改秦驯,soft會(huì)保存所有修改(用到再查)
git reflog //記錄你操作的每一次命令尺碰,在回退到舊版本后想重新回到新版本時(shí)可以用來(lái)找到新版本的version_id
git reverse //如果已經(jīng)push,想遠(yuǎn)程倉(cāng)庫(kù)回退回之前的版本译隘,用此命令
工作區(qū)(文件存放目錄)亲桥、暫存區(qū)(stage)、版本庫(kù)(repository)
工作區(qū)有一個(gè)隱藏目錄.git固耘,這個(gè)不算工作區(qū)题篷,而是git的版本庫(kù),版本庫(kù)里存了很多東西厅目,其中最重要的就是稱(chēng)為stage(或者叫index)的暫存區(qū)番枚,還有g(shù)it自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD损敷。
@tips 暫存區(qū)就像購(gòu)物車(chē)葫笼,沒(méi)到付款的時(shí)候你都不確定購(gòu)物車(chē)?yán)锏臇|西全部都是要的,每拿一件商品就付一次款拗馒,那才麻煩大了(非常形象的比喻路星,233333)
@tips git add是把修改后的文件添加到暫存區(qū),git commit是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支诱桂,如果最新修改沒(méi)有被add進(jìn)暫存區(qū)洋丐,提交時(shí)不會(huì)提交最新修改呈昔,而是被add進(jìn)暫存區(qū)的修改
git diff -- <filename> //在工作區(qū)修改文件后沒(méi)有執(zhí)行g(shù)it add命令,直接執(zhí)行g(shù)it commit的話(huà)git不會(huì)把當(dāng)前工作區(qū)的最新修改提交到版本庫(kù)友绝,使用此命令可以查看當(dāng)前工作區(qū)的文件和版本庫(kù)中同一文件的異同
撤銷(xiāo)修改
git checkout -- <filename> //把文件在工作區(qū)的修改全部撤銷(xiāo)堤尾,這里分兩種情況:”一種是此文件自修改后還沒(méi)有被add,現(xiàn)在撤銷(xiāo)修改就回到和版本庫(kù)一模一樣的狀態(tài)九榔;一種是文件已經(jīng)被add哀峻,add后又做了修改,撤銷(xiāo)修改就回到添加到暫存區(qū)后的狀態(tài)哲泊∈s埃“此操作就是讓文件回到最近一次git commit或git add時(shí)的狀態(tài)。
git reser HEAD <filename> //當(dāng)修改過(guò)的文件被add進(jìn)暫存區(qū)切威,但是想回退時(shí)育特,可以用命令,與git checkout -- filename一起用就可以徹底消除修改
刪除文件
rm <filename> //在文件系統(tǒng)中刪除文件
git rm <filename> //在git版本庫(kù)中刪除文件
git checkout -- <filename> //如果在文件系統(tǒng)文件找不回來(lái)先朦,使用此命令從版本庫(kù)中提取文件最新版本到工作區(qū)缰冤,但是會(huì)丟失最近一次提交后修改的內(nèi)容
遠(yuǎn)程倉(cāng)庫(kù)、推送版本
@tips 因?yàn)楸镜豨it倉(cāng)庫(kù)和githup遠(yuǎn)程倉(cāng)庫(kù)之間的傳輸時(shí)通過(guò)ssh加密的喳魏,所以需要生成本地ssh key上傳到githup棉浸,githup允許添加多個(gè)key,在所用電腦生成ssh key上傳即可刺彩,這樣在所用電腦均可推送
ssh-keygen -t rsa -C "email@example.com" //一般不設(shè)置密碼迷郑,如果為了保密也可以設(shè)置密碼,生成完畢可以在主目錄里找到.ssh目錄创倔,里面有id_rsa和id_rsa.pub嗡害,前者是私鑰,后者是公鑰畦攘,私鑰需保密霸妹,公鑰可以公開(kāi)
git remote add origin git@github.com:thomson/testRepo.git //關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
git branch --set-upstream dev_v2.2 origin/dev_v2.2 //本地分支關(guān)聯(lián)遠(yuǎn)程分支
git push -u origin master //-u是第一次push時(shí)加上的,Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支知押,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái)叹螟,在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令,在以后就可以使用git push origin master推送最新修改了朗徊。在githup新建倉(cāng)庫(kù)后第一次push用此命令會(huì)報(bào)錯(cuò)首妖,如下:
因?yàn)樵趃ithup倉(cāng)庫(kù)有文件在本地沒(méi)有,所以要先rebase爷恳,執(zhí)行g(shù)it pull --rebase origin master,把遠(yuǎn)程倉(cāng)庫(kù)文件拉去到本地象踊,然后再push 即可
git rebase //當(dāng)你push時(shí)目標(biāo)分支有更新温亲,你需要先pull下目標(biāo)分支的更新棚壁,然后切換到開(kāi)發(fā)分支,執(zhí)行rebase命令合并更新栈虚,合并更新可能會(huì)提示沖突袖外,這時(shí)需要手動(dòng)合并,如果沒(méi)有提示沖突則會(huì)快速合并魂务,合并完成之后便可push曼验。@tips rebase命令實(shí)際上執(zhí)行的過(guò)程是把你在本地做的修改放在最新更新的后面,就像你是在最新更新過(guò)的文件做修改一樣粘姜,這一過(guò)程就可能會(huì)產(chǎn)生沖突需要手動(dòng)解決鬓照。(另一種說(shuō)法就是,在rebase時(shí)孤紧,git先把你在本地做的修改全保存在一個(gè)地方豺裆,然后刪除你的修改記錄,把最新的更新拉過(guò)來(lái)當(dāng)本地倉(cāng)庫(kù)号显,然后再把剛保存的文件合并到工作區(qū)的文件上臭猜,你再commit,push時(shí)就可能會(huì)產(chǎn)生沖突)
git push -f //強(qiáng)制推送押蚤,用你本地的文件替代git倉(cāng)庫(kù)中的內(nèi)容蔑歌,慎用,操作之后倉(cāng)庫(kù)中的數(shù)據(jù)會(huì)不見(jiàn)
git push origin <local branch name>:<origin branch name> //push的完成命令
git pull //從遠(yuǎn)程拉去文件揽碘,相當(dāng)于先git fetch再git merge
- git fetch origin develop
- git checkout develop
- git merge origin/develop
git pull origin <origin branch name> //拉取遠(yuǎn)程分支代碼與本地當(dāng)前分支merge
git clone git@github.com:thomson/Test2.git //從遠(yuǎn)程倉(cāng)庫(kù)克隆一個(gè)到本地倉(cāng)庫(kù)次屠,克隆可以通過(guò)https協(xié)議,但是每次都要輸入口令钾菊,比較麻煩帅矗,git默認(rèn)是用ssh
@tips track的作用:把本地某個(gè)分支與遠(yuǎn)程某個(gè)倉(cāng)庫(kù)分支對(duì)應(yīng)起來(lái)
@tips 往githup上push項(xiàng)目時(shí)提示無(wú)權(quán)限,可能是因?yàn)閟sh沒(méi)設(shè)置好煞烫,http://segmentfault.com/q/1010000003061640
分支管理
@tips 分支就如科幻電影里的平行宇宙浑此,創(chuàng)建自己的本地分支然后修改文件commit,完畢之后再一次性push到遠(yuǎn)程倉(cāng)庫(kù)的分支滞详。
而后對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了凛俱,比如新提交一次后,dev指針往前移動(dòng)一步料饥,而master指針不變蒲犬,當(dāng)我們?cè)赿ev分支完成了工作,就可以把dev合并到master上岸啡,
git branch //查看分支原叮,加上-a可以查看全部分支
git branch <name> //創(chuàng)建分支
git checkout <name> //切換分支
git checkout -b <name> //創(chuàng)建新分支dev并切換到dev分支,相當(dāng)于git branch dev和git checkout dev兩條命令的合成
git merge <name> //在當(dāng)前分支上合并dev分支,合并之后沒(méi)push不會(huì)修改遠(yuǎn)程倉(cāng)庫(kù)的數(shù)據(jù)奋隶,如果沒(méi)有修改沖突擂送,可以進(jìn)行快速合并,如果有則需手動(dòng)修改再提交
git branch -d <name> //刪除本地dev分支
git branch -r -d origin/<origin branch name> //刪除本地的遠(yuǎn)程分支
git branch push :<origin branch name> //刪除遠(yuǎn)程分支
@tips 實(shí)際團(tuán)隊(duì)開(kāi)發(fā)分支管理圖
解決沖突
@tips 當(dāng)在一個(gè)分支B1上修改了文件A并且提交唯欣,切換到分支B2時(shí)又修改了文件A也提交嘹吨,那么此時(shí)切換到分支B1再合并分支B2時(shí)會(huì)出現(xiàn)沖突,無(wú)法快速合并境氢,需要手動(dòng)修改文件A的內(nèi)容蟀拷,然后再add和commit
git log --graph --pretty=oneline --abbrev-commit //可以以字符圖形顯示查看文件合并的過(guò)程
git merge --no-ff -m "describtion" dev //禁用快速合并并在合并后生成一個(gè)新的commit,-m和"cescribtion"是生成新commit用的萍聊,這個(gè)需要手動(dòng)修改文件
忽略特殊文件
@tips 把你不想被VCS管理的文件的文件名或某后綴名的文件或某文件夾下的文件路徑加入到.ignore文件中问芬,把.ignore文件提交到VCS,這樣git就可以忽略這些文件了脐区,略如.ignore文件如下:
Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
My configurations:
db.ini
deploy_key_rsa
//.gitignore不起作用
@tips 有時(shí)候push代碼時(shí)愈诚,對(duì)某些文件做了修改但是不想把這些文件提交上去,在.gitignore也定義了規(guī)則忽略牛隅,但是push還是把文件提交上去了炕柔,這是因?yàn)間it系統(tǒng)已經(jīng)追蹤到了文件的修改,此時(shí)要想忽略文件的修改就需要修改緩存媒佣,把相應(yīng)的文件取消追蹤匕累,如此.gitignore文件中的相應(yīng)規(guī)則就可以生效了。
git update-index --assume-unchanged <file.name>
本地分支關(guān)聯(lián)遠(yuǎn)程分支
git branch --set-upstream-to dev_v2.0 origin/dev_v2.0
合并分支完畢之后消除merge狀態(tài)只需提交本地修改即可默伍。
window下git提交和檢出時(shí)換行符[LF]被自動(dòng)轉(zhuǎn)換成[CRLF]造成的問(wèn)題
@tips 當(dāng)文件內(nèi)容變動(dòng)會(huì)造成使用問(wèn)題時(shí)(比如根據(jù)文件內(nèi)容生成MD5)欢嘿,就需要手動(dòng)設(shè)置,但這治標(biāo)不治本也糊。如果是多人同時(shí)參與項(xiàng)目開(kāi)發(fā)炼蹦,那么每個(gè)人都需要這樣配置,比較省事情的做法是提取文件內(nèi)容時(shí)狸剃,對(duì)文件內(nèi)的[CRLF]->[LF]進(jìn)行手動(dòng)轉(zhuǎn)換掐隐,常見(jiàn)的有
Pattern CRLF = Pattern.compile("(\r\n)");
Matcher m = CRLF.matcher(middleLicense);
if(m.find()){
middleLicense = m.replaceAll("\n");
}
AutoCRLF
git config --global core.autocrlf true //提交時(shí)轉(zhuǎn)換為L(zhǎng)F,檢出時(shí)轉(zhuǎn)換為CRLF
git config --global core.autocrlf input //提交時(shí)轉(zhuǎn)換為L(zhǎng)F钞馁,檢出時(shí)不轉(zhuǎn)換
git config --global core.autocrlf false //提交檢出均不轉(zhuǎn)換
SafeCRLF
git config --global core.safecrlf true //拒絕提交包含混合換行符的文件
git config --global core.safecrlf false //允許提交包含混合換行符的文件
git config --global core.safecrlf warn //提交包含混合換行符的文件時(shí)給出警告
附上git官網(wǎng) http://git-scm.com/