引言:基于圖形界面 Git 的使用已經(jīng)熟練掌握了谋国。偶爾遇到要使用命令行的情況柱告。在此進(jìn)行簡單記錄。
時(shí)間:2016年11月18日15:26:29
作者:JustDo23
01. 參考
廖雪峰 Git 教程 哈哈~沒啥說的硅确,強(qiáng)烈建議去看看烧颖。本文即個(gè)人筆記。
關(guān)鍵字
Git 的歷史
代嗤,集中式
和分布式
棘钞,版本庫
,安全性
干毅,分支管理
宜猜,CVS
,SVN
硝逢,Git 的安裝
姨拥,倉庫
,repository
渠鸽,工作區(qū)
叫乌,暫存區(qū)
,遠(yuǎn)程倉庫
徽缚,GitHub
憨奸,SSH
,公鑰
凿试,私鑰
排宰,分支
似芝,沖突
,標(biāo)簽
额各。
02. 配置用戶
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因?yàn)?Git 是分布式版本控制系統(tǒng)国觉,所以每臺(tái)機(jī)器都需要進(jìn)行自報(bào)家門。
注意:命令中的--global
參數(shù)是全局配置虾啦,整個(gè)機(jī)器上所有 Git 倉庫的全局配置麻诀。
03. 創(chuàng)建倉庫
$ git init
在一個(gè)空文件夾中執(zhí)行命令,創(chuàng)建一個(gè)空的倉庫傲醉∮眨基本上瞬間就創(chuàng)建成功了,成功會(huì)有提示硬毕。
創(chuàng)建成功之后會(huì)在目錄下生成一個(gè).git
的目錄呻引,這個(gè)目錄是 Git 自動(dòng)生成的用來跟蹤管理版本庫
的,不要對(duì)其進(jìn)行修改吐咳,否則會(huì)破壞版本庫逻悠。這個(gè)目錄是隱藏
的,使用命令ls -ahf
進(jìn)行查看韭脊。
注意:文件夾可以不是空童谒,可以有文件。.git
目錄千萬不要隨便修改沪羔。
04. 追蹤文本
這里明確一下饥伊,所有的版本控制系統(tǒng),都是只能追蹤文本的改動(dòng)蔫饰。音頻
琅豆,圖片
,Microsoft 的 Word
等都是二進(jìn)制格式的篓吁,不能進(jìn)行詳細(xì)版本追蹤茫因。
文本都是有編碼格式的,這里建議使用標(biāo)準(zhǔn)的UTF-8 編碼
杖剪。
05. 查看狀態(tài)
$ git status
使用命令可以查看當(dāng)前版本庫中文件跟蹤的狀態(tài)节腐。文件狀態(tài)會(huì)用不同的顏色進(jìn)行標(biāo)注。
- 未添加追蹤的文件——紅色
- 新添加的文件——綠色
- 修改的文件——紅色
06. 添加文件追蹤
$ git add <file>
$ git add .
add 命令
將文件添加追蹤摘盆,如果指定了文件名稱,則是將指定的文件進(jìn)行添加追蹤饱苟。如果使用.
進(jìn)行 add 則代表將所有未添加追蹤的文件進(jìn)行添加孩擂。
07. 提交本地倉庫
$ git commit
$ git commit -m "注釋"
commit 命令
需要注意的是,commit 操作需要有相關(guān)的注釋說明箱熬,對(duì)當(dāng)前 commit 操作進(jìn)行相關(guān)的解釋說明类垦。使用-m “注釋”
是代表加上注釋進(jìn)行 commit狈邑,如果沒有使用則同樣會(huì)跳轉(zhuǎn)填寫注釋的界面。
commit 操作成功會(huì)有相關(guān)的提示蚤认。
08. 查看修改
$ git diff
diff
其實(shí)就是difference
的意思了米苹。在對(duì)文件修改之后,可以使用命令查看具體修改的內(nèi)容砰琢。
09. 查看提交記錄
$ git log
$ git log --pretty=oneline
使用git log
命令可以查看從最近到最遠(yuǎn)的提交記錄蘸嘶。參數(shù)--pretty=oneline
只是為了更好的查看提交記錄。
10. 版本回退
$ git reset --hard HEAD^
在進(jìn)行版本回退之前陪汽,一定要明確训唱,當(dāng)前版本是什么,將要回退的版本是什么挚冤。在 Git 中况增,使用HEAD
表示當(dāng)前版本,使用HEAD^
表示上個(gè)版本训挡,使用HEAD^^
表示上上個(gè)版本澳骤。如果往上100個(gè)版本,則使用HEAD~100
來表示澜薄。
使用命令cat file
可以查看文件的內(nèi)容为肮。
$ git reset --hard commit_id
除了使用HEAD
之外,同樣可以使用每次 commit 的commit id
進(jìn)行回退操作表悬∶殖回退到之前或者之后的操作。在操作過程中 commit_id 并不是必須寫全了蟆沫,可以寫開頭幾位籽暇,git 會(huì)自動(dòng)去查找的。
11. 查看歷史 commit id
$ git reflog
命令會(huì)顯示出每次操作的id
饭庞,從中可以找到歷史的id
進(jìn)行使用戒悠。
12. 工作區(qū)和暫存區(qū)
-
工作區(qū)[Working Directory]
就是在電腦上直接看到的目錄 -
版本庫[Repository]
在工作區(qū)目錄中有一個(gè)隱藏的.git
目錄就是 Git 的版本庫 -
暫存區(qū)[stage]
在版本庫中有暫存區(qū),所有的修改都會(huì)先添加至?xí)捍鎱^(qū)舟山,使用add
命令添加至?xí)捍鎱^(qū) -
分支[branch]
在版本庫中可以有多條分支绸狐,默認(rèn)生成的是master 分支
,使用commit
命令提交至分支 -
HEAD 指針
同樣是存在于版本庫中累盗,這是一個(gè)指針寒矿,指向分支
回顧一下把文件添加到 Git 版本庫的兩個(gè)步驟:
- 使用
git add
把文件添加進(jìn)去,實(shí)際上是把文件添加進(jìn)了暫存區(qū) - 使用
git commit
進(jìn)行提交更改若债,實(shí)際上就是把暫存區(qū)的所有文件提交到當(dāng)前分支
Git 跟蹤并管理的是修改符相,而非文件。
13. 撤銷修改
$ git checkout -- <file>
執(zhí)行此命令可以丟棄工作區(qū)的修改,將工作區(qū)文件還原到最近一次git add
或者git commit
時(shí)的狀態(tài)啊终。
命令中的--
很重要镜豹,沒有--
命令就會(huì)變成切換分支的命令。
- 文件修改后蓝牲,沒有被添加進(jìn)暫存區(qū)趟脂,現(xiàn)在,撤銷修改就回到和版本庫中一樣例衍,也就是最近一次 commit 時(shí)的狀態(tài)昔期。
- 文件修改后,已經(jīng)被添加進(jìn)暫存區(qū)肄渗,接著又進(jìn)行了修改镇眷,現(xiàn)在,撤銷修改就回到和暫存區(qū)中一樣翎嫡,也就是最近一次 add 時(shí)的狀態(tài)欠动。此種情況下撤銷修改需要先有以下操作。
$ git reset HEAD <file>
執(zhí)行命令惑申,可以把暫存區(qū)
中的修改進(jìn)行撤銷具伍。
git reset
命令可以進(jìn)行版本回退
,也可以把暫存區(qū)中的修改回退到工作區(qū)
圈驼。使用HEAD
時(shí)人芽,表示最新的版本。
14. 刪除文件
$ git rm <file>
執(zhí)行命令后可以將本地文件進(jìn)行刪除绩脆,命令之后需要繼續(xù)使用commit
命令將刪除進(jìn)行提交萤厅。另外,命令執(zhí)行之后靴迫,是無法使用checkout
將文件還原的惕味,此時(shí)還原文件需要使用reset
命令回退版本庫。
另外玉锌,刪除文件同樣可以先在文件目錄中將文件直接刪除名挥,然后執(zhí)行add
命令,再執(zhí)行commit
命令進(jìn)行提交主守。如果是直接本地刪除的話禀倔,可以使用checkout
命令進(jìn)行還原。
15. SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
本地倉庫和遠(yuǎn)程倉庫之間的傳輸是通過SSH
進(jìn)行加密的参淫。所以需要?jiǎng)?chuàng)建并配置SSH Key
救湖。
執(zhí)行命令之后,可以在用戶主目錄
下看到.ssh
目錄涎才,應(yīng)該是一個(gè)隱藏文件夾鞋既。打開目錄之后會(huì)看到id_rsa
和id_rsa.pub
兩個(gè)文件,這兩個(gè)就是SSH Key
的秘鑰對(duì)。其中涛救,id_rsa
是私鑰,不能對(duì)外泄露业扒;id_rsa.pub
是公鑰检吆,用公鑰進(jìn)行遠(yuǎn)程倉庫的配置。
另外程储,在使用圖形化界面的時(shí)候蹭沛,不用配置 SSH Key 但是其實(shí)走的是賬號(hào)密碼的形式進(jìn)行加密和校驗(yàn)的。
16. 關(guān)聯(lián)遠(yuǎn)程倉庫
$ git remote add origin git@server-name:path/repo-name.git
當(dāng)我們?cè)谶h(yuǎn)程倉庫創(chuàng)建出一個(gè)新的倉庫的時(shí)候章鲤,會(huì)獲得一個(gè)遠(yuǎn)程倉庫的連接地址摊灭,直接復(fù)制地址并在本地倉庫執(zhí)行命令,就可以將本地倉庫和遠(yuǎn)程倉庫建立連接败徊。
$ git push -u origin master
連接建立成功之后帚呼,遠(yuǎn)程倉庫此時(shí)仍然是空的,我們需要進(jìn)行第一次的提交皱蹦,將本地倉庫的所有內(nèi)容推送到遠(yuǎn)程倉庫煤杀。第一次推送的時(shí)候注意需要加上-u
的參數(shù)。Git 不但會(huì)把本地master
分支上所有內(nèi)容提交到遠(yuǎn)程master
分支沪哺,還會(huì)把本地master
分支和遠(yuǎn)程master
分支關(guān)聯(lián)起來沈自。
$ git push origin master
那么以后再進(jìn)行提交就會(huì)簡單,不用再加上-u
的參數(shù)了辜妓。
另枯途,origin
代表了遠(yuǎn)程倉庫的意思。
17. 倉庫克隆
$ git clone git@server-name:path/repo-name.git
使用clone
命令可以將遠(yuǎn)程的倉庫克隆到本地籍滴。
另酪夷,在第一次使用clone
或者push
命令時(shí)候,可能會(huì)有一個(gè) SSH 連接警告异逐,第一次連接時(shí)候 SSH Key 的指紋驗(yàn)證捶索。輸入yes
進(jìn)行添加信任就可以了。
18. 分支管理
分支的概念初次接觸其實(shí)還是有些摸不著頭腦的灰瞻。SVN 和 Git 都是支持分支操作腥例,但是 Git 的分支管理更加的快捷好用。git init
命令初始化倉庫的時(shí)候會(huì)默認(rèn)生成master
主線酝润,也就是master
主分支燎竖,之后的文件修改提交等都在master
分支上進(jìn)行。多分支就像是多個(gè)平行的互補(bǔ)干擾的線要销。分支可以進(jìn)行切換构回,可以進(jìn)行合并。
master
分支指向提交,HEAD
指針執(zhí)行master
分支纤掸,也就是HEAD
指針指向當(dāng)前分支脐供。
19. 分支操作
$ git branch
查看現(xiàn)有的分支,以及當(dāng)前所在的分支借跪,*
號(hào)表示當(dāng)前
$ git branch dev
創(chuàng)建了一個(gè)叫做dev
的分支
$ git checkout dev
將當(dāng)前分支切換到dev
分支政己,在進(jìn)行分支切換操作后發(fā)現(xiàn)工作區(qū)的文件會(huì)隨之改變
$ git checkout -b dev
命令中包含有-b
的參數(shù),表示創(chuàng)建并切換分支掏愁,相當(dāng)于創(chuàng)建和切換兩條命令的合并
$ git merge dev
將dev
分支的內(nèi)容合并到當(dāng)前所在的分支中歇由。命令中沒有任何的參數(shù),屬于Fast-forward
即快進(jìn)模式
果港,就是將當(dāng)前分支直接指向dev
的當(dāng)前提交沦泌,速度快。
$ git branch -d dev
將dev
分支進(jìn)行刪除
20. 解決沖突
沖突
辛掠,在兩個(gè)分支上對(duì)同一文件同一行代碼均進(jìn)行了修改并提交谢谦,隨后進(jìn)行兩個(gè)分支的merge
操作就會(huì)造成沖突的出現(xiàn)。merge
操作其實(shí)本身會(huì)進(jìn)行自動(dòng)合并公浪,沒有沖突的地方就會(huì)自動(dòng)合并在一起他宛。看到Automatic merge failed; fix conflicts and then commit the result.
就是提示自動(dòng)合并失敗欠气,需要手動(dòng)解決沖突厅各,然后進(jìn)行commit 提交。
出現(xiàn)沖突后打開沖突的文件會(huì)發(fā)現(xiàn) Git 用<<<<<<<
预柒,=======
队塘,>>>>>>>
標(biāo)記出不同分支的內(nèi)容。將沖突的地方手動(dòng)修改之后進(jìn)行add
和commit
操作宜鸯。這樣就把沖突解決掉了憔古。查看提交記錄,并將舊分支刪除淋袖。
git log --graph --pretty=oneline --abbrev-commit
帶參數(shù)命令可以直觀查看提交記錄鸿市。
21. 分支管理策略
$ git merge --no-ff -m "message" dev
這里主要說明的是通常情況下 Git 會(huì)用Fast forword
模式進(jìn)行分支合并,但是這種模式下即碗,刪除分支后焰情,會(huì)丟掉分支信息。這個(gè)理解起來有些費(fèi)勁剥懒,動(dòng)手敲了指令内舟,似懂非懂的樣紙。
注意命令中的參數(shù)--no-ff
是禁止使用Fast forword
模式初橘,參數(shù)-m
是合并后創(chuàng)建一個(gè)新的 commit 提交验游。合并后的歷史有分支充岛,能看出來曾經(jīng)做過合并。
管理策略:
-
master
分支是穩(wěn)定的分支耕蝉,只是用來進(jìn)行版本發(fā)布的崔梗。 -
dev
分支是非穩(wěn)定的,在 dev 分支上干活垒在,開發(fā)者在各自的分支上干活炒俱,然后合并到 dev 分支。
22. BUG 分支
當(dāng)前在dev
分支上努力的工作中爪膊,文件已經(jīng)add
,但是由于工作沒有完全結(jié)束砸王,沒有進(jìn)行commit
操作推盛。突然來了要修復(fù) BUG 的任務(wù),要?jiǎng)?chuàng)建一個(gè) BUG 分支來進(jìn)行修復(fù)谦铃。dev
分支工作沒有結(jié)束耘成,又要?jiǎng)?chuàng)建新的issue
分支來修復(fù) BUG 。
$ git stash
stash
功能可以將當(dāng)前工作現(xiàn)場”儲(chǔ)藏“起來驹闰,等以后恢復(fù)現(xiàn)場后繼續(xù)工作瘪菌。命令執(zhí)行之后,gi status
就會(huì)發(fā)現(xiàn)工作區(qū)是干凈的了嘹朗。接下來就可以在需要修改 BUG 的分支創(chuàng)建新的bug 分支
然后進(jìn)行修改师妙,提交,合并屹培,刪除分支默穴。當(dāng) BUG 修復(fù)工作結(jié)束掉后,切回dev
分支褪秀。
$ git stash list
執(zhí)行命令可以查看我們之前保存的工作現(xiàn)場
$ git stash apply
執(zhí)行命令將工作現(xiàn)場進(jìn)行恢復(fù)蓄诽,恢復(fù)之后
$ git stash drop
執(zhí)行命令將"儲(chǔ)藏"記錄刪除
$ git stash pop
這條命令其實(shí)是上邊兩條的合并,恢復(fù)現(xiàn)場同時(shí)刪除記錄
$ git stash apply stash@{0}
如果說是有多次進(jìn)行stash
操作的時(shí)候媒吗,可以使用此命令恢復(fù)至指定的現(xiàn)場仑氛。
23. 多人協(xié)作
$ git remote
$ git remote -v
執(zhí)行命令查看遠(yuǎn)程倉庫,遠(yuǎn)程倉庫的默認(rèn)名稱是origin
闸英,加上參數(shù)-v
說明要查看詳細(xì)信息锯岖。
$ git push origin <branchName>
將本地commit
的數(shù)據(jù)提交至遠(yuǎn)程倉庫指定的分支上。
$ git checkout -b dev origin/dev
創(chuàng)建本地dev分支
自阱,似乎也預(yù)先創(chuàng)建了一個(gè)遠(yuǎn)程的 dev 分支
嚎莉,進(jìn)行一次push
操作就可以在遠(yuǎn)程倉庫k看到分支。
$ git branch --set-upstream dev origin/dev
遠(yuǎn)程倉庫已經(jīng)有了dev
分支沛豌,本地的dev
分支還沒有和遠(yuǎn)程倉庫的dev
分支建立連接趋箩,執(zhí)行命令進(jìn)行連接建立赃额。
$ git pull
$ git pull origin <遠(yuǎn)程倉庫名稱>
進(jìn)行代碼的拉去。
24. 標(biāo)簽
發(fā)布版本時(shí)候在版本庫中打上一個(gè)標(biāo)簽[tag]
叫确,標(biāo)簽與版本號(hào)相聯(lián)系跳芳,將來想回到這個(gè)版本的代碼就很方便了。標(biāo)簽其實(shí)就是指向某次 commit 的指針竹勉,這個(gè)和分支很像飞盆,但是分支是可以移動(dòng)的,標(biāo)簽是不能移動(dòng)的次乓。標(biāo)簽可以創(chuàng)建吓歇,也可以刪除。
$ git tag <tagName>
在需要打上標(biāo)簽的分支里直接執(zhí)行命令票腰,就可以創(chuàng)建一個(gè)新的標(biāo)簽了城看。默認(rèn)情況下,標(biāo)簽是打在最新一次的commit
上面杏慰。
$ git tag
執(zhí)行命令测柠,直接查看當(dāng)前現(xiàn)有的標(biāo)簽。注意:標(biāo)簽的排序不是按照時(shí)間順序排列缘滥,而是按照字母順序進(jìn)行排列的轰胁。
$ git tag <tagName> commit_id
標(biāo)簽是隨時(shí)可以給某次commit
打上的,需要帶上相應(yīng)的commit id
就可以朝扼。
$ git show <tagName>
執(zhí)行命令可以查看標(biāo)簽的信息赃阀。
$ git tag -a <tagName> -m "message" commit_id
使用參數(shù)-a
指定標(biāo)簽名,使用參數(shù)-m
指定說明文字擎颖。
$ git tag -s <tagName> -m "message" commit_id
使用參數(shù)-s
可以實(shí)現(xiàn)用私秘鑰簽名一個(gè)標(biāo)簽凹耙。簽名采用PGP
需要先安裝GnuPG
,如果沒有就會(huì)報(bào)錯(cuò)肠仪,這個(gè)神馬的就不清楚了肖抱。
$ git tag -d <tagName>
參數(shù)-d
就是刪除的意思了,這個(gè)和分支的刪除都是類似的异旧。
$ git push origin <tagName>
$ git push origin --tags
tag
命令創(chuàng)建的標(biāo)簽都是在本地存儲(chǔ)的意述,使用push
命令可以將指定的標(biāo)簽推送到服務(wù)器上,使用參數(shù)--tags
可以將本地所有尚未推送的標(biāo)簽進(jìn)行推送吮蛹。
$ git tag -d <tagName>
$ git push origin :refs/tags/<tagName>
要?jiǎng)h除遠(yuǎn)程倉庫的標(biāo)簽需要兩步荤崇,先將本地的標(biāo)簽刪除,然后將刪除推送到遠(yuǎn)程潮针。
這里注意參數(shù):refs/tags/<tagName>
就可以了术荤。
25. 忽略特殊文件
對(duì)于一些配置文件或者是自動(dòng)生成的文件,雖然放在工作目錄里每篷,但是卻不能提交到倉庫中進(jìn)行版本管理瓣戚,比如編譯生成的.class
文件或者是編譯器本地配置的.iml
文件等端圈。這些文件對(duì)于版本管理庫來說都是要忽略的,這些在另一篇文章中都已經(jīng)有提到過了子库。
在 Git 工作區(qū)根目錄創(chuàng)建.gitignore
文件舱权,并將需要忽略的文件進(jìn)行配置,最后將.gitignore
文件添加到版本庫中仑嗅,并提交遠(yuǎn)程倉庫宴倍。
關(guān)于.gitignore
文件的編寫有一個(gè)網(wǎng)址參考:https://github.com/github/gitignore
在Windows
系統(tǒng)中無法直接創(chuàng)建.gitignore
文件,可以在文本編輯器中選擇保存
或者另存為
仓技。
$ git check-ignore -v <file>
執(zhí)行命令可以檢查文件的忽略配置鸵贬。
$ git add -f <file>
注意使用參數(shù)-f
可以實(shí)現(xiàn)強(qiáng)制添加。
26. 自定義 Git
$ git config --global color.ui true
執(zhí)行命令脖捻,會(huì)上 Git 顯示不同的顏色恭理,醒目區(qū)分文件的狀態(tài)。
$ git config --global alias.st status
$ git config --global alias.<別名> <原命令>
配置別名
郭变,參數(shù)config
是配置的意思,參數(shù)--global
是全局的意思涯保,參數(shù)alias.
是給原來的命令設(shè)置一個(gè)新的別名诉濒,注意.
后邊跟上指定要配置的別名。例如第一行配置就是給status
配置了一個(gè)新的別名st
夕春,接下來使用git st
就會(huì)有和git status
一樣的效果未荒。
配置文件的位置:
- 本地倉庫的配置,可以在本地倉庫
.git/config
中進(jìn)行查看及志,也可以從中刪除別名的配置片排。 - 全局的配置,可以在用戶主目錄下隱藏文件
.gitconfig
中進(jìn)行查看速侈。
27. 結(jié)束
終于是寫完了率寡。本來只是想推薦大家看一下廖雪峰的教程,沒想到自己打開就順手開始敲命令倚搬,既然都已經(jīng)開始動(dòng)手實(shí)踐了冶共,就沒有不記錄的理由了。經(jīng)過三天的努力每界,終于是完結(jié)了捅僵。總體來說以前沒注意到的地方有了一個(gè)認(rèn)知眨层,收獲多多庙楚。下面貼出之前學(xué)習(xí)總結(jié)起來的命令。
命令 | 功能 |
---|---|
git --help | 查看幫助 |
git --help 命令 | 查看指定命令的幫助 |
git init | 初始化倉庫 |
git status | 查看狀態(tài)[文件追蹤狀態(tài)] |
git add file | 添加指定的文件 |
git add . | 添加所有的文件 |
git commit | 代碼提交 |
git commit -m "注釋" | 代碼提交帶有注釋的提交 |
git branch | 查看分支 |
git branch -v | 查看分支詳細(xì) |
git branch dev | 創(chuàng)建 dev 分支 |
git checkout dev | 跳轉(zhuǎn) dev 分支 |
git checkout -b dev | 創(chuàng)建并跳轉(zhuǎn) dev 分支 |
git branch -d dev | 刪除 dev 分支 |
git merge dev | 合并 dev 分支到當(dāng)前分支 |
git merge --no-ff -m "message" dev | 不使用快進(jìn)模式合并趴樱,且?guī)咸峤坏淖⑨?/td> |
git clone url | 從遠(yuǎn)程倉庫克隆代碼到本地 |
git pull origin dev | 從遠(yuǎn)程倉庫 dev 分支拉去最新代碼 |
git push origin dev | 將代碼提交到遠(yuǎn)程倉庫 dev分支 |
git diff | 查看修改 |
git log | 查看提交記錄 |
git log --pretty=oneline | 查看記錄一行顯示 |
git relog | 查看所有記錄 |
git rm file | 刪除文件 |
28. 彩蛋
git checkout -b branch-name origin/branch-name
建立本地分支同時(shí)建立服務(wù)器分支
git branch --set-upstream branch-name origin/branch-name
將本地分支與服務(wù)器分支連接
git push origin :branch-name
在遠(yuǎn)程倉庫刪除分支
29. 推薦
- 慕課網(wǎng)有視頻教程:版本管理工具介紹—Git篇主要講的是 GitHub 客戶端
- Git 官方網(wǎng)站:上面有中文版的教程