安裝Git(Debian或Ubuntu Linux)
Debian或Ubuntu Linux外遇,通過一條
sudo apt-getinstall git
就可以直接完成Git的安裝渠羞,安裝完成后译打,還需要最后一步設(shè)置,在命令行輸入:
$git config --global user.name"YourName"$git config --global user.email"email@example.com"
創(chuàng)建版本庫
版本庫又名倉庫留美,英文名repository彰檬。
$mkdir learngit
$cd learngit
$pwd
/Users/michael/learngit
第二步,通過git init命令把這個(gè)目錄變成Git可以管理的倉庫
$gitinit
把一個(gè)文件放到Git倉庫只需要兩步谎砾。
第一步逢倍,用命令git add告訴Git,把文件添加到倉庫:
$git add readme.txt
第二步景图,用命令git commit告訴Git较雕,把文件提交到倉庫:
$ gitcommit-m"wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1file changed,2insertions(+)
createmode100644readme.txt
小結(jié)
初始化一個(gè)Git倉庫,使用git init命令挚币。
添加文件到Git倉庫亮蒋,分兩步:
·第一步,使用命令git add 忘晤,注意宛蚓,可反復(fù)多次使用激捏,添加多個(gè)文件设塔;
·第二步,使用命令git commit,完成闰蛔。
隨時(shí)掌握工作區(qū)狀態(tài)git status命令
git diff查看被修改的內(nèi)容
版本回退
·HEAD指向的版本就是當(dāng)前版本痕钢,因此,Git允許我們在版本的歷史之間穿梭序六,使用命令git
reset --hard commit_id任连。
·穿梭前,用git
log可以查看提交歷史例诀,以便確定要回退到哪個(gè)版本随抠。
·要重返未來,用git
reflog查看命令歷史繁涂,以便確定要回到未來的哪個(gè)版本
·git reflog用來記錄你的每一次命令
·$gitreflog
·ea34578HEAD@{0}:reset:movingtoHEAD^
·3628164HEAD@{1}:commit:appendGPL
·ea34578HEAD@{2}:commit:adddistributed
·cb926e7HEAD@{3}:commit(initial):wroteareadmefile
工作區(qū)和暫存區(qū)
Git的版本庫里存了很多東西拱她,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master扔罪,以及指向master的一個(gè)指針叫HEAD秉沼。
管理修改
第一次修改->git add->第二次修改->git commit
Git管理的是修改,當(dāng)你用git add命令后矿酵,在工作區(qū)的第一次修改被放入暫存區(qū)唬复,準(zhǔn)備提交,但是全肮,在工作區(qū)的第二次修改并沒有放入暫存區(qū)敞咧,所以,git commit只負(fù)責(zé)把暫存區(qū)的修改提交了辜腺,也就是第一次的修改被提交了妄均,第二次的修改不會(huì)被提交。
那怎么提交第二次修改呢哪自?你可以繼續(xù)git add再git commit丰包,也可以別著急提交第一次修改,先git add第二次修改壤巷,再git commit邑彪,就相當(dāng)于把兩次修改合并后一塊提交了:
第一次修改->git add->第二次修改->git add->git commit
提交后,用git diff HEAD -- readme.txt命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別
Git是如何跟蹤修改的胧华,每次修改寄症,如果不add到暫存區(qū),那就不會(huì)加入到commit中矩动。
撤銷修改
命令git checkout -- readme.txt意思就是有巧,把readme.txt文件在工作區(qū)的修改全部撤銷,這里有兩種情況:
一種是readme.txt自修改后還沒有被放到暫存區(qū)悲没,現(xiàn)在篮迎,撤銷修改就回到和版本庫一模一樣的狀態(tài);
一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改甜橱,現(xiàn)在逊笆,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。
總之岂傲,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)难裆。
場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí)镊掖,用命令git checkout -- file乃戈。(--很重要,沒有--亩进,就變成了“切換到另一個(gè)分支”的命令)
場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容偏化,還添加到了暫存區(qū)時(shí),想丟棄修改镐侯,分兩步侦讨,第一步用命令git reset HEAD file,就回到了場景1苟翻,第二步按場景1操作韵卤。
場景3:已經(jīng)提交了不合適的修改到版本庫時(shí),想要撤銷本次提交崇猫,參考版本回退一節(jié)沈条,不過前提是沒有推送到遠(yuǎn)程庫。
git checkout其實(shí)是用版本庫里的版本替換工作區(qū)的版本诅炉,無論工作區(qū)是修改還是刪除蜡歹,都可以“一鍵還原”。
刪除文件
命令git rm用于刪除一個(gè)文件涕烧。如果一個(gè)文件已經(jīng)被提交到版本庫月而,那么你永遠(yuǎn)不用擔(dān)心誤刪,但是要小心议纯,你只能恢復(fù)文件到最新版本父款,你會(huì)丟失最近一次提交后你修改的內(nèi)容。
遠(yuǎn)程倉庫
GitHub
第1步:創(chuàng)建SSH Key瞻凤。在用戶主目錄下憨攒,看看有沒有.ssh目錄,如果有阀参,再看看這個(gè)目錄下有沒有id_rsa和id_rsa.pub這兩個(gè)文件肝集,如果已經(jīng)有了,可直接跳到下一步蛛壳。如果沒有杏瞻,打開Shell(Windows下打開Git Bash)所刀,創(chuàng)建SSH Key:
$ssh-keygen -t rsa -C"youremail@example.com"
你需要把郵件地址換成你自己的郵件地址,然后一路回車伐憾,使用默認(rèn)值即可,由于這個(gè)Key也不是用于軍事目的赫模,所以也無需設(shè)置密碼树肃。
如果一切順利的話,可以在用戶主目錄里找到.ssh目錄瀑罗,里面有id_rsa和id_rsa.pub兩個(gè)文件胸嘴,這兩個(gè)就是SSH Key的秘鑰對(duì)
第2步:登陸GitHub,打開“Account settings”斩祭,“SSH Keys”頁面:
然后劣像,點(diǎn)“Add
SSH Key”,填上任意Title摧玫,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容:
添加遠(yuǎn)程庫
要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫耳奕,使用命令git remote add origin
git@server-name:path/repo-name.git;
關(guān)聯(lián)后诬像,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容屋群;
此后,每次本地提交后坏挠,只要有必要芍躏,就可以使用命令git push origin master推送最新修改;
分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠(yuǎn)程庫的存在降狠,也就是有沒有聯(lián)網(wǎng)都可以正常工作对竣,而SVN在沒有聯(lián)網(wǎng)的時(shí)候是拒絕干活的!當(dāng)有網(wǎng)絡(luò)的時(shí)候榜配,再把本地提交推送一下就完成了同步否纬!
從遠(yuǎn)程庫克隆
要克隆一個(gè)倉庫,首先必須知道倉庫的地址蛋褥,然后使用git clone命令克隆烦味。
Git支持多種協(xié)議,包括https壁拉,但通過ssh支持的原生git協(xié)議速度最快
$git clone git@github.com:michaelliao/gitskills.git
Cloninginto'gitskills'...
remote:Countingobjects:3, done.
remote:Total3(delta0), reused0(delta0)
Receivingobjects:100% (3/3), done.
$cd gitskills
$ls
README.md
創(chuàng)建與合并分支
Git鼓勵(lì)大量使用分支:
查看分支:git branch
創(chuàng)建分支:git branch
切換分支:git checkout
創(chuàng)建+切換分支:git checkout -b
合并某分支到當(dāng)前分支:git merge
刪除分支:git branch -d
解決沖突
當(dāng)Git無法自動(dòng)合并分支時(shí)谬俄,就必須首先解決沖突。解決沖突后弃理,再提交溃论,合并完成。
用git log --graph命令可以看到分支合并圖痘昌。
分支管理策略
首先钥勋,master分支應(yīng)該是非常穩(wěn)定的炬转,也就是僅用來發(fā)布新版本,平時(shí)不能在上面干活算灸;
git flow工作流
feature(多個(gè)扼劈、玫紅)。主要是自己玩了菲驴,差不多的時(shí)候要合并回develop去荐吵。從不與master交互。
develop(1個(gè)赊瞬、黃色)先煎。主要是和feature以及release交互。
release(同一時(shí)間1個(gè)巧涧、綠色)薯蝎。總是基于develop谤绳,最后又合并回develop占锯。當(dāng)然對(duì)應(yīng)的tag跑到master這邊去了。生命周期很短缩筛,只是為了發(fā)布
hotfix(同一時(shí)間1個(gè)烟央、紅色)⊥嵩啵總是基于master疑俭,并最后合并到master和develop。生命周期較短婿失,用了修復(fù)bug或小粒度修改發(fā)布钞艇。
master(1個(gè)藍(lán)色)。沒有什么東西豪硅,僅是一些關(guān)聯(lián)的tag哩照,因從不在master上開發(fā)
小結(jié)
Git分支十分強(qiáng)大,在團(tuán)隊(duì)開發(fā)中應(yīng)該充分應(yīng)用懒浮。
合并分支時(shí)飘弧,加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支砚著,能看出來曾經(jīng)做過合并次伶,而fast forward合并就看不出來曾經(jīng)做過合并。
多人協(xié)作的工作模式
多人協(xié)作的工作模式通常是這樣:
1.首先稽穆,可以試圖用git push origin branch-name推送自己的修改冠王;
2.如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新舌镶,需要先用git pull試圖合并柱彻;
3.如果合并有沖突豪娜,則解決沖突,并在本地提交哟楷;
4.沒有沖突或者解決掉沖突后瘤载,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”卖擅,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建鸣奔,用命令git branch --set-upstream branch-name
origin/branch-name。
這就是多人協(xié)作的工作模式磨镶,一旦熟悉了溃蔫,就非常簡單健提。
小結(jié)
·查看遠(yuǎn)程庫信息琳猫,使用git remote -v;
·本地新建的分支如果不推送到遠(yuǎn)程私痹,對(duì)其他人就是不可見的脐嫂;
·從本地推送分支,使用git push origin branch-name紊遵,如果推送失敗账千,先用git pull抓取遠(yuǎn)程的新提交;
·在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支暗膜,使用git checkout -b branch-name origin/branch-name匀奏,本地和遠(yuǎn)程分支的名稱最好一致;
·建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)学搜,使用git branch --set-upstream branch-name
origin/branch-name娃善;
·從遠(yuǎn)程抓取分支,使用git pull瑞佩,如果有沖突聚磺,要先處理沖突。
標(biāo)簽管理
·命令git
tag 用于新建一個(gè)標(biāo)簽炬丸,默認(rèn)為HEAD瘫寝,也可以指定一個(gè)commit id;
·git tag -a
-m "blablabla..."可以指定標(biāo)簽信息稠炬;
·git tag -s
-m "blablabla..."可以用PGP簽名標(biāo)簽焕阿;
·命令git
tag可以查看所有標(biāo)簽。
操作標(biāo)簽
·命令git
push origin 可以推送一個(gè)本地標(biāo)簽首启;
·命令git
push origin --tags可以推送全部未推送過的本地標(biāo)簽捣鲸;
·命令git
tag -d 可以刪除一個(gè)本地標(biāo)簽;
·命令git
push origin :refs/tags/可以刪除一個(gè)遠(yuǎn)程標(biāo)簽
自定義Git
比如闽坡,讓Git顯示顏色栽惶,會(huì)讓命令輸出看起來更醒目:
$git config --global color.uitrue
忽略特殊文件
·忽略某些文件時(shí)愁溜,需要編寫.gitignore;
·.gitignore文件本身要放到版本庫里外厂,并且可以對(duì).gitignore做版本管理冕象!
需要找出來到底哪個(gè)規(guī)則寫錯(cuò)了,可以用git check-ignore命令檢查:
配置別名
$git config --globalalias.st status
$git config --globalalias.co checkout
$git config --globalalias.ci commit
$git config --globalalias.br branch
在撤銷修改一節(jié)中汁蝶,我們知道渐扮,命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)掖棉。既然是一個(gè)unstage操作墓律,就可以配置一個(gè)unstage別名:
$git config --globalalias.unstage'reset HEAD'
當(dāng)你敲入命令:
$git unstage test.py
實(shí)際上Git執(zhí)行的是:
$ git resetHEAD test.py
配置一個(gè)git last,讓其顯示最后一次提交信息:
$git config --globalalias.last'log -1'
這樣幔亥,用git last就能顯示最近一次的提交:
甚至還有人喪心病狂地把lg配置成了:
git config --globalalias.lg"log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
配置文件
配置Git的時(shí)候耻讽,加上--global是針對(duì)當(dāng)前用戶起作用的,如果不加帕棉,那只針對(duì)當(dāng)前的倉庫起作用针肥。
配置文件放哪了?每個(gè)倉庫的Git配置文件都放在.git/config文件中: