Git快速入门+复习笔记
對(duì)于學(xué)習(xí)編程的同志來(lái)說(shuō),學(xué)習(xí)Git是必不可少的一項(xiàng)技術(shù),如果你是第一次觀看我的文章,歡迎關(guān)注我的頻道,我會(huì)分享更多有趣的知識(shí)。
文章目錄
- 1 目標(biāo)
- 2 概述
- 2.1 開(kāi)發(fā)中的實(shí)際場(chǎng)景
- 2.2 版本控制器的方式
- 2.3 工作流程圖
- 3 Git安裝和常用命令
- 3.1 Git環(huán)境配置
- 3.1.2 基本配置
- 3.2 獲取本地倉(cāng)庫(kù)
- 3.3 基礎(chǔ)操作指令
- 4 分支
- 4.1 分支命令
- 4.2 解決沖突
- 4.3 開(kāi)發(fā)中分支使用原則和流程
- 5 Git遠(yuǎn)程倉(cāng)庫(kù)
- 5.1 創(chuàng)建的托管服務(wù)
- 5.2 配置SSH公鑰
- 5.3 遠(yuǎn)程倉(cāng)庫(kù)添加
- 5.4 從遠(yuǎn)程倉(cāng)庫(kù)克隆
- 5.5 從遠(yuǎn)程倉(cāng)庫(kù)中抓取或拉取
- 5.6 解決合并沖突
1 目標(biāo)
- 了解Git基本概念
- 能夠概述Git的工作流程
- 能夠使用Git常用命令
- 熟悉Git代碼托管服務(wù)
- 能夠使用idea操作git
2 概述
2.1 開(kāi)發(fā)中的實(shí)際場(chǎng)景
場(chǎng)景一:備份
? 小明備份的模塊快要完成了,就在即將Release之前的一瞬間,電腦突然藍(lán)屏,硬盤(pán)光榮犧牲,幾個(gè)月來(lái)的努力付之東流。
場(chǎng)景二:代碼還原
? 這個(gè)項(xiàng)目中需要一個(gè)很復(fù)雜的功能,老王摸索了一個(gè)星期終于有眉目了,可是這被改的面目全非的代碼已經(jīng)回不去從前了。
場(chǎng)景三:協(xié)同開(kāi)發(fā)
? 類(lèi)似于堅(jiān)果云,但是比堅(jiān)果云更好用。
場(chǎng)景四:代碼追責(zé)
? 項(xiàng)目經(jīng)理帶著一群程序員做開(kāi)發(fā),可是某一天出了BUG,但是沒(méi)有人愿意承認(rèn),這時(shí)候找出這個(gè)寫(xiě)出BUG的人至關(guān)重要。
2.2 版本控制器的方式
在開(kāi)始談?wù)摪姹究刂破鞯姆绞街?#xff0c;我們可以看一個(gè)小故事。
引用于:Git的誕生 - 廖雪峰的官方網(wǎng)站 (liaoxuefeng.com)
很多人都知道,Linus在1991年創(chuàng)建了開(kāi)源的Linux,從此,Linux系統(tǒng)不斷發(fā)展,已經(jīng)成為最大的服務(wù)器系統(tǒng)軟件了。
Linus雖然創(chuàng)建了Linux,但Linux的壯大是靠全世界熱心的志愿者參與的,這么多人在世界各地為L(zhǎng)inux編寫(xiě)代碼,那Linux的代碼是如何管理的呢?
事實(shí)是,在2002年以前,世界各地的志愿者把源代碼文件通過(guò)diff的方式發(fā)給Linus,然后由Linus本人通過(guò)手工方式合并代碼。
在那時(shí)候,實(shí)際上已經(jīng)出現(xiàn)了一些版本控制系統(tǒng)如CVS、SVN這些版本控制工具,但是Linus認(rèn)為其并不好用,因?yàn)槠涫羌惺桨姹究刂葡到y(tǒng),打個(gè)比方,集中式版本控制工具就像是去圖書(shū)館借書(shū)來(lái)做筆記,做完筆記后放回去。雖然有一些商用的版本控制系統(tǒng)比CVS、SVN好用,但那是付費(fèi)的,和Linux的開(kāi)源精神不符。
不過(guò),到了2002年,Linux系統(tǒng)已經(jīng)發(fā)展了十年了,代碼庫(kù)之大讓Linus很難繼續(xù)通過(guò)手工方式管理了,社區(qū)的弟兄們也對(duì)這種方式表達(dá)了強(qiáng)烈不滿,于是Linus選擇了一個(gè)商業(yè)的版本控制系統(tǒng)BitKeeper,BitKeeper的東家BitMover公司出于人道主義精神,授權(quán)Linux社區(qū)免費(fèi)使用這個(gè)版本控制系統(tǒng)。
安定團(tuán)結(jié)的大好局面在2005年就被打破了,原因是Linux社區(qū)牛人聚集,不免沾染了一些梁山好漢的江湖習(xí)氣。開(kāi)發(fā)Samba的Andrew試圖破解BitKeeper的協(xié)議(這么干的其實(shí)也不只他一個(gè)),被BitMover公司發(fā)現(xiàn)了(監(jiān)控工作做得不錯(cuò)!),于是BitMover公司怒了,要收回Linux社區(qū)的免費(fèi)使用權(quán)。
Linus可以向BitMover公司道個(gè)歉,保證以后嚴(yán)格管教弟兄們,嗯,這是不可能的。實(shí)際情況是這樣的:
Linus花了兩周時(shí)間自己用C寫(xiě)了一個(gè)分布式版本控制系統(tǒng),這就是Git!一個(gè)月之內(nèi),Linux系統(tǒng)的源碼已經(jīng)由Git管理了!牛是怎么定義的呢?大家可以體會(huì)一下。
Git迅速成為最流行的分布式版本控制系統(tǒng),尤其是2008年,GitHub網(wǎng)站上線了,它為開(kāi)源項(xiàng)目免費(fèi)提供Git存儲(chǔ),無(wú)數(shù)開(kāi)源項(xiàng)目開(kāi)始遷移至GitHub,包括jQuery,PHP,Ruby等等。
歷史就是這么偶然,如果不是當(dāng)年BitMover公司威脅Linux社區(qū),可能現(xiàn)在我們就沒(méi)有免費(fèi)而超級(jí)好用的Git了。
集中式版本控制工具
集中式版本控制工具,版本庫(kù)是集中存放在中央服務(wù)器的,team里每個(gè)人work時(shí)從中央服務(wù)器下載代碼,這個(gè)過(guò)程必須聯(lián)網(wǎng),個(gè)人修改后然后提交到中央版本庫(kù)。所以,這和去百度網(wǎng)盤(pán)寫(xiě)筆記沒(méi)啥兩樣。例如SVN和CVS。
分布式版本控制工具
分布式版本控制工具沒(méi)有“中央服務(wù)器”,每個(gè)人的電腦就是一個(gè)完整的版本庫(kù),這樣工作的時(shí)候,無(wú)需聯(lián)網(wǎng),多人協(xié)作只需要各自的修改推送給對(duì)方,就能互相看到修改內(nèi)容了。例如Git。
2.3 工作流程圖
3 Git安裝和常用命令
本教程的git命令例子都是在Git Bash中演示的,會(huì)用到一些基本的Linux指令,這個(gè)如果不熟悉請(qǐng)移步Linux筆記查看。
3.1 Git環(huán)境配置
3.1.2 基本配置
- 打開(kāi)Git Bash
- 設(shè)置用戶信息
- git config user.name "名字"
- git config user.email "郵箱"
- 查看配置信息
- git config --global user.name
- git config --global user.email
3.2 獲取本地倉(cāng)庫(kù)
要使用Git對(duì)我們的代碼進(jìn)行版本控制,首先需要獲得本地倉(cāng)庫(kù)。創(chuàng)建倉(cāng)庫(kù)的過(guò)程分為以下幾個(gè)步驟:
3.3 基礎(chǔ)操作指令
Git工作目錄下對(duì)于文件的修改會(huì)存在幾個(gè)狀態(tài),這些修改的狀態(tài)會(huì)隨著我們執(zhí)行Git的命令而發(fā)生變化。
如果需要由工作區(qū)上傳至?xí)捍鎱^(qū),那么可以用git add。
如果需要由暫存區(qū)上傳至本地倉(cāng)庫(kù),可以用git commit。
常用指令
| git log 參數(shù) | 查看提交日志 |
| git add 單個(gè)文件名 | 通配符 | 添加一個(gè)文件或多個(gè)文件的修改到暫存區(qū) |
| git commit -m “注釋內(nèi)容” | 提交暫存區(qū)內(nèi)容到本地倉(cāng)庫(kù)的當(dāng)前分支 |
| git status | 查看當(dāng)前修改的狀態(tài) |
| git reset --hard commitID | 版本回退,其中commitID可以在log里面查看 |
| git reflog | 查看刪除 |
| git reflog | 可以看到已經(jīng)刪除的提交記錄 |
git log參數(shù)
| –all | 顯示所有分支 |
| –pretty=oneline | 將提交信息顯示為一行 |
| –abbrev-commit | 使得輸出的commitld更簡(jiǎn)短 |
| –graph | 以圖的形式顯示 |
如果想讓倉(cāng)庫(kù)的某些文件不用git替我們管理,可以創(chuàng)建.gitignore文件,然后用vim編輯器打開(kāi)添加需要忽略的文件名即可。
4 分支
幾乎所有的版本控制系統(tǒng)都以某種形式支持分支。使用分支意味著你可以把你的工作從開(kāi)發(fā)主線上來(lái)進(jìn)行重大的bug修改,開(kāi)發(fā)新的功能,以免影響開(kāi)發(fā)主線。
4.1 分支命令
分支命令
| git branch | 查看本地分支 |
| git branch 分支名 | 創(chuàng)建本地分支 |
| git checkout 分支名 | 切換分支 |
| git checkout -b 分支名 | 創(chuàng)建并且切換到分支 |
| git merge 分支名 | 一個(gè)分支的提交可以合并到另外一個(gè)分支 |
| git branch -d 分支名 | 刪除分支時(shí),需要做各種檢查 |
| git branch -D 分支名 | 不做任何檢查,強(qiáng)制刪除 |
4.2 解決沖突
當(dāng)兩個(gè)分支上對(duì)文件的修改可能會(huì)存在沖突,例如同時(shí)修改了同一個(gè)文件的同一行,這時(shí)就需要手動(dòng)解決沖突,解決沖突步驟如下:
- 處理文件中沖突的地方
- 將解決完沖突的文件加入暫存區(qū)
- 提交到倉(cāng)庫(kù)
4.3 開(kāi)發(fā)中分支使用原則和流程
幾乎所有的版本控制系統(tǒng)都以某種形式支持分支。使用分支意味著你可以把你的工作從開(kāi)發(fā)主線上分離開(kāi)進(jìn)行重大的BUG修改,開(kāi)發(fā)新的功能,以免影響開(kāi)發(fā)主線。
在開(kāi)發(fā)中,一般有如下分支使用遠(yuǎn)程和流程:
-
master(生產(chǎn))分支
線上分支、主分支、中小規(guī)模項(xiàng)目作為線上運(yùn)行的應(yīng)用對(duì)應(yīng)的分支。
-
develop(開(kāi)發(fā))分支
是從master創(chuàng)建的分支,一般作為開(kāi)發(fā)部門(mén)的主要開(kāi)發(fā)分支,如果沒(méi)有其他并行開(kāi)發(fā)不同期上線要求,都可以在此版本進(jìn)行開(kāi)發(fā),階段開(kāi)發(fā)完成后,需要合并到master分支,準(zhǔn)備上線。
-
feature/xxxx分支
從develop創(chuàng)建的分支,一般是同期并行開(kāi)發(fā),但不同期上線時(shí)創(chuàng)建的分支,分支上的研發(fā)任務(wù)完成后合并到develop分支。
-
hotfix/xxxx分支
從master派生的分支,一般作為線上Bug修復(fù)使用,修復(fù)完成后需要合并到master、test、develop分支。
-
還有一些其他分支,在此不再詳述,例如test分支(用于代碼測(cè)試)、pre(預(yù)上線分支)等等。
5 Git遠(yuǎn)程倉(cāng)庫(kù)
5.1 創(chuàng)建的托管服務(wù)
前面我們已經(jīng)知道Git中存在兩種類(lèi)型的倉(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:是一個(gè)面向開(kāi)源及私有軟件項(xiàng)目的托管平臺(tái),因?yàn)橹恢С諫it作為唯一的版本庫(kù)格式進(jìn)行托管,故名gitHub。
Gitee(碼云):是國(guó)內(nèi)的一個(gè)代碼托管平臺(tái),由于服務(wù)器在國(guó)內(nèi),所以相比于GitHub,碼云速度更快。
GitLab:是一個(gè)用于倉(cāng)庫(kù)管理系統(tǒng)的開(kāi)源項(xiàng)目,使用Git作為代碼管理工具,并在此基礎(chǔ)上搭建起來(lái)的web服務(wù),一般用于企業(yè)、學(xué)校等內(nèi)部網(wǎng)絡(luò)搭建git私服。
5.2 配置SSH公鑰
學(xué)過(guò)Linux的都知道,SSH可以用于遠(yuǎn)程控制。碼云基于SSH進(jìn)行遠(yuǎn)程傳輸,所以配置好公鑰后,大家都可以利用這個(gè)公鑰互相傳輸東西。
生成SSH公鑰
ssh-keygen -t rsa
不斷回車(chē),如果公鑰已經(jīng)存在,則自動(dòng)覆蓋。
獲取公鑰
cat ~/.ssh/id_rsa.pub
獲取好后,如果想連接碼云端的倉(cāng)庫(kù),只需按下圖所示:
此時(shí)如果想驗(yàn)證是否連接碼云成功,可以使用ssh -T git@gitee.com指令,如果彈出確認(rèn)框,輸入yes即可。
5.3 遠(yuǎn)程倉(cāng)庫(kù)添加
這個(gè)時(shí)候想要把本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)綁定,只需輸入下面的指令:
git remote add 遠(yuǎn)程倉(cāng)庫(kù)名,通常為origin 倉(cāng)庫(kù)SSH地址
如果想要查看綁定了那些遠(yuǎn)程倉(cāng)庫(kù),只需:
git remote
綁定完成后,我們將本地倉(cāng)庫(kù)推送到遠(yuǎn)程倉(cāng)庫(kù),只需:
git push -f --set-upstream 遠(yuǎn)程倉(cāng)庫(kù)名 本地分支名:遠(yuǎn)程分支名
如果遠(yuǎn)程分支名和本地分支名相同,則可以只寫(xiě)本地分支,其中-f表示強(qiáng)制覆蓋,–set-upstream用于推送到遠(yuǎn)程倉(cāng)庫(kù)的同時(shí)并且建立和遠(yuǎn)端分支的關(guān)聯(lián)關(guān)系。
如果想要查看本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)分支的對(duì)應(yīng)關(guān)系,可以使用:
git branch -vv
第一次推得時(shí)候如果建立起分支的關(guān)系的話,后面則無(wú)需寫(xiě)那么長(zhǎng),只需寫(xiě):
git push
5.4 從遠(yuǎn)程倉(cāng)庫(kù)克隆
如果有一個(gè)遠(yuǎn)程倉(cāng)庫(kù),我們可以直接clone到本地。克隆的命令可用:
git clone 倉(cāng)庫(kù)路徑 本地目錄
其中本地目錄可省略,會(huì)自動(dòng)生成一個(gè)目錄
5.5 從遠(yuǎn)程倉(cāng)庫(kù)中抓取或拉取
遠(yuǎn)程分支可以看成是本地分支,我們也可以進(jìn)行merge操作,只是需要把遠(yuǎn)程倉(cāng)庫(kù)中最新的更新下載到本地,再進(jìn)行操作。
如果只是抓取,那么其作用是把倉(cāng)庫(kù)中的更新都抓取到本地,不會(huì)進(jìn)行合并,并且如果不指定遠(yuǎn)端名稱(chēng)和分支名,則抓取所有的分支,命令如下:
git fetch 遠(yuǎn)程倉(cāng)庫(kù)名 分支名
如果是拉取,那么會(huì)將遠(yuǎn)端倉(cāng)庫(kù)的修改拉到本地后自動(dòng)進(jìn)行合并,相當(dāng)于fetch+merge,而且如果不指定遠(yuǎn)端名稱(chēng)和分支名,則抓取所有并更新當(dāng)前分支。
5.6 解決合并沖突
在一段時(shí)間,A、B用戶修改了同一個(gè)文件,且修改了同一行位置的代碼,此時(shí)會(huì)發(fā)生合并沖突。
A用戶在本地修改代碼后優(yōu)先推送到遠(yuǎn)程倉(cāng)庫(kù),此時(shí)B用戶在本地修訂代碼,提交到本地倉(cāng)庫(kù)后,也需要到遠(yuǎn)程倉(cāng)庫(kù),此時(shí)B用戶晚于A用戶,故需要先拉取遠(yuǎn)程倉(cāng)庫(kù)的提交,經(jīng)過(guò)合并后才能推送到遠(yuǎn)程倉(cāng)庫(kù)分支,如下圖所示:
在B用戶拉取代碼時(shí),因?yàn)锳、B用戶同一段時(shí)間修改了同一個(gè)文件的相同位置代碼,故會(huì)發(fā)生合并沖突。
遠(yuǎn)程分支也是分支,所以合并時(shí)沖突的解決方式也和解決本地分支沖突相同。
總結(jié)
以上是生活随笔為你收集整理的Git快速入门+复习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习中的一些概率函数分布
- 下一篇: 利用html表格制作个人简历