1. Git概述
1.1 Git歷史
Git 誕生于一個(gè)極富紛爭(zhēng)大舉創(chuàng)新的年代。Linux 內(nèi)核開源項(xiàng)目有著為數(shù)眾多的參與者。 絕大多數(shù)的 Linux 內(nèi)核維護(hù)工作都花在了提交補(bǔ)丁和保存歸檔的繁瑣事務(wù)上(1991-2002年間)个绍。 到 2002 年勒葱,整個(gè)項(xiàng)目組開始啟用一個(gè)專有的分布式版本控制系統(tǒng) BitKeeper 來管理和維護(hù)代碼。
到了 2005 年巴柿,開發(fā) BitKeeper 的商業(yè)公司同 Linux 內(nèi)核開源社區(qū)的合作關(guān)系結(jié)束凛虽,他們收回了 Linux 內(nèi)核社區(qū)免費(fèi)使用 BitKeeper 的權(quán)力。 這就迫使 Linux 開源社區(qū)(特別是 Linux 的締造者 Linus Torvalds)基于使用 BitKeeper 時(shí)的經(jīng)驗(yàn)教訓(xùn)广恢,開發(fā)出自己的版本系統(tǒng)凯旋。
他們對(duì)新的系統(tǒng)制訂了若干目標(biāo):
速度
簡(jiǎn)單的設(shè)計(jì)
對(duì)非線性開發(fā)模式的強(qiáng)力支持(允許成千上萬個(gè)并行開發(fā)的分支)
完全分布式
有能力高效管理類似 Linux 內(nèi)核一樣的超大規(guī)模項(xiàng)目(速度和數(shù)據(jù)量)
1.2 Git與SVN對(duì)比
SVN是集中式版本控制系統(tǒng),版本庫是集中放在中央服務(wù)器的钉迷,而開發(fā)人員工作的時(shí)候至非,用的都是自己的電腦,所以首先要從中央服務(wù)器下載最新的版本糠聪,然后開發(fā)荒椭,開發(fā)完后,需要把自己開發(fā)的代碼提交到中央服務(wù)器舰蟆。
集中式版本控制工具缺點(diǎn):
服務(wù)器單點(diǎn)故障
容錯(cuò)性差
Git是分布式版本控制系統(tǒng)(Distributed Version Control System趣惠,簡(jiǎn)稱 DVCS) ,分為兩種類型的倉庫:
本地倉庫和遠(yuǎn)程倉庫
本地倉庫:是在開發(fā)人員自己電腦上的Git倉庫
遠(yuǎn)程倉庫:是在遠(yuǎn)程服務(wù)器上的Git倉庫
Clone:克隆身害,就是將遠(yuǎn)程倉庫復(fù)制到本地
Push:推送味悄,就是將本地倉庫代碼上傳到遠(yuǎn)程倉庫
Pull:拉取,就是將遠(yuǎn)程倉庫代碼下載到本地倉庫
1.3 Git工作流程
工作流程如下:
1.從遠(yuǎn)程倉庫中克隆代碼到本地倉庫
2.從本地倉庫中checkout代碼然后進(jìn)行代碼修改
3.在提交前先將代碼提交到暫存區(qū)
4.提交到本地倉庫塌鸯。本地倉庫中保存修改的各個(gè)歷史版本
5.修改完成后侍瑟,需要和團(tuán)隊(duì)成員共享代碼時(shí),將代碼push到遠(yuǎn)程倉庫
1.4 Git下載與安裝
下載地址: https://git-scm.com/download
下載完成后可以得到如下安裝文件:
2. Git代碼托管服務(wù)
2.1 常用的Git代碼托管服務(wù)
前面我們已經(jīng)知道了Git中存在兩種類型的倉庫丙猬,即本地倉庫和遠(yuǎn)程倉庫丢习。那么我們?nèi)绾未罱℅it遠(yuǎn)程倉庫呢?我們可以借助互聯(lián)網(wǎng)上提供的一些代碼托管服務(wù)來實(shí)現(xiàn)淮悼,其中比較常用的有GitHub咐低、碼云、GitLab等袜腥。
gitHub( 地址:https://github.com/ )是一個(gè)面向開源及私有軟件項(xiàng)目的托管平臺(tái)见擦,因?yàn)橹恢С諫it 作為唯一的版本庫格式進(jìn)行托管,故名gitHub
碼云(地址: https://gitee.com/ )是國(guó)內(nèi)的一個(gè)代碼托管平臺(tái)羹令,由于服務(wù)器在國(guó)內(nèi)鲤屡,所以相比于GitHub,碼云速度會(huì)更快
GitLab (地址: https://about.gitlab.com/ )是一個(gè)用于倉庫管理系統(tǒng)的開源項(xiàng)目福侈,使用Git作為代碼管理工具酒来,并在此基礎(chǔ)上搭建起來的web服務(wù)
3. Git常用命令
3.1 本地環(huán)境配置
當(dāng)安裝Git后首先要做的事情是設(shè)置用戶名稱和email地址。這是非常重要的肪凛,因?yàn)槊看蜧it提交都會(huì)使用該用戶信息
設(shè)置用戶信息
git config --global user.name “haha”
git config --global user.email “hello@qq.com”
查看配置信息
git config --list
git config user.name
通過上面的命令設(shè)置的信息會(huì)保存在~/.gitconfig文件中
3.2 獲取Git倉庫
要使用Git對(duì)我們的代碼進(jìn)行版本控制堰汉,首先需要獲得Git倉庫
獲取Git倉庫通常有兩種方式:
在本地初始化一個(gè)Git倉庫
從遠(yuǎn)程倉庫克隆
3.2.1在本地初始化一個(gè)Git倉庫
執(zhí)行步驟如下:
在電腦的任意位置創(chuàng)建一個(gè)空目錄(例如repo1)作為我們的本地Git倉庫
進(jìn)入這個(gè)目錄中辽社,點(diǎn)擊右鍵打開Git bash窗口
執(zhí)行命令git init
如果在當(dāng)前目錄中看到.git文件夾(此文件夾為隱藏文件夾)則說明Git倉庫創(chuàng)建成功
3.2.2從遠(yuǎn)程倉庫克隆
可以通過Git提供的命令從遠(yuǎn)程倉庫進(jìn)行克隆,將遠(yuǎn)程倉庫克隆到本地
命令形式為:git clone 遠(yuǎn)程Git倉庫地址
3.3工作目錄翘鸭、暫存區(qū)以及版本庫概念
為了更好的學(xué)習(xí)Git滴铅,我們需要了解Git相關(guān)的一些概念,這些概念在后面的學(xué)習(xí)中會(huì)經(jīng)常提到
版本庫:前面看到的.git隱藏文件夾就是版本庫就乓,版本庫中存儲(chǔ)了很多配置信息汉匙、日志信息和文件版本信息等
工作目錄(工作區(qū)):包含.git文件夾的目錄就是工作目錄,主要用于存放開發(fā)的代碼
暫存區(qū):.git文件夾中有很多文件生蚁,其中有一個(gè)index文件就是暫存區(qū)噩翠,也可以叫做stage。暫存區(qū)是一個(gè)臨時(shí)保存修改文件的地方
3.4 Git工作目錄下文件的兩種狀態(tài)
Git工作目錄下的文件存在兩種狀態(tài):
untracked 未跟蹤(未被納入版本控制)
tracked 已跟蹤(被納入版本控制)
Unmodified 未修改狀態(tài)
Modified 已修改狀態(tài)
Staged 已暫存狀態(tài)
這些文件的狀態(tài)會(huì)隨著我們執(zhí)行Git的命令發(fā)生變化
3.5 本地倉庫
git status 查看文件狀態(tài)
也可以使用git status –s 使輸出信息更加簡(jiǎn)潔
git add 將未跟蹤的文件加入暫存區(qū)
將新創(chuàng)建的文件加入暫存區(qū)后查看文件狀態(tài)
git reset 將暫存區(qū)的文件取消暫存
將文件取消暫存后查看文件狀態(tài)
git commit 將暫存區(qū)的文件修改提交到本地倉庫
git rm 刪除文件
刪除文件后查看文件狀態(tài)
上面刪除的只是工作區(qū)的文件邦投,需要提交到本地倉庫
將文件添加至忽略列表
一般我們總會(huì)有些文件無需納入Git 的管理绎秒,也不希望它們總出現(xiàn)在未跟蹤文件列表。 通常都是些自動(dòng)生成的文件尼摹,比如日志文件见芹,或者編譯過程中創(chuàng)建的臨時(shí)文件等。 在這種情況下蠢涝,我們可以在工作目錄中創(chuàng)建一個(gè)名為 .gitignore 的文件(文件名稱固定)玄呛,列出要忽略的文件模式。下面是一個(gè)示例:
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
git log 查看日志記錄
3.6 遠(yuǎn)程倉庫配置
在了解之前和二,先注冊(cè)github賬號(hào)徘铝,由于你的本地Git倉庫和github倉庫之間的傳輸是通過SSH加密的,所以需要一點(diǎn)設(shè)置:
第一步:創(chuàng)建SSH Key惯吕。在用戶主目錄下惕它,看看有沒有.ssh目錄,如果有废登,再看看這個(gè)目錄下有沒有id_rsa和id_rsa.pub這兩個(gè)文件淹魄,如果有的話,直接跳過此如下命令堡距,如果沒有的話甲锡,打開命令行,輸入如下命令:
ssh-keygen -t rsa –C “youremail@example.com”
由于我本地此前運(yùn)行過一次羽戒,所以本地有缤沦,如下所示:
id_rsa是私鑰,不能泄露出去易稠,id_rsa.pub是公鑰缸废,可以放心地告訴任何人。
第二步:登錄github,打開” settings”中的SSH Keys頁面,然后點(diǎn)擊“Add SSH Key”,填上任意title企量,在Key文本框里黏貼id_rsa.pub文件的內(nèi)容测萎。
點(diǎn)擊 Add Key,你就應(yīng)該可以看到已經(jīng)添加的key梁钾。
3.6.1查看遠(yuǎn)程倉庫
如果想查看已經(jīng)配置的遠(yuǎn)程倉庫服務(wù)器绳泉,可以運(yùn)行 git remote 命令逊抡。 它會(huì)列出指定的每一個(gè)遠(yuǎn)程服務(wù)器的簡(jiǎn)寫姆泻。 如果已經(jīng)克隆了遠(yuǎn)程倉庫,那么至少應(yīng)該能看到 origin 冒嫡,這是 Git 克隆的倉庫服務(wù)器的默認(rèn)名字
3.6.2 添加遠(yuǎn)程倉庫
運(yùn)行 git remote add <shortname> <url> 添加一個(gè)新的遠(yuǎn)程 Git 倉庫拇勃,同時(shí)指定一個(gè)可以引用的簡(jiǎn)寫
3.6.3 從遠(yuǎn)程倉庫克隆
如果你想獲得一份已經(jīng)存在了的 Git 倉庫的拷貝,這時(shí)就要用到 git clone 命令孝凌。 Git 克隆的是該 Git 倉庫服務(wù)器上的幾乎所有數(shù)據(jù)(包括日志信息方咆、歷史記錄等),而不僅僅是復(fù)制工作所需要的文件蟀架。 當(dāng)你執(zhí)行 git clone 命令的時(shí)候瓣赂,默認(rèn)配置下遠(yuǎn)程 Git 倉庫中的每一個(gè)文件的每一個(gè)版本都將被拉取下來。
克隆倉庫的命令格式是 git clone [url]
3.6.4 移除無效的遠(yuǎn)程倉庫
如果因?yàn)橐恍┰蛳胍瞥粋€(gè)遠(yuǎn)程倉庫 片拍,可以使用 git remote rm
注意:此命令只是從本地移除遠(yuǎn)程倉庫的記錄煌集,并不會(huì)真正影響到遠(yuǎn)程倉庫
3.6.5 從遠(yuǎn)程倉庫中抓取與拉取
git fetch 是從遠(yuǎn)程倉庫獲取最新版本到本地倉庫,不會(huì)自動(dòng)merge
git pull 是從遠(yuǎn)程倉庫獲取最新版本并merge到本地倉庫
注意:如果當(dāng)前本地倉庫不是從遠(yuǎn)程倉庫克隆捌省,而是本地創(chuàng)建的倉庫苫纤,并且倉庫中存在文件,此時(shí)再從遠(yuǎn)程倉庫拉取文件的時(shí)候會(huì)報(bào)錯(cuò)(fatal: refusing to merge unrelated histories )纲缓,解決此問題可以在git pull命令后加入?yún)?shù)--allow-unrelated-histories
3.6.6 推送到遠(yuǎn)程倉庫
當(dāng)你想分享你的代碼時(shí)卷拘,可以將其推送到遠(yuǎn)程倉庫。 命令形式:git push [remote-name][branch-name]
3.7 Git分支
幾乎所有的版本控制系統(tǒng)都以某種形式支持分支祝高。 使用分支意味著你可以把你的工作從開發(fā)主線上分離開來栗弟,以免影響開發(fā)主線。Git 的master分支并不是一個(gè)特殊分支工闺。 它跟其它分支沒有區(qū)別横腿。 之所以幾乎每一個(gè)倉庫都有 master 分支,是因?yàn)間it init 命令默認(rèn)創(chuàng)建它斤寂,并且大多數(shù)人都懶得去改動(dòng)它耿焊。
在本章節(jié)我們會(huì)學(xué)習(xí)到關(guān)于分支的相關(guān)命令,具體如下:
3.7.1 查看分支
# 列出所有本地分支
$ git branch
# 列出所有遠(yuǎn)程分支
$ git branch -r
# 列出所有本地分支和遠(yuǎn)程分支
$ git branch -a
3.7.2 創(chuàng)建分支
3.7.3 切換分支
3.7.4 推送至遠(yuǎn)程倉庫分支
3.7.5 合并分支
有時(shí)候合并操作不會(huì)如此順利遍搞。 如果你在兩個(gè)不同的分支中罗侯,對(duì)同一個(gè)文件的同一個(gè)部分進(jìn)行了不同的修改,Git 就沒辦法合并它們溪猿,同時(shí)會(huì)提示文件沖突钩杰。此時(shí)需要我們打開沖突的文件并修復(fù)沖突內(nèi)容纫塌,最后執(zhí)行g(shù)it add命令來標(biāo)識(shí)沖突已解決
3.7.5 刪除分支
如果要?jiǎng)h除的分支中進(jìn)行了一些開發(fā)動(dòng)作,此時(shí)執(zhí)行上面的刪除命令并不會(huì)刪除分支讲弄,如果堅(jiān)持要?jiǎng)h除此分支措左,可以將命令中的-d參數(shù)改為-D
注:如果要?jiǎng)h除遠(yuǎn)程倉庫中的分支,可以使用命令git push origin –d branchName
4. 在IDEA中使用Git
4.1 在IDEA中配置Git
安裝好IntelliJ IDEA后避除,如果Git安裝在默認(rèn)路徑下怎披,那么idea會(huì)自動(dòng)找到git的位置,如果更改了Git的安裝位置則需要手動(dòng)配置下Git的路徑瓶摆。
選擇File→Settings打開設(shè)置窗口凉逛,找到Version Control下的git選項(xiàng):
選擇git的安裝目錄后可以點(diǎn)擊“Test”按鈕測(cè)試是否正確配置
4.2 在IDEA中使用Git
4.2.1在IDEA中創(chuàng)建工程并將工程添加至Git
將項(xiàng)目添加至Git管理后,可以從IDEA的工具欄上看到Git操作的按鈕