基礎(chǔ)命令
-
git init
把目錄變成Git可以管理的倉(cāng)庫(kù)采驻。 -
git add
把文件添加到倉(cāng)庫(kù)友浸。 -
git commit
把文件提交到倉(cāng)庫(kù) -
git commit -m "這里是文件提交說(shuō)明"
添加提交說(shuō)明嘱函,方便查閱若治。 -
git status
查看追蹤的目錄文件哪些做了修改峡眶。 -
git stage
查看倉(cāng)庫(kù)當(dāng)前狀態(tài)瘦黑。 -
git diff
查看上次修改內(nèi)容京革。 -
git log
查看歷史修改記錄。
git log --pretty=online
只看提交說(shuō)明
時(shí)光穿梭
-
git reset --hard HEAD^
回到上一個(gè)版本幸斥。 -
git reset --hard 321ef1
回到版本為 321ef1到狀態(tài)匹摇,版本號(hào)沒(méi)必要寫(xiě)全,前幾位就可以睡毒,Git會(huì)自動(dòng)去找来惧。 -
git reflog
查看歷史穿梭版本。 -
git checkout -- file
丟棄工作區(qū)的修改演顾。(git checkout
其實(shí)是用版本庫(kù)里的版本替換工作區(qū)的版本供搀,無(wú)論工作區(qū)是修改還是刪除,都可以“一鍵還原”钠至。)
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)
顧名思義就是當(dāng)前工作的目錄。
版本庫(kù)(Repository)
工作區(qū)有一個(gè)隱藏目錄.git
休溶,這個(gè)不算工作區(qū)代赁,而是Git的版本庫(kù)。
Git的版本庫(kù)里存了很多東西兽掰,其中最重要的就是稱(chēng)為stage
(或者叫index)的暫存區(qū)芭碍,還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master
,以及指向master
的一個(gè)指針叫HEAD
孽尽。
git add
命令將文件添加到暫存區(qū)窖壕。
git commit
命令將所有暫存區(qū)內(nèi)容提交到當(dāng)前分支。
因?yàn)槲覀儎?chuàng)建Git版本庫(kù)時(shí),Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)
master
分支艇拍,所以狐蜕,現(xiàn)在,git commit
就是往master
分支上提交更改卸夕。
其實(shí)就是將需要提交的文件修改通通放到暫存區(qū),然后一次性提交暫存區(qū)的所有修改婆瓜。
遠(yuǎn)程倉(cāng)庫(kù)
1.創(chuàng)建SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
2.關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
$ git remote add origin git@github.com:blacker/learngit.git
blacker
為關(guān)聯(lián)的github
賬戶(hù)名快集,learngit
為倉(cāng)庫(kù)名
3.推送到遠(yuǎn)程庫(kù)
git push -u origin master
git push
命令是把本地當(dāng)前分支masrer
推送到遠(yuǎn)程庫(kù)。
如果遠(yuǎn)程庫(kù)是空的廉白,第一次推送master
分支時(shí)个初,加上了-u
參數(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
錯(cuò)誤處理
To github.com:hellowqw/leargit
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:hellowqw/leargit'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
出現(xiàn)錯(cuò)誤的主要原因是github中的README.md
文件不在本地代碼目錄中
解決
可以通過(guò)如下命令進(jìn)行代碼合并【注:pull=fetch+merge]
git pull --rebase origin master
執(zhí)行上面代碼后可以看到本地代碼庫(kù)中多了README.md
文件
分支
創(chuàng)建倉(cāng)庫(kù)時(shí)默認(rèn)只有一個(gè)分支磅轻,即主分支master
珍逸。HEAD
嚴(yán)格來(lái)說(shuō)不是指向提交,而是指向master
聋溜,master
才是指向提交的谆膳。
最初,master
分支是一條線,Git用master
指向最新的提交,在用HEAD
指向master
纯续,就能確定當(dāng)前分支尊残,以及當(dāng)前分支的提交點(diǎn):
每次提交,
master
分支都會(huì)向前移動(dòng)一步窟哺,這樣,隨著你不斷提交,master
分支的線也越來(lái)越長(zhǎng)注盈。當(dāng)創(chuàng)建新的分支,例如
dev
時(shí)型雳,Git新建了一個(gè)指針叫dev
当凡,指向master
相同的提交,再把HEAD
指向dev
纠俭,就表示當(dāng)前分支在dev
上:
git checkout -b dev
-b
參數(shù)表示創(chuàng)建并切換分支沿量,相當(dāng)于以下兩條命令:
git branch dev
git checkout dev
用git branch
命令查看當(dāng)前分支:
git branch
* dev
master
Git創(chuàng)建一個(gè)分支很快,因?yàn)槌嗽黾右粋€(gè)
dev
指針冤荆,改變HEAD
的指向朴则,工作區(qū)的文件都沒(méi)有任何變化!
不過(guò)钓简,從現(xiàn)在開(kāi)始乌妒,對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了汹想,比如新提交一次后,dev
指針往前移動(dòng)一步撤蚊,而master
指針不變:
假如在dev
上的工作完成了古掏,就可以把dev
合并到master
上。Git怎么合并呢侦啸?最簡(jiǎn)單的方法槽唾,就是直接把master
指向dev
的當(dāng)前提交,就完成了合并光涂。
切換master
分支:
git checkout master
此時(shí)狀態(tài):
現(xiàn)在庞萍,把
dev
分支的工作成果合并到master
分支上:
git merge dev
Updating d17efd8..fec145a
Fast-forward #快進(jìn)模式也就是直接把master指向dev的當(dāng)前提交,所以合并速度非惩牛快钝计。
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到當(dāng)前分支。
所以Git合并分支也很快齐佳!就改改指針私恬,工作區(qū)內(nèi)容也不變!
合并完分支后重虑,甚至可以刪除dev
分支践付。
git branch -d dev
刪除dev
分支就是把dev
指針給刪掉,刪掉后缺厉,就剩下了一條master
分支永高。
git branch
* master
因?yàn)閯?chuàng)建、合并和刪除分支非程嵴耄快命爬,所以Git鼓勵(lì)我們使用分支完成某個(gè)任務(wù),合并后再刪掉分支辐脖,這和直接在master分支上工作效果是一樣的饲宛,但過(guò)程更安全。
小結(jié)
查看分支: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>
分支管理策略
在實(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)就像這樣:
令究流,上面有提到合并分支時(shí)又一個(gè)Fast forward
模式,需要注意到是這種模式下动遭,刪除分支后,會(huì)丟掉分支信息神得。
如果要強(qiáng)制禁用Fast forward
模式厘惦,Git就會(huì)在merge
時(shí)生成一個(gè)新的commit
,這樣哩簿,從分支歷史上就可以看出分支信息宵蕉。
git merge --no-ff -m "merge with no-ff" dev