- 1. 前言
- 2. 為什么使用Git
- 3. 為什么使用命令行
- 4. 安裝
- 5. 配置
- 6. 基本操作
- 7. 分支
- 8. 獲取幫助
- 9. Git和Subversion的命令的對比
- 10. 相關(guān)文章
1. 前言
本文是 Git 入門級教程浮还,針對的是那些不會使用git的人群;通過該教程,能讓你循序漸進(jìn)地掌握 Git 的基本概念、基本操作流程 和 常用命令场钉;
如果你已經(jīng)會了 Git 的基本操作吝羞,希望在使用git時作為手冊去查詢链沼,那你可以查看我的另一篇文章Git命令大全;
如果你在使用Git中遇到了難題麦射,你可以參考 Git技巧和問題解決方案
2. 為什么使用Git
詳情請參考選擇Git的理由
3. 為什么使用命令行
Git 有2種使用方式:
- 命令行方式蛾娶;
- 可視化界面的 GUI 方式;
本文中潜秋,將使用命令行方式蛔琅,理由如下:
- 命令行模式能夠進(jìn)行Git的所有操作;而 GUI 方式只能進(jìn)行較常用的Git操作峻呛;如果你會命令行的方式罗售,那 GUI 的方式也就會了,反之钩述,則不成立莽囤;
- GUI 方式的 Git 軟件太多,不同的人喜歡的可能不一樣切距,也不一定都裝了 GUI 的Git朽缎,但每個人基本上都會有命令行工具,如:Mac 系統(tǒng)里有 Terminal(終端),Windows 系統(tǒng)有 CMD话肖、PowerShell 等等北秽;
4. 安裝
安裝 Git 命令行工具:
- Windows系統(tǒng):從 https://git-scm.com/downloads 下載并安裝 Git命令行工具
- MacOS系統(tǒng):
-
方式1:
- 打開終端;(如果找不到終端軟件最筒,可點擊 屏幕右上角的放大鏡贺氓,然后輸入“終端”來查找并打開終端軟件)
- 執(zhí)行命令:
xcode-select --install
;按照提示操作安裝 xcode 命令行工具床蜘,如果讓輸入密碼辙培,就輸入 電腦的開機(jī)密碼;
-
方式2:如果你的電腦上已經(jīng)安裝了
brew
命令(Homebrew)邢锯,你也可以用 brew 安裝扬蕊;安裝方式如下,在終端中執(zhí)行如下命令:brew install git
-
5. 配置
安裝Git后丹擎,使用Git之前尾抑,需要先對Git做一些常用的信息的配置;
配置工作只需一次蒂培,以后升級時還會沿用現(xiàn)在的配置再愈。當(dāng)然,如果需要护戳,你隨時可以用相同的方式修改已有的配置翎冲。
5.1. 用戶信息
第一個要配置的是你個人的用戶名稱和電子郵件地址。這兩條配置很重要媳荒,每次 Git 提交時都會攜帶這兩條信息府适,用于說明是誰提交了代碼:
git config --global user.name "郭斌勇"
git config --global user.email guobinyong@qq.com
5.2. 文本編輯器
接下來要設(shè)置的是默認(rèn)使用的文本編輯器。Git 需要你輸入一些額外消息的時候肺樟,會自動調(diào)用一個外部文本編輯器給你用檐春。默認(rèn)會使用操作系統(tǒng)指定的默認(rèn)編輯器,一般可能會是 Vi 或者 Vim么伯。如果你有其他偏好疟暖,比如 Emacs 的話,可以重新設(shè)置:
git config --global core.editor emacs
5.3. 差異分析工具
還有一個比較常用的是田柔,在解決合并沖突時使用哪種對比工具俐巴。
比如要改用 vimdiff 的話:
git config --global merge.tool vimdiff
Git 可以理解 kdiff3,tkdiff硬爆,meld欣舵,xxdiff,emerge缀磕,vimdiff缘圈,gvimdiff劣光,ecmerge,和 opendiff 等合并工具的輸出信息糟把。當(dāng)然绢涡,你也可以指定使用自己開發(fā)的工具;
5.4. 查看配置信息
要檢查已有的配置信息遣疯,可以使用如下命令:
git config --list
有時候會看到重復(fù)的變量名雄可,那就說明它們來自不同的配置文件(比如 /etc/gitconfig
和 ~/.gitconfig
),不過最終 Git 實際采用的是最后一個
也可以直接查閱某個環(huán)境變量的設(shè)定缠犀,只要把特定的名字跟在后面即可数苫,像這樣:
git config user.name
6. 基本操作
6.1. 獲得Git倉庫
有兩種獲得Git倉庫的方法:
- 在現(xiàn)存的目錄下創(chuàng)建新的Git倉庫。
- 從已有的Git倉庫克隆新的鏡像倉庫辨液。
6.1.1. 在現(xiàn)存的目錄下創(chuàng)建新的Git倉庫
要對現(xiàn)有的某個項目開始用 Git 管理虐急,只需到此項目的根目錄,執(zhí)行如下命令來創(chuàng)建并初始化Git倉庫:
git init
初始化后室梅,在當(dāng)前目錄下會出現(xiàn)一個名為 .git
的目錄,Git 倉庫的所有信息都包含在該目錄中疚宇。
6.1.2. 從已有的倉庫克隆
如果Git倉庫已經(jīng)存了亡鼠,那我們可以通過如下命令將該倉庫克隆到本機(jī)上:
命令格式:
git clone [url]
示例:
git clone https://gitee.com/guobinyong/GitTest.git
注意:如果克隆的是私有倉庫,可能會彈出對話框讓輸入的用戶名和密碼敷待,輸入被克隆的倉庫的用戶名和密碼即可
這會在當(dāng)前目錄下創(chuàng)建一個名為 GitTest 的目錄间涵,其中包含一個 .git
的目錄,用于保存?zhèn)}庫的所有信息榜揖。
如果想指定克隆到本機(jī)的倉庫的名字勾哩,可以使用如下命令格式:
git clone [url] [倉庫名字]
示例:
git clone https://gitee.com/guobinyong/GitTest.git Test
6.2. 基本概念
我們先來理解下Git 工作區(qū)、暫存區(qū)和版本庫概念
- 工作區(qū):就是你在電腦里能看到的目錄举哟。
-
倉庫:工作區(qū)有一個隱藏目錄
.git
思劳,它不屬于工作區(qū),而是Git的倉庫妨猩。它里面存放著Git倉庫的所有數(shù)據(jù)潜叛; -
暫存區(qū):英文叫 stage 或 index ,一般存放在倉庫(
.git
目錄)下的index
文件(.git/index
)中壶硅,所以有時我們也會把暫存區(qū)也叫作索引(index)威兜。 - 版本庫:版本庫是倉庫中用來存放Git版本(提交記錄)的地方,
下圖展示了倉庫庐椒、版本庫椒舵、暫存區(qū) 和 工作區(qū) 之間的關(guān)系:
6.3. 提交版本
要把更改添加到版本庫,需要兩步:
- 用
git add
命令把更改添加到暫存區(qū)约谈; - 用
git commit
命令將暫存區(qū)中的所有內(nèi)容提交到 版本庫笔宿,生成新的版本節(jié)點犁钟;
下面具體演示下操作步驟:
- 在項目目錄下創(chuàng)建一個文件
file1.txt
,內(nèi)容如下:
a
a
a
a
a
- 查看一下當(dāng)前工作區(qū)的狀態(tài)
git status
輸出結(jié)果提示 file1.txt
未被跟蹤措伐;
- 使用如下命令將
file1.txt
文件添加到暫存區(qū)
git add file1.txt
若想一次添加所有的文件特纤,可以使用以下方式之一:
-
git add .
: 添加新文件(new)和被修改(modified)文件,不包括被刪除(deleted)文件侥加;在Shell里捧存,后面的.
代表當(dāng)前目錄, 所以相當(dāng)于將當(dāng)前目錄傳給了add
命令担败; -
git add *
:添加所有非隱藏的的文件的變化昔穴;*
是 shell 語言中的通配符,能匹配所有非隱藏的文件 和 目錄提前,所以相當(dāng)于將匹配的到文件和目錄都傳給了add
命令吗货; -
git add -A
:添加所有變化; -
git add -u
: 添加被修改(modified)和 被刪除(deleted)文件狈网,不包括新文件(new)宙搬;
再查看一下工作區(qū)的狀態(tài)
file1.txt
未跟蹤的信息已經(jīng)沒有了;但列出了一些將被提交的文件拓哺;
- 我們再次修改一下
file1.txt
的內(nèi)容勇垛,將第3行換成b
,內(nèi)容如下:
a
a
b
a
a
然后再查看一下工作區(qū)的狀態(tài):
又多了一條新提示士鸥,提示我們有一個 file1.txt
文件的修改沒有被暫存闲孤;
- 再次添加變更
git add file1.txt
add
是個多功能命令,根據(jù)目標(biāo)文件的狀態(tài)不同烤礁,此命令的效果也不同:可以用它開始跟蹤新文件讼积,或者把已跟蹤的文件放到暫存區(qū),還能用于合并時把有沖突的文件標(biāo)記為已解決狀態(tài)等脚仔;
再查看一下工作區(qū)的狀態(tài)
跟第一次執(zhí)行 git add file1.txt
后的結(jié)果一樣勤众,這意味著 對同一個文件暫存多次變更,git 會合并多次變更鲤脏,視為一個變更决摧;
- 用如下命令將暫存區(qū)中的變更提交到版本庫,并為這次提交創(chuàng)建一個新的版本凑兰;
git commit
這種方式會啟動文本編輯器以便輸入本次提交的說明掌桩,如下圖。(默認(rèn)會啟用 shell 的環(huán)境變量 $EDITOR 所指定的軟件姑食,一般都是 vim 或 emacs波岛。當(dāng)然也可以使用 git config --global core.editor
命令設(shè)定你喜歡的編輯軟件。)
另外也可以用 -m 參數(shù)后跟提交說明的方式音半,在一行命令中提交更新:
git commit -m “說明文字"
Git 提供了一個跳過使用暫存區(qū)域的方式则拷,只要在提交的時候贡蓖,給 git commit
加上 -a
選項 git commit -a
,Git 就會自動把所有已經(jīng)跟蹤過的文件暫存起來一并提交煌茬,從而跳過 git add
步驟:
git commit -a -m ‘文字說明'
提交完成后斥铺,輸出的日志如下:
查看一下工作區(qū)的狀態(tài),如下:
以上這些步驟就演示了將變更從工作區(qū)添加到版本庫的過程坛善;
6.4. 查看提交歷史
我們可通過 log
命令來查看提交的歷史晾蜘;
git log
以 ASCII 圖形的方式查看提交歷史
git log --graph
最近的更新排在最上面。每次更新都有一個 SHA-1 校驗和眠屎、作者的名字和電子郵件地址剔交、提交時間,最后縮進(jìn)一個段落顯示提交說明改衩。
有時候圖形化工具更容易展示歷史提交的變化岖常,隨 Git 一同發(fā)布的 gitk 就是這樣一種工具。它是用 Tcl/Tk 寫成的葫督,基本上相當(dāng)于 git log 命令的可視化版本竭鞍,凡是 git log 可以用的選項也都能用在 gitk 上。在項目工作目錄中執(zhí)行 gitk
命令后橄镜,就會啟動圖 2-2 所示的界面偎快。
上半個窗口顯示的是歷次提交的分支祖先圖譜,下半個窗口顯示當(dāng)前點選的提交對應(yīng)的具體差異蛉鹿。
6.5. 推送數(shù)據(jù)到遠(yuǎn)程倉庫
目前滨砍,我們新提交的所有數(shù)據(jù)都只是存放在本地的版本庫(.git
目錄)中往湿,遠(yuǎn)程倉庫中還沒有這些數(shù)據(jù)妖异;我們可以查看一下遠(yuǎn)程倉庫中,確定下领追;
Git 跟 Subversion 不同他膳, Subversion 中只要一提交,數(shù)據(jù)就會被推到遠(yuǎn)程倉庫中了绒窑;造成這些區(qū)別的原因是 Git 是布式的版本控制系統(tǒng)棕孙,而 Subversion 是集中式的版本控制系統(tǒng);
通過 push
命令些膨,可把本地倉庫中的數(shù)據(jù)推送到遠(yuǎn)程倉庫:
git push
此時蟀俊,可以查看一下遠(yuǎn)程倉庫中,看是否已經(jīng)包含了我們的新提交订雾;
6.6. 拉取遠(yuǎn)程倉庫中的更新
如果有其他人往遠(yuǎn)程遠(yuǎn)程倉庫上推送了新的提交肢预,我們可以執(zhí)行以下命令來獲取新的提交:
git pull
6.7. 忽略某些文件
有時候我們可能想忽略一些文件,比如:node_mode
洼哎、.idea
等等烫映,但是沼本,在執(zhí)行 status
或 add
命令時,總是顯示這些文件锭沟,甚至一不小心就提交了這些文件抽兆;這時我們可以在工作區(qū)根目錄下創(chuàng)建一個名為 .gitignore
的文件,在該文件中列出要忽略的文件模式辫红;這樣,Git 就不會在跟蹤和顯示這些文件了瞧筛;
文件 .gitignore 的格式規(guī)范如下:
- 所有空行或者以注釋符號 # 開頭的行都會被 Git 忽略厉熟。
- 在一行的末尾添加注釋,會使該行被Git忽略较幌,所以注釋只能獨占一行揍瑟,不能添加在行的末尾;
- 可以使用標(biāo)準(zhǔn)的 glob 模式匹配乍炉。
- 匹配模式最后跟反斜杠(/)說明要忽略的是目錄绢片。
- 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反岛琼。
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達(dá)式底循。
.gitignore 文件的例子:
# 此為注釋 – 將被 Git 忽略
# 忽略所有 .a 結(jié)尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目錄下的所有文件
build/
# 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
7. 分支
與 Subversion 不同 Git 中的分支槐瑞,其實本質(zhì)上僅僅是個指向 commit 對象的可變指針熙涤,它總是指向最后一次的提交對象。在創(chuàng)建倉庫時困檩,Git 會自動創(chuàng)建一個名叫 master
的默認(rèn)分支祠挫;
7.1. 查看分支
git branch
被 *
標(biāo)記的分支是當(dāng)前所在的分支;
7.2. 創(chuàng)建分支
創(chuàng)建一個名叫 dev 的分支
git branch dev
再查看一下分支
你會發(fā)現(xiàn)多了一個 dev 分支悼沿;但當(dāng)前仍處在 master 分支下等舔;也就是說,用 branch 創(chuàng)建新分支時糟趾,并不會自動切換到新分支上慌植;
7.3. 切換分支
我們可以用如下命令切換分支:
git checkout dev
驗證一下是否切換過去
7.4. 創(chuàng)建并切換分支
創(chuàng)建分支,再切換過去义郑,需要兩步蝶柿,如果想一步完成,也是可以的非驮,只需要用帶 -b
選項的 checkout
命令即可:
git checkout -b bug
驗證一下
發(fā)現(xiàn)交汤,已經(jīng)創(chuàng)建了一個 bug 分支,并且也已經(jīng)切換到 bug 分支上了院尔;
7.5. 分支共用工作區(qū)
- 在 bug 分支下新增一個
file2.txt
文件蜻展,內(nèi)容如下:
b
b
b
b
b
- 將該文件添加到暫存區(qū)喉誊,并提交;
git add -A
git commit -m "版本2"
- 切換到 master 分支
git checkout master
再查看一下工作區(qū)里的內(nèi)容
你會發(fā)現(xiàn)纵顾,剛才建的那個文件 file2.txt
沒有了伍茄,因為 master 下沒有 file2.txt
文件,file2.txt
在 bug 分支下施逾;
這也說明:
- 分支 是共用 工作區(qū)的敷矫;
- 切換分支時,Git 會自動將工作區(qū)里的內(nèi)容置為當(dāng)前分支的內(nèi)容汉额;
7.6. 查看所有分支的提交歷史
git log
命令默認(rèn)只能查看指定分支的提交歷史曹仗,可視化命令 gitk
也是,如果想查看所有分支的提交歷史蠕搜,可以給 git log
或者 gitk
添加 --all
選項怎茫;如下:
git log --all
可視化界面查看
gitk --all
git log --all
的輸出結(jié)果如下:
其中 HEAD -> master
表示當(dāng)前在 master 分支下,HEAD
表示當(dāng)前工作區(qū)對應(yīng)的哪個分支 或 提交妓灌;
從輸出結(jié)果中可以看到 master 和 dev 分支還指向同一個提交轨蛤,而 bug 分支 指向另一個提交;這是因為創(chuàng)建 dev 和 bug 分支時虫埂,是處在 master 分支下祥山,創(chuàng)建的新分支會自動 和 當(dāng)時所在分支 指向同一提交;所以 master 和 dev 分支還指向同一個提交掉伏,而后來 bug 分支里單獨提交一個版本缝呕,所以 bug 分支指向了另一個提交;
7.7. 分支只是一個指針并且共享共同的歷史
如果沒做切換斧散,當(dāng)前還是在 master
分支供常;
- 接下來我們在 master 分支里更改一下
file1.txt
的內(nèi)容,將 第3行 的內(nèi)容改成a3
颅湘,如下:
a
a
a3
a
a
- 暫存并提交這次更改话侧,這次我們使用一個快捷的命令
git commit -a -m "版本3"
添加 -a
選項可以自動暫存 所有已跟蹤的文件(被修改(modified)和 被刪除(deleted)文件栗精,但不包括新文件(new))闯参,并直接提交;
- 查看一下全部分支的提交歷史
git log --graph --all --oneline
悲立,其中--oneline
選項是將提交信息放在一行顯示鹿寨;
從輸出結(jié)果中可以看到,master 分支指向了剛才提交的新版本 6dad279 版本3
薪夕,此時 master脚草、dev、bug 分支都指向了不同的提交原献,但是馏慨,它們的版本歷史中都有 2a40918 版本1
埂淮,這是它們共享的提交對象;
并且從結(jié)果中也可以看到:
整個倉庫的提交歷史只有一個写隶,但倉庫中可以有多個分支(如:master倔撞、dev、bug )慕趴,而每個分支都會指向一個提交痪蝇;所以,在 Git 中冕房,分支只是一個指針躏啰,對提交的一個引用,不同分支間可以有共同的提交歷史耙册;
7.8. 合并分支
為了給大家演示一下沖突给僵,我們先制造一些沖突;
- 切換到 bug 分支
git checkout bug
详拙; - 將
file1.txt
文件的第3行改成a4
想际,內(nèi)容如下:
a
a
a4
a
a
- 暫存并提交改動
git commit -a -m "版本4"
; - 將 master 分支的變更合并到 當(dāng)前分支(bug分支):
合并分支用merge
命令溪厘,如下:
git merge master
從輸出中胡本,我們可以看到,合并失敗了畸悬,因為 file1.txt
文件沖突了侧甫;如果沒有沖突,合并就自動完成蹋宦,并會彈出文本編輯器讓你輸出此次合并的提交信息披粟;
為什么 file1.txt
文件會沖突了呢?
因為 我們在 master 和 bug 分支下都改了第3行的內(nèi)容冷冗,所以沖突了守屉;
什么情況下才會沖突?
兩個分支修改了同一文件的同一位置(簡單來說蒿辙,就是修改的內(nèi)容有交叉)就會導(dǎo)致合并時產(chǎn)生沖突拇泛,如果修改的是不同文件 或者 是同一文件的不同位置,也不會導(dǎo)致沖突思灌;
7.9. 查看沖突內(nèi)容
我們可以使用如下命令查看沖突的內(nèi)容
git diff
輸出中顯示出了沖突的文件file1.txt
俺叭,和沖突的內(nèi)容,其中 <<<<<<<
之上 和 >>>>>>>
之下的內(nèi)容是共同的內(nèi)容泰偿,非沖突的內(nèi)容熄守; <<<<<<<
和 =======
之間是當(dāng)前分支中沖突的內(nèi)容, =======
和 >>>>>>>
之間是其它分支中沖突的內(nèi)容;
我們也可以直接在編輯器中查看沖突的文件內(nèi)容:
7.10. 解決沖突
由于語義的復(fù)雜性裕照,Git 目前還不會幫我們自動解決沖突攒发,我們需要自己來解決;
如果此時我們想終止合并晋南,可以使用如下命令:
git merge --abort
如果我們要繼續(xù)合并晨继,需要先解決沖突,解決沖突的方法如下:
- 根據(jù)需要決定如何保留和更改沖突的內(nèi)容搬俊;
- 移除沖突的標(biāo)記文行
<<<<<<<
紊扬、=======
、>>>>>>>
唉擂; - 使用
add
命令將沖突標(biāo)記為已解決git add file1.txt
或者 直接標(biāo)識所有git add .
- 提交變更
git commit
餐屎;
這會彈出文本編輯器讓你輸出此次合并的提交信息,里面默認(rèn)有表達(dá)合并的操作的提交信息玩祟,使用默認(rèn)的即可腹缩;
當(dāng)沖突解決了并提交后,合并操作也就完成了空扎;此時查看一下整個倉庫的版本歷史:
git log --all --graph
從輸出結(jié)果中可以看到藏鹊,合并會產(chǎn)生一個新的提交對象 ebb0d5b95a3e30127379a862de42ad96812d0720
,并且分支當(dāng)前分支(bug分支)已經(jīng)指向了這個新的合并對象转锈;但 master 分支仍然指向的是原來的提交對象 9e32b1556d3259e9193b19942ef76756c7e6afd3 版本3
盘寡,因為我們是將 master 分支的內(nèi)容 合并到 當(dāng)前分支(bug分支),合并改變的是當(dāng)前分支撮慨,并不會影響 master 分支竿痰;
7.11. 刪除分支
如果我們想刪除一個分支(比如 dev 分支),我們可以使用如下命令:
git branch -d dev
8. 獲取幫助
想了解 Git 的各式工具該怎么用砌溺,可以閱讀它們的使用幫助影涉,方法有三:
$ git help [命令]
$ git [命令] --help
$ man git
比如,要學(xué)習(xí) config 命令可以怎么用规伐,運行:
$ git help config
幫助文檔采用BNF語法格式描述規(guī)范描述命令行的語法蟹倾,BNF語法格式的元字符及其含義如下:
[ ]
:可選內(nèi)容;
< >
:必須給出內(nèi)容猖闪;
{ }
:可重復(fù)0至無數(shù)次的內(nèi)容鲜棠;
a|b|c
:多選一;
…
:可以有多個萧朝;
備注:關(guān)于BNF的詳細(xì)內(nèi)容可參考《語法格式描述規(guī)范BNF和ABNF》