前言
- 說明:本文是為了給公司員工培訓(xùn)而編寫的教程片橡,意在深度理解git原理,不適合“快餐式”學(xué)習(xí)临梗,適合“刨根問底”式學(xué)習(xí)。理解本文內(nèi)容稼跳,可以解決git常見的一切問題盟庞。
Git學(xué)習(xí)官方網(wǎng)址:https://git-scm.com/book/zh/v2
主要學(xué)習(xí)內(nèi)容:git原理、git命令岂贩。
githug游戲----git學(xué)習(xí)游戲:https://github.com/Gazler/githug
將git基本操作茫经,設(shè)計(jì)成游戲卡關(guān)的方式,主要學(xué)習(xí)git命令行萎津。
正文
一. 起步
1.1 Git工具
Git操作工具比較多卸伞,主要分為命令行和圖像化工具,本文主要介紹:iTerm2(命令行)
和SourceTree
兩種工具锉屈。
1.1.1 命令行工具:
- macOS系統(tǒng):iTerm2以及終端工具配置:iTerm2 + Zsh + Oh My Zsh + tmux
上面的配置工具包含:
1. iTerm2:一個終端模擬器荤傲,比macOS系統(tǒng)自帶的終端好用太多。
我剛接觸到iTerm2時的時候是極力抗拒的颈渊,但是發(fā)現(xiàn)了她的好自后遂黍,我寧愿花上20分種時間配置一個iTerm2環(huán)境出來。
具體我不多說俊嗽,誰用誰知道
2. Solarized:為iTerm2增加配色方案
3. Zsh:使用brew更新macOS自帶的zsh(brew是macOS下強(qiáng)大的包管理工具)
4. Oh My Zsh:用來管理 Zsh 配置的雾家,自帶了好用的基本配置,基本都是 Zsh 的標(biāo)配了
5. tmux:一個終端復(fù)用軟件绍豁,可將終端方案化
配置完成的效果如下:
- windows系統(tǒng):cmder芯咧,安裝教程簡單,安裝教程:windows下的命令行工具-Cmder
配置完成的效果如下:
1.1.2 圖形化工具
- SourceTree:最好用的Git圖形化工具竹揍,沒有之一敬飒。
官網(wǎng)地址:https://www.sourcetreeapp.com
接下來我們以最受歡迎的Swift的http請求項(xiàng)目Alamofire
為例子,查看SourceTree效果芬位。
優(yōu)勢:
1. 強(qiáng)大的UI操作无拗,遠(yuǎn)端和本地分支清晰分明。
2. 強(qiáng)大的分支流顯示昧碉,可以顯示每個分支的狀態(tài)英染,以及合并狀態(tài)。這是我使用它的重要原因被饿。
3. 簡單四康,入門比較低,但是如果不懂git底層原理锹漱,容易造成誤操作箭养。
不足:
1. 與基本命令行相比慕嚷,功能不夠完善哥牍。
2. Git狀態(tài)顯示延時毕泌,不夠流暢。
1.2 Git配置
1.2.1 用戶信息配置
當(dāng)安裝完 Git 應(yīng)該做的第一件事就是設(shè)置你的用戶名稱與郵件地址嗅辣。 這樣做很重要撼泛,因?yàn)槊恳粋€ Git 的提交都會使用這些信息,并且它會寫入到你的每一次提交中澡谭。
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
解釋說明
--global:配置全局的信息
- 疑惑:那我們?yōu)槭裁匆渲糜脩裘袜]箱呢愿题?
這便于我們在提交代碼時候查看到開發(fā)者信息,方便找到提交的作者蛙奖。
在git log
查看git提交記錄命令中潘酗,正如Author信息所顯示:Christian Noon為作者,christian.noon@gmail.com為郵箱雁仲。
在SourceTree
查看提交的作者信息仔夺,效果如下
1.2.2 查看用戶配置信息
當(dāng)你配置完成用戶信息,想要查看用戶信息是否配置正確可以執(zhí)行一下命令
$ git config --global --list
1.2.3 SourceTree查看配置信息
Mac
版的SourceTree
配置用戶名和地址如下:
二. Git基礎(chǔ)
2.1 忽略文件
顧名思義攒砖,忽略文件缸兔,也就是不需要加入Git
版本控制的文件,文件形式為.gitignore
文件吹艇。比如macOS系統(tǒng)中的.DS_Store
文件惰蜜。
依舊以Alamofire為例,查看他的.gitignore
文件
查看.gitignore
文件內(nèi)容
疑惑:我的個XXX受神,這又是 .
*
/
什么鬼意思抛猖,那我的項(xiàng)目需要加入什么樣子內(nèi)容的.gitignore
呢?
淡定路克,別急樟结,我們同性交友網(wǎng)站的大神們幫我們整理出來了網(wǎng)頁地址如下:https://github.com/github/gitignore
下面是我貼出來的部分.gitignore
的文件:
找到屬于你的語言的.gitigonre
文件,使用命令行工具精算,加入項(xiàng)目中瓢宦。
如果你不知道怎么創(chuàng)建.gitignore
文件我也告訴你,方法如下:
1. 用命令行工具(iTerm2)打開項(xiàng)目根路徑
2. 然后 vim .gitignore 灰羽,創(chuàng)建或者編輯 .gitignore 文件
3. 然后將 gitignore 官方提供的 gitignore 提供的內(nèi)容拷貝下來驮履,
粘貼到 .gitignore 文件中,推出并且保存廉嚼。到此 .gitignore 文件添加成功
4. 你還可以用 cat .gitignore 命令查看自己的.gitignore文件是否添加正確
- 提高部分:
探究或者增加自己的.gitignore
內(nèi)容玫镐,可以閱讀以下地址的忽略文件
章節(jié)
網(wǎng)址:.gitignore忽略文件學(xué)習(xí)
2.2 獲取Git倉庫
兩種方式獲取一個git倉庫
1. 在現(xiàn)有目錄中初始化倉庫
打算使用Git對現(xiàn)有項(xiàng)目進(jìn)行管理,只需要進(jìn)入該項(xiàng)目的根路徑怠噪,可以使用cd
命令進(jìn)入該項(xiàng)目路徑
$ git init
當(dāng)你完成git初始化命令之后恐似,你會發(fā)現(xiàn),在項(xiàng)目的根目錄下多了一個.git
的文件夾傍念,那個git進(jìn)行版本控制的最核心的文件夾矫夷。
Tips:Mac如何顯示隱藏文件呢葛闷?之前一直使用命令行,我日双藕,那個方法太麻煩了∈缰海現(xiàn)在我教你一個最簡單的方法,一般人我可不告訴他忧陪,哈哈扣泊。顯示或隱藏隱藏文件快捷鍵:Command + .
2. 克隆現(xiàn)有的遠(yuǎn)端倉庫
Git 支持多種數(shù)據(jù)傳輸協(xié)議。 上面的例子使用的是 https:// 協(xié)議嘶摊,不過你也可以使用 git:// 協(xié)議或者使用 SSH 傳輸協(xié)議延蟹,比如 user@server:path/to/repo.git
// git協(xié)議
$ git clone git@github.com:Alamofire/Alamofire.git
// https協(xié)議
$ git clone https://github.com/Alamofire/Alamofire.git
克隆一個遠(yuǎn)端倉庫需要兩點(diǎn)注意的問題:
- 克隆后的項(xiàng)目路徑問題:因?yàn)楸救擞悬c(diǎn)小潔癖,對這個克隆后的文件路徑都很嚴(yán)謹(jǐn)
我們以克隆AlamofireImage為例子叶堆,我想在Project文件夾下等孵,克隆這個開源項(xiàng)目。
解釋說明:
命令說明:
pwd:輸出當(dāng)前所在路徑
ls -a:查看當(dāng)前文件夾下所有的子文件
克隆結(jié)果說明:
當(dāng)前目錄下創(chuàng)建一個名為 “AlamofireImage” 的目錄蹂空,并在這個目錄下初始化一個 .git 文件夾俯萌,
從遠(yuǎn)程倉庫拉取下所有數(shù)據(jù)放入 .git 文件夾,然后從中讀取最新版本的文件的拷貝上枕。
如果你進(jìn)入到這個新建的 AlamofireImage 文件夾咐熙,你會發(fā)現(xiàn)所有的項(xiàng)目文件已經(jīng)在里面了,
準(zhǔn)備就緒等待后續(xù)的開發(fā)和使用辨萍。
- 克隆方式選擇:https方式一般需要輸入賬號密碼棋恼,git方式需要配置ssh。
3. 使用SourceTree克隆遠(yuǎn)端倉庫
點(diǎn)擊順序:新倉庫
->從URL克隆
锈玉,彈出第二個頁面爪飘。
克隆倉庫時,輸入信息說明:
源URL:是遠(yuǎn)程倉庫地址
目標(biāo)路徑:你想要在電腦磁盤保存的路徑拉背,這里需要自己增加項(xiàng)目倉庫的名稱
名稱:項(xiàng)目倉庫的名稱
注意事項(xiàng):第一次克隆項(xiàng)目如果是https需要輸入用戶名和密碼师崎,如果是git方式
并且你的ssh密鑰有密碼需要你輸入密碼。
2.2 記錄每次更新到倉庫
2.2.1 文件狀態(tài)查看
- 請記住椅棺,你工作目錄下的每一個文件都不外乎這兩種狀態(tài):已跟蹤或未跟蹤
未跟蹤:Untracked(未跟蹤)
已經(jīng)跟蹤:Unmodified(未修改)犁罩、Modified(已修改)、Staged(已暫存)
總結(jié):第一次理解這個圖片比較難两疚,但是理解之后床估,你就會發(fā)現(xiàn),對于git文件狀態(tài)你就完全掌握诱渤。
各種狀態(tài)剖析:
- Untracked(未跟蹤):
- 新增加的文件
- 從git跟蹤中移除(git rm --cached <file path>)
圖片說明:我創(chuàng)建了一個
status.txt
文件丐巫,在使用git status
命令時,他已經(jīng)變成一個Untracked(未跟蹤)文件。
- Staged(已暫存):
- 使用
git add
命令跟蹤文件递胧,只要一個文件被git add
過鸦做,它就變成Staged狀態(tài)(可以被git add
狀態(tài)是Unmodified
和Untracked
)
- 使用
圖片說明:圖片中的"changes to be",意思是
status.txt
文件已經(jīng)被暫存谓着,你可用于提交。
- Unmodified(未修改)
- 已經(jīng)提交的文件狀態(tài):
git commit
提交修改文件坛掠,文件狀態(tài)將變成此狀態(tài)赊锚。 - 丟棄這個文件的當(dāng)前修改:
git checkout -- <file path>
- 已經(jīng)提交的文件狀態(tài):
- Modified(已修改)
- 已經(jīng)提交的文件,修改此文件屉栓,他會變成此狀態(tài)姜骡。
- 已經(jīng)暫存的文件遵蚜,修改此文件,他也會變成此狀態(tài)。
圖片說明:我使用vim命令編輯了status.txt
文件姨谷,在用git status
命令查看文件狀態(tài)時,它已經(jīng)變成已修改狀態(tài)了昆汹。
2.2.2 查看文件狀態(tài)
使用git status
查看項(xiàng)目所有文件狀態(tài)序矩,其中包含哪些文件時新增
、被修改
启绰、被刪除
昂儒、已暫存
等等,其實(shí)就是上面四種狀態(tài)的具體形式的反應(yīng)委可。
$ git status
- SourceTree查看文件狀態(tài)
黃色的"-"號表示Modified(已修改)文件渊跋,紫色的"?"表示Untracked(未跟蹤)文件。當(dāng)然還有其他狀態(tài)文件着倾,途中沒有盡列出來拾酝。
2.2.3 跟蹤并暫存文件
對于新建文件,或者已經(jīng)從git跟蹤中移除的文件卡者,或者已經(jīng)修改的文件蒿囤,使用git add
命令,讓他們變成已經(jīng)暫存的狀態(tài)崇决。
// 跟蹤并暫存單個文件
$ git add <file name>
// 跟蹤并暫存所有文件蟋软,常用!K宰岳守!
$ git add -A
- SourceTree跟蹤并暫存文件
- 跟蹤并暫存單個文件,相當(dāng)于命令
git add <file name>
- 跟蹤并暫存所有文件碌冶,相當(dāng)于命令
git add -A
或者git add .
- 跟蹤并暫存單個文件,相當(dāng)于命令
2.2.4 查看已暫存和未暫存的修改
- 查看未暫存的修改
盡管 git status
可以看到路徑下那些文件發(fā)現(xiàn)變動湿痢,但是我們無法知曉具體改動那一行代碼?而git diff
將通過文件補(bǔ)丁的格式顯示具體哪些行發(fā)生了改變。
// 查看未暫存文件的修改
$ git diff
注意事項(xiàng):"+"號標(biāo)識的是修改中增加內(nèi)容譬重,同理推測拒逮,"-"標(biāo)識的就是修改中刪除內(nèi)容
- 查看已暫存的修改
若要查看已暫存的將要添加到下次提交里的內(nèi)容,可以用 git diff --cached
命令臀规。(Git 1.6.1 及更高版本還允許使用 git diff --staged
滩援,效果是相同的,但更好記些塔嬉。)
$ git diff --cached <file path>
- SourceTree 查看已暫存和未暫存的修改
點(diǎn)擊順序:文件狀態(tài)
->已暫存文件
(未暫存文件
)->選擇具體文件名
->查看文件狀態(tài)
2.2.5 提交更新
-
可以提交的條件:確認(rèn)所有的新建或者修改被
git add
過玩徊,因?yàn)?code>git無法記錄未暫存的變動。 -
規(guī)避提交遺漏:先用
git status
看下谨究,是不是都已暫存起來了恩袱,然后在運(yùn)行提交命令git commit
$ git commit
- 注意事項(xiàng):這種提交方式會啟動文本編輯器以便輸入本次提交的說明。
- 圖片說明:
- 輸入提交內(nèi)容胶哲,以"#"為開頭的行將被忽略畔塔,如果你輸入的內(nèi)容為空,提交將被中斷鸯屿。
- 提交成功后澈吨,在反饋信息中會有本次提交的修改信息。(包含文件個數(shù)寄摆,增加行數(shù)棚辽,刪除行數(shù))
我們比較常用的方法,會在 commit 命令后添加 -m 選項(xiàng)冰肴,將提交信息與命令放在同一行屈藐,如下所示:
$ git commit -m "<commit message>"
- 使用SourceTree提交,三部曲:
2.2.5 移除文件
- 移除文件的三種方式
-
rm <file path>
: 將文件只從磁盤中移除 -
git rm --cached <file path>
:將文件只從git暫存中移除 -
git rm <file path>
:相當(dāng)于上面兩個操作的合并熙尉,將文件從磁盤和git暫存中同時移除联逻。
-
2.3 查看提交歷史
這邊涉及的知識點(diǎn)比較零散,一般使用者只要知道基本命令就行检痰,不做詳細(xì)的說明包归。
具體可以看官網(wǎng)教程,我在這邊附上鏈接:官方文檔-查看提交歷史铅歼。
- 查看最基礎(chǔ)的git提交記錄
// 查看提交記錄公壤,最簡單的數(shù)據(jù)呈現(xiàn)
$ git log
- 查看前某幾次的提交的變動
// 參數(shù)說明:"-1"表示最后一次提交的變動,以此類推"-2"則是最后兩次提交的變動
$ git log -p -1
// 查看作者為caiqiujun的椎椰,提交前最后一次的變動
git log --author=caiqiujun -p -1
- 查看某個文件的變動記錄(俗稱:找鍋)
// file path為文件路徑
$ git log -p -- <file path>
- 查看分支的圖形化變動
目的:分析當(dāng)前分支的合并情況
$ git log --graph
- SourceTree 查看歷史變動情況厦幅,三部曲:
2.4 撤消操作
2.4.1 將修改補(bǔ)充到上次提交中
有時候我們提交完了才發(fā)現(xiàn)漏掉了幾個文件沒有添加,或者提交信息寫錯了慨飘。 此時确憨,可以運(yùn)行帶有 --amend 選項(xiàng)的提交命令嘗試重新提交:
$ git commit --amend
圖片說明:
-
vim
編輯 forget.txt 文件 -
git add -A
將文件暫存 -
git status
查看文件狀態(tài)译荞,確認(rèn)文件已經(jīng)暫存 -
git commit --amend
將forget.txt提交到上次提交中
2.4.2 撤消對文件的修改
- 需要撤銷的文件--未暫存
有時候我們需要,放棄對某個未暫存文件的修改休弃,可以使用git checkout
命令丟棄文件修改吞歼,這是一個很危險的命令,一旦丟棄就無法找回塔猾。
圖片說明:
-
git status
查看文件forget.txt文件是已修改狀體 -
git checkout -- <file name>
撤銷該文件修改 -
git status
在此查看文件狀態(tài)篙骡,已經(jīng)沒有被修改的文件了,對forget.txt文件修改撤銷成功丈甸。
- 需要撤銷的文件--已暫存
圖片說明:
-
git status
查看文件狀態(tài)糯俗,forget.txt為已經(jīng)暫存的修改 -
git reset HEAD <filename>
放棄暫存文件 -
git status
查看文件是否已經(jīng)變成未暫存狀態(tài) - 再調(diào)用上一小節(jié)
git checkout -- <file name>
撤銷對文件的修改。
2.4.3 SourceTree 撤銷操作
- 將忘記提交的文件補(bǔ)充到賞賜提交中老虫,類似于
git commit --amend
- 撤銷該文件的修改,到賞賜提交的狀態(tài)茫多,類似于
git checkout -- <filename>
- 將文件變成未暫存文件祈匙,類似于
git reset HEAD <filename>
2.5 遠(yuǎn)程倉庫的使用
2.5.1 查看遠(yuǎn)程倉庫
如果想查看你已經(jīng)配置的遠(yuǎn)程倉庫服務(wù)器,可以運(yùn)行 git remote -v
命令天揖,會顯示需要讀寫遠(yuǎn)程倉庫使用的 Git 保存的簡寫與其對應(yīng)的 URL夺欲。
$ git remote -v
2.5.2 添加遠(yuǎn)程倉庫
運(yùn)行 git remote add <shortname> <url> 添加一個新的遠(yuǎn)程 Git 倉庫,同時指定一個你可以輕松引用的簡寫:
2.5.3 從遠(yuǎn)程倉庫中抓取與拉取
從遠(yuǎn)程倉庫中獲得數(shù)據(jù)今膊,可以執(zhí)行:
$ git fetch [remote-name]
這個命令會訪問遠(yuǎn)程倉庫些阅,從中拉取所有你還沒有的數(shù)據(jù)。 執(zhí)行完成后斑唬,你將會擁有那個遠(yuǎn)程倉庫中所有分支的引用市埋,可以隨時合并或查看。
必須注意 git fetch
命令會將數(shù)據(jù)拉取到你的本地倉庫 - 它并不會自動合并或修改你當(dāng)前的工作恕刘。 當(dāng)準(zhǔn)備好時你必須手動將其合并入你的工作 缤谎。
運(yùn)行 git pull
通常會從最初克隆的服務(wù)器上抓取數(shù)據(jù)并自動嘗試合并到當(dāng)前所在的分支。
$ git pull [remote-name]
這個操作比較危險褐着,因?yàn)樗龝詣訋湍愫喜⒖涝瑁蛟S有時候你只想看看遠(yuǎn)端倉庫,有沒有其他開發(fā)者更新了代碼而已含蓉。
2.5.4 遠(yuǎn)程倉庫的移除與重命名
如果想要重命名引用的名字可以運(yùn)行 git remote rename
去修改一個遠(yuǎn)程倉庫的簡寫名频敛。
$ git remote rename [old-name] [new-name]
如果因?yàn)橐恍┰蛳胍瞥粋€遠(yuǎn)程倉庫,可以使用 git remote rm [remote-name]
:
$ git remote rm [remote-name]
2.5.5 SourceTree 遠(yuǎn)端倉庫操作
- 配置遠(yuǎn)端倉庫
首先看遠(yuǎn)端倉庫的增刪改查:設(shè)置->遠(yuǎn)端倉庫->其他操作...
- 執(zhí)行抓取操作
注意點(diǎn):一定要勾選第二復(fù)選框馅扣。
比如:團(tuán)隊(duì)里面其他開發(fā)者刪除了一些遠(yuǎn)端分支斟赚,在你的git遠(yuǎn)端分支依然還顯示者那些分支。如果你嘗試勾選它時差油,在抓取一次汁展,你就會發(fā)現(xiàn)那些已經(jīng)刪除的分支消失了。
- 執(zhí)行拉取操作
三. Git 分支
3.1 分支簡介
分支原理介紹請參照官網(wǎng):官網(wǎng)地址
3.1.1 分支創(chuàng)建
創(chuàng)建分支,原理就是創(chuàng)建一個新的可以移動的分支食绿。如下命令是創(chuàng)建一個testing分支
$ git branch testing
注意事項(xiàng)
- 創(chuàng)建分支之前最好保證所有修改已經(jīng)提交侈咕,即工作樹是干凈的。
- 創(chuàng)建新分支時器紧,會拷貝當(dāng)前分支代碼耀销。(從分支原理可以解釋)
- 創(chuàng)建分支后,不會主動切換到新建分支上铲汪,必須執(zhí)行
git checkout [branch-name]
命令切換分支熊尉。如果你想創(chuàng)建一個新分支,并切換到新分支上可以執(zhí)行git checkout -b testing
命令
3.2 分支合并
如果你想將testing分支修改的內(nèi)容合并到master主分支上掌腰,你可以執(zhí)行以下操作:
// 切換到master分支
$ git checkout master
// 將testing分支合并到master分支
$ git merge testing
注意事項(xiàng)
- 創(chuàng)建分支之前最好保證所有修改已經(jīng)提交狰住,即工作樹是干凈的。
- 分支合并完成如果有沖突齿梁,需要解決沖突催植,在作出一次新的提交。
- 沖突原因
兩個分支不同的代碼塊修改了同一代碼區(qū)域勺择,git不能判斷需要保留哪個分支的提交创南。
- 沖突案例分析
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
- 沖突區(qū)域模型
<<<<<<< 分支A
[沖突代碼塊]
=======
[沖突代碼塊]
>>>>>>> 分支B
解決沖突步驟
- 讀懂沖突代碼實(shí)現(xiàn)的功能
- 構(gòu)建最終需要的代碼
- 刪除沖突標(biāo)記
<<<<<<<
(沖突開始標(biāo)記) 、=======
(兩個沖突分割標(biāo)記) 省核、>>>>>>>
(沖突開始結(jié)束) 稿辙,最終讓整個文件變成一個正常的代碼文件。 -
git add
緩存修改气忠,git commit
完成沖突修改提交
3.3 分支管理
3.3.1 查看本地分支
如果你想查看你的本地有哪些分支邻储,你可以使用以下命令:
$ git branch
3.3.2 過濾已經(jīng)合并或尚未合并到當(dāng)前分支的分支
如果要查看哪些分支已經(jīng)合并到當(dāng)前分支,可以運(yùn)行 git branch --merged:
$ git branch --merged
iss53
* master
查看所有包含未合并工作的分支旧噪,可以運(yùn)行 git branch --no-merged:
$ git branch --no-merged
testing
如果未合并的分支芥备,無法正常刪除。如果需要強(qiáng)制刪除使用git branch -D [branch-name]
$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.
3.4 遠(yuǎn)程分支
遠(yuǎn)程跟蹤分支是遠(yuǎn)程分支狀態(tài)的引用舌菜。 它們是你不能移動的本地引用萌壳,當(dāng)你做任何網(wǎng)絡(luò)通信操作時,它們會自動移動日月。 遠(yuǎn)程跟蹤分支像是你上次連接到遠(yuǎn)程倉庫時袱瓮,那些分支所處狀態(tài)的書簽。
本篇文章持續(xù)更新中爱咬,有什么意見可以提尺借,謝謝!