Git分布式版本控制工具

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 來(lái)管理和維護(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)力支持(允許成千上萬(wàn)個(gè)并行開發(fā)的分支)

完全分布式

有能力高效管理類似 Linux 內(nèi)核一樣的超大規(guī)模項(xiàng)目(速度和數(shù)據(jù)量)

1.2 Git與SVN對(duì)比

SVN是集中式版本控制系統(tǒng),版本庫(kù)是集中放在中央服務(wù)器的,而開發(fā)人員工作的時(shí)候,用的都是自己的電腦,所以首先要從中央服務(wù)器下載最新的版本,然后開發(fā),開發(fā)完后,需要把自己開發(fā)的代碼提交到中央服務(wù)器。

集中式版本控制工具缺點(diǎn):

服務(wù)器單點(diǎn)故障

容錯(cuò)性差

Git是分布式版本控制系統(tǒng)(Distributed Version Control System,簡(jiǎn)稱 DVCS) ,分為兩種類型的倉(cāng)庫(kù):

本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)

本地倉(cāng)庫(kù):是在開發(fā)人員自己電腦上的Git倉(cāng)庫(kù)

遠(yuǎn)程倉(cāng)庫(kù):是在遠(yuǎn)程服務(wù)器上的Git倉(cāng)庫(kù)

Clone:克隆,就是將遠(yuǎn)程倉(cāng)庫(kù)復(fù)制到本地

Push:推送,就是將本地倉(cāng)庫(kù)代碼上傳到遠(yuǎn)程倉(cāng)庫(kù)

Pull:拉取,就是將遠(yuǎn)程倉(cāng)庫(kù)代碼下載到本地倉(cāng)庫(kù)

1.3 Git工作流程

工作流程如下:

1.從遠(yuǎn)程倉(cāng)庫(kù)中克隆代碼到本地倉(cāng)庫(kù)

2.從本地倉(cāng)庫(kù)中checkout代碼然后進(jìn)行代碼修改

3.在提交前先將代碼提交到暫存區(qū)

4.提交到本地倉(cāng)庫(kù)。本地倉(cāng)庫(kù)中保存修改的各個(gè)歷史版本

5.修改完成后,需要和團(tuán)隊(duì)成員共享代碼時(shí),將代碼push到遠(yuǎn)程倉(cāng)庫(kù)

1.4 Git下載與安裝

下載地址: https://git-scm.com/download

下載完成后可以得到如下安裝文件:

2. Git代碼托管服務(wù)

2.1 常用的Git代碼托管服務(wù)

前面我們已經(jīng)知道了Git中存在兩種類型的倉(cāng)庫(kù),即本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)。那么我們?nèi)绾未罱℅it遠(yuǎn)程倉(cāng)庫(kù)呢?我們可以借助互聯(lián)網(wǎng)上提供的一些代碼托管服務(wù)來(lái)實(shí)現(xiàn),其中比較常用的有GitHub、碼云、GitLab等。

gitHub( 地址:https://github.com/ )是一個(gè)面向開源及私有軟件項(xiàng)目的托管平臺(tái),因?yàn)橹恢С諫it 作為唯一的版本庫(kù)格式進(jìn)行托管,故名gitHub

碼云(地址: https://gitee.com/ )是國(guó)內(nèi)的一個(gè)代碼托管平臺(tái),由于服務(wù)器在國(guó)內(nèi),所以相比于GitHub,碼云速度會(huì)更快

GitLab (地址: https://about.gitlab.com/ )是一個(gè)用于倉(cāng)庫(kù)管理系統(tǒng)的開源項(xiàng)目,使用Git作為代碼管理工具,并在此基礎(chǔ)上搭建起來(lái)的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.emailhello@qq.com

查看配置信息

git config --list

git config user.name

通過(guò)上面的命令設(shè)置的信息會(huì)保存在~/.gitconfig文件中

3.2 獲取Git倉(cāng)庫(kù)

要使用Git對(duì)我們的代碼進(jìn)行版本控制,首先需要獲得Git倉(cāng)庫(kù)

獲取Git倉(cāng)庫(kù)通常有兩種方式:

在本地初始化一個(gè)Git倉(cāng)庫(kù)

從遠(yuǎn)程倉(cāng)庫(kù)克隆

3.2.1在本地初始化一個(gè)Git倉(cāng)庫(kù)

執(zhí)行步驟如下:

  1. 在電腦的任意位置創(chuàng)建一個(gè)空目錄(例如repo1)作為我們的本地Git倉(cāng)庫(kù)

  2. 進(jìn)入這個(gè)目錄中,點(diǎn)擊右鍵打開Git bash窗口

  3. 執(zhí)行命令git init

如果在當(dāng)前目錄中看到.git文件夾(此文件夾為隱藏文件夾)則說(shuō)明Git倉(cāng)庫(kù)創(chuàng)建成功

3.2.2從遠(yuǎn)程倉(cāng)庫(kù)克隆

可以通過(guò)Git提供的命令從遠(yuǎn)程倉(cāng)庫(kù)進(jìn)行克隆,將遠(yuǎn)程倉(cāng)庫(kù)克隆到本地

命令形式為:git clone 遠(yuǎn)程Git倉(cāng)庫(kù)地址

3.3工作目錄、暫存區(qū)以及版本庫(kù)概念

為了更好的學(xué)習(xí)Git,我們需要了解Git相關(guān)的一些概念,這些概念在后面的學(xué)習(xí)中會(huì)經(jīng)常提到

版本庫(kù):前面看到的.git隱藏文件夾就是版本庫(kù),版本庫(kù)中存儲(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 本地倉(cāng)庫(kù)

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ū)的文件修改提交到本地倉(cāng)庫(kù)

git rm 刪除文件

刪除文件后查看文件狀態(tài)

上面刪除的只是工作區(qū)的文件,需要提交到本地倉(cāng)庫(kù)

將文件添加至忽略列表

一般我們總會(huì)有些文件無(wú)需納入Git 的管理,也不希望它們總出現(xiàn)在未跟蹤文件列表。 通常都是些自動(dòng)生成的文件,比如日志文件,或者編譯過(guò)程中創(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āng)庫(kù)配置

在了解之前,先注冊(cè)github賬號(hào),由于你的本地Git倉(cāng)庫(kù)和github倉(cāng)庫(kù)之間的傳輸是通過(guò)SSH加密的,所以需要一點(diǎn)設(shè)置:
第一步:創(chuàng)建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個(gè)目錄下有沒有id_rsa和id_rsa.pub這兩個(gè)文件,如果有的話,直接跳過(guò)此如下命令,如果沒有的話,打開命令行,輸入如下命令:

ssh-keygen -t rsa –C “youremail@example.com”

由于我本地此前運(yùn)行過(guò)一次,所以本地有,如下所示:


id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

第二步:登錄github,打開” settings”中的SSH Keys頁(yè)面,然后點(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)程倉(cāng)庫(kù)

如果想查看已經(jīng)配置的遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器,可以運(yùn)行 git remote 命令。 它會(huì)列出指定的每一個(gè)遠(yuǎn)程服務(wù)器的簡(jiǎn)寫。 如果已經(jīng)克隆了遠(yuǎn)程倉(cāng)庫(kù),那么至少應(yīng)該能看到 origin ,這是 Git 克隆的倉(cāng)庫(kù)服務(wù)器的默認(rèn)名字

3.6.2 添加遠(yuǎn)程倉(cāng)庫(kù)

運(yùn)行 git remote add <shortname> <url> 添加一個(gè)新的遠(yuǎn)程 Git 倉(cāng)庫(kù),同時(shí)指定一個(gè)可以引用的簡(jiǎn)寫

3.6.3 從遠(yuǎn)程倉(cāng)庫(kù)克隆

如果你想獲得一份已經(jīng)存在了的 Git 倉(cāng)庫(kù)的拷貝,這時(shí)就要用到 git clone 命令。 Git 克隆的是該 Git 倉(cāng)庫(kù)服務(wù)器上的幾乎所有數(shù)據(jù)(包括日志信息、歷史記錄等),而不僅僅是復(fù)制工作所需要的文件。 當(dāng)你執(zhí)行 git clone 命令的時(shí)候,默認(rèn)配置下遠(yuǎn)程 Git 倉(cāng)庫(kù)中的每一個(gè)文件的每一個(gè)版本都將被拉取下來(lái)。

克隆倉(cāng)庫(kù)的命令格式是 git clone [url]

3.6.4 移除無(wú)效的遠(yuǎn)程倉(cāng)庫(kù)

如果因?yàn)橐恍┰蛳胍瞥粋€(gè)遠(yuǎn)程倉(cāng)庫(kù) ,可以使用 git remote rm

注意:此命令只是從本地移除遠(yuǎn)程倉(cāng)庫(kù)的記錄,并不會(huì)真正影響到遠(yuǎn)程倉(cāng)庫(kù)

3.6.5 從遠(yuǎn)程倉(cāng)庫(kù)中抓取與拉取

git fetch 是從遠(yuǎn)程倉(cāng)庫(kù)獲取最新版本到本地倉(cāng)庫(kù),不會(huì)自動(dòng)merge

git pull 是從遠(yuǎn)程倉(cāng)庫(kù)獲取最新版本并merge到本地倉(cāng)庫(kù)

注意:如果當(dāng)前本地倉(cāng)庫(kù)不是從遠(yuǎn)程倉(cāng)庫(kù)克隆,而是本地創(chuàng)建的倉(cāng)庫(kù),并且倉(cāng)庫(kù)中存在文件,此時(shí)再?gòu)倪h(yuǎn)程倉(cāng)庫(kù)拉取文件的時(shí)候會(huì)報(bào)錯(cuò)(fatal: refusing to merge unrelated histories ),解決此問(wèn)題可以在git pull命令后加入?yún)?shù)--allow-unrelated-histories

3.6.6 推送到遠(yuǎn)程倉(cāng)庫(kù)

當(dāng)你想分享你的代碼時(shí),可以將其推送到遠(yuǎn)程倉(cāng)庫(kù)。 命令形式:git push [remote-name][branch-name]

3.7 Git分支

幾乎所有的版本控制系統(tǒng)都以某種形式支持分支。 使用分支意味著你可以把你的工作從開發(fā)主線上分離開來(lái),以免影響開發(fā)主線。Git 的master分支并不是一個(gè)特殊分支。 它跟其它分支沒有區(qū)別。 之所以幾乎每一個(gè)倉(cāng)庫(kù)都有 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)程倉(cāng)庫(kù)分支

3.7.5 合并分支

有時(shí)候合并操作不會(huì)如此順利。 如果你在兩個(gè)不同的分支中,對(duì)同一個(gè)文件的同一個(gè)部分進(jìn)行了不同的修改,Git 就沒辦法合并它們,同時(shí)會(huì)提示文件沖突。此時(shí)需要我們打開沖突的文件并修復(fù)沖突內(nèi)容,最后執(zhí)行g(shù)it add命令來(lái)標(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)程倉(cāng)庫(kù)中的分支,可以使用命令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操作的按鈕

4.2.2 將文件添加到暫存區(qū)

4.2.3 提交文件

4.2.4 將代碼推送到遠(yuǎn)程倉(cāng)庫(kù)

4.2.5 從遠(yuǎn)程倉(cāng)庫(kù)克隆工程到本地

4.2.6 從遠(yuǎn)程拉取代碼

4.2.7 版本對(duì)比

4.2.8 創(chuàng)建分支

4.2.9 切換分支

4.2.10 分支合并

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容