什么是Git?
Git是一款免費(fèi)驯遇、開(kāi)源的分布式版本控制系統(tǒng)芹彬,用于敏捷高效地處理任何或小或大的項(xiàng)目。
創(chuàng)建版本庫(kù)
版本庫(kù)又名倉(cāng)庫(kù)叉庐,每個(gè)文件的修改舒帮、刪除,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史玩郊,或者在將來(lái)某個(gè)時(shí)刻可以“還原”肢执。
怎么做
- 初始化一個(gè)Git倉(cāng)庫(kù),使用
git init
命令译红。 - 添加文件到Git倉(cāng)庫(kù)预茄,分兩步:
- 使用命令
git add <file>
,可反復(fù)多次使用,添加多個(gè)文件侦厚; - 使用命令
git commit
,完成耻陕。
- 使用命令
時(shí)光穿梭機(jī)
- 使用
git status
命令,隨時(shí)掌握工作區(qū)的狀態(tài)刨沦。 - 如果如果
git status
告訴你有文件被修改過(guò)诗宣,用git diff
可以查看修改內(nèi)容。
版本回退
-
HEAD
指向的版本就是當(dāng)前版本想诅,因此召庞,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id
来破。 - 穿梭前篮灼,用
git log
可以查看提交歷史,以便確定要回退到哪個(gè)版本讳癌。 - 要重返未來(lái)穿稳,用
git reflog
查看命令歷史存皂,以便確定要回到未來(lái)的哪個(gè)版本。
工作區(qū)和暫存區(qū)
工作區(qū)(Working Directory): 就是你在電腦里能看到的目錄。
版本庫(kù)(Repository):工作區(qū)有一個(gè)隱藏目錄.git
鳞青,這個(gè)不算工作區(qū)瞄沙,而是Git的版本庫(kù)。
Git的版本庫(kù)里存了很多東西疤孕,其中最重要的就是稱(chēng)為stage(或者叫index)的暫存區(qū)商乎,還有Git為我們自動(dòng)穿件的第一個(gè)分支master
,以及指向master
的一個(gè)指針叫HEAD
祭阀。
你可以簡(jiǎn)單理解為鹉戚,需要提交的文件修改通通放到暫存區(qū),然后专控,一次性提交暫存區(qū)的所有修改抹凳。
管理修改
- Git跟蹤并管理的是修改,而非文件伦腐。
- 每次修改赢底,如果不
add
到暫存區(qū),那就不會(huì)加入到commit
中。
撤銷(xiāo)修改
- 場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容幸冻,想直接丟棄工作區(qū)的修改時(shí)粹庞,用命令
git checkout -- file
。 - 場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容洽损,還添加到了暫存區(qū)時(shí)庞溜,想丟棄修改,分兩步碑定,第一步用命令
git reset HEAD file
强缘,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作不傅。 - 場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí)旅掂,想要撤銷(xiāo)本次提交,參考版本回退一節(jié)访娶,不過(guò)前提是沒(méi)有推送到遠(yuǎn)程庫(kù)商虐。
刪除文件
一般情況下,你通常直接在文件管理器中把沒(méi)用的文件刪了崖疤,或者用rm
命令刪了
這個(gè)時(shí)候秘车,Git知道你刪除了文件,因此劫哼,工作區(qū)和版本庫(kù)就不一致了叮趴,git status
命令會(huì)立刻告訴你哪些文件被刪除了;
現(xiàn)在你有兩個(gè)選擇,一是確實(shí)要從版本庫(kù)中刪除該文件权烧,那就用命令git rm刪掉眯亦,并且git commit
現(xiàn)在,文件就從版本庫(kù)中被刪除了般码。
另一種情況是刪錯(cuò)了妻率,因?yàn)榘姹編?kù)里還有呢,所以可以很輕松地用git checkout
把誤刪的文件恢復(fù)到最新版本,git checkout
其實(shí)是用版本庫(kù)里的版本替換工作區(qū)的版本板祝,無(wú)論工作區(qū)是修改還是刪除宫静,都可以“一鍵還原”。
命令git rm
用于刪除一個(gè)文件券时。如果一個(gè)文件已經(jīng)被提交到版本庫(kù)孤里,那么你永遠(yuǎn)不用擔(dān)心誤刪,但是要小心橘洞,你只能恢復(fù)文件到最新版本捌袜,你會(huì)丟失最近一次提交后你修改的內(nèi)容。
遠(yuǎn)程倉(cāng)庫(kù)
自行注冊(cè)GitHub賬號(hào)震檩。由于你的本地Git倉(cāng)庫(kù)和GitHub倉(cāng)庫(kù)之間的傳輸是通過(guò)SSH加密的琢蛤,所以蜓堕,需要一點(diǎn)設(shè)置:
- 第1步:創(chuàng)建SSH Key。在用戶(hù)主目錄下博其,看看有沒(méi)有.ssh目錄套才,如果有,再看看這個(gè)目錄下有沒(méi)有id_rsa和id_rsa.pub慕淡。
這兩個(gè)文件背伴,如果已經(jīng)有了,可直接跳到下一步峰髓。如果沒(méi)有傻寂,打開(kāi)Shell(Windows下打開(kāi)Git Bash),創(chuàng)建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把郵件地址換成你自己的郵件地址携兵,然后一路回車(chē)疾掰,使用默認(rèn)值即可,由于這個(gè)Key也不是用于軍事目的徐紧,所以也無(wú)需設(shè)置密碼静檬。
如果一切順利的話(huà),可以在用戶(hù)主目錄里找到.ssh
目錄并级,里面有id_rsa
和id_rsa.pub
兩個(gè)文件拂檩,這兩個(gè)就是SSH Key的秘鑰對(duì),id_rsa
是私鑰嘲碧,不能泄露出去稻励,id_rsa.pub
是公鑰,可以放心地告訴任何人愈涩。 -
第2步:登陸GitHub望抽,打開(kāi)“Account settings”,“SSH Keys”頁(yè)面:
然后钠署,點(diǎn)“Add SSH Key”糠聪,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容:
點(diǎn)“Add Key”谐鼎,你就應(yīng)該看到已經(jīng)添加的Key:
添加遠(yuǎn)程庫(kù)
- 要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫(kù),使用命令
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)程庫(kù)的存在唐片,也就是有沒(méi)有聯(lián)網(wǎng)都可以正常工作丙猬,而SVN在沒(méi)有聯(lián)網(wǎng)的時(shí)候是拒絕干活的!當(dāng)有網(wǎng)絡(luò)的時(shí)候费韭,再把本地提交推送一下就完成了同步茧球。
從遠(yuǎn)程庫(kù)克隆
- 要克隆一個(gè)倉(cāng)庫(kù),首先必須知道倉(cāng)庫(kù)的地址星持,然后使用
git clone
命令克隆抢埋。 - Git支持多種協(xié)議,包括
https
督暂,但通過(guò)ssh
支持的原生git
協(xié)議速度最快揪垄。
分支管理
Git的分支是與眾不同的,無(wú)論創(chuàng)建逻翁、切換和刪除分支饥努,Git在1秒鐘之內(nèi)就能完成!無(wú)論你的版本庫(kù)是1個(gè)文件還是1萬(wàn)個(gè)文件八回。
創(chuàng)建與合并分支
Git鼓勵(lì)大量使用分支:
查看分支:git branch
創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>
創(chuàng)建+切換分支:git checkout -b <name>
合并某分支到當(dāng)前分支:git merge <name>
刪除分支:git branch -d <name>
解決沖突
當(dāng)Git無(wú)法自動(dòng)合并分支時(shí)肪凛,就必須首先解決沖突。解決沖突后辽社,再提交伟墙,合并完成。用git log --graph
命令可以看到分支合并圖滴铅。
分支管理
在實(shí)際開(kāi)發(fā)中戳葵,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
- 首先,
master
分支應(yīng)該是非常穩(wěn)定的汉匙,也就是僅用來(lái)發(fā)布新版本拱烁,平時(shí)不能在上面干活; - 那在哪干活呢噩翠?干活都在
dev
分支上戏自,也就是說(shuō),dev
分支是不穩(wěn)定的伤锚,到某個(gè)時(shí)候擅笔,比如1.0版本發(fā)布時(shí),再把dev
分支合并到master
上屯援,在master分
支發(fā)布1.0版本猛们; - 你和你的小伙伴們每個(gè)人都在
dev
分支上干活,每個(gè)人都有自己的分支狞洋,時(shí)不時(shí)地往dev
分支上合并就可以了弯淘。 -
所以,團(tuán)隊(duì)合作的分支看起來(lái)就像這樣:
小結(jié)
- Git分支十分強(qiáng)大吉懊,在團(tuán)隊(duì)開(kāi)發(fā)中應(yīng)該充分應(yīng)用庐橙。
- 合并分支時(shí)假勿,加上
--no-f
f參數(shù)就可以用普通模式合并,合并后的歷史有分支态鳖,能看出來(lái)曾經(jīng)做過(guò)合并转培,而fast forward
合并就看不出來(lái)曾經(jīng)做過(guò)合并。
Bug分支
- 修復(fù)bug時(shí)郁惜,我們會(huì)通過(guò)創(chuàng)建新的bug分支進(jìn)行修復(fù)堡距,然后合并,最后刪除兆蕉;
- 當(dāng)手頭工作沒(méi)有完成時(shí)羽戒,先把工作現(xiàn)場(chǎng)
git stash
一下,然后去修復(fù)bug虎韵,修復(fù)后易稠,再git stash pop
,回到工作現(xiàn)場(chǎng)包蓝。
Feature分支
- 開(kāi)發(fā)一個(gè)新feature驶社,最好新建一個(gè)分支;
- 如果要丟棄一個(gè)沒(méi)有被合并過(guò)的分支测萎,可以通過(guò)
git branch -D <name>
強(qiáng)行刪除亡电。
多人協(xié)作
- 查看遠(yuǎn)程庫(kù)信息,使用
git remote -v
硅瞧; - 本地新建的分支如果不推送到遠(yuǎn)程份乒,對(duì)其他人就是不可見(jiàn)的;
- 從本地推送分支腕唧,使用
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)程分支的名稱(chēng)最好一致但惶; - 建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)耳鸯,使用
git branch --set-upstream branch-name origin/branch-name
; - 從遠(yuǎn)程抓取分支榆骚,使用
git pull
片拍,如果有沖突,要先處理沖突妓肢。
標(biāo)簽管理
發(fā)布一個(gè)版本時(shí),我們通常先在版本庫(kù)中打一個(gè)標(biāo)簽(tag)苫纤,這樣碉钠,就唯一確定了打標(biāo)簽時(shí)刻的版本纲缓。將來(lái)無(wú)論什么時(shí)候,取某個(gè)標(biāo)簽的版本喊废,就是把那個(gè)打標(biāo)簽的時(shí)刻的歷史版本取出來(lái)祝高。所以,標(biāo)簽也是版本庫(kù)的一個(gè)快照污筷。
創(chuàng)建標(biāo)簽
- 命令
git tag <name>
用于新建一個(gè)標(biāo)簽工闺,默認(rèn)為HEAD
,也可以指定一個(gè)commit id瓣蛀; -
git tag -a <tagname> -m "blablabla..."
可以指定標(biāo)簽信息陆蟆; -
git tag -s <tagname> -m "blablabla..."
可以用PGP簽名標(biāo)簽; - 命令
git tag
可以查看所有標(biāo)簽惋增。
操作標(biāo)簽
- 命令
git push origin <tagname>
可以推送一個(gè)本地標(biāo)簽叠殷; - 命令
git push origin --tags
可以推送全部未推送過(guò)的本地標(biāo)簽; - 命令
git tag -d <tagname>
可以刪除一個(gè)本地標(biāo)簽诈皿; - 命令
git push origin :refs/tags/<tagname>
可以刪除一個(gè)遠(yuǎn)程標(biāo)簽林束。
使用GitHub
- 在GitHub上,可以任意Fork開(kāi)源倉(cāng)庫(kù)稽亏;
- 自己擁有Fork后的倉(cāng)庫(kù)的讀寫(xiě)權(quán)限壶冒;
- 可以推送pull request給官方倉(cāng)庫(kù)來(lái)貢獻(xiàn)代碼。
此教程基源于廖雪峰的官方網(wǎng)站Git教程
其他好的Git學(xué)習(xí)網(wǎng)站
寶劍鋒從磨礪出截歉,梅花香自苦寒來(lái)胖腾。加油吧,繼續(xù)向前怎披。