看著標(biāo)題很多的同學(xué)相信都會有疑問恩袱,為了要重學(xué)Git恰矩,之前難道學(xué)習(xí)的正確,沒錯憎蛤,如果不是正確的學(xué)習(xí)Git后面遇到的問題就會很棘手外傅,不知道如何去解決,就不能更好的運用Git俩檬,下面跟著老劉一起來重新學(xué)習(xí)Git吧萎胰!
## 1 Git介紹
```python
# Git的作用
1 對文件(代碼)進(jìn)行版本管理
2 完成 協(xié)同開發(fā) 項目,幫助程序員整合代碼
????i)幫助開發(fā)者合并開發(fā)的代碼
????ii)如果出現(xiàn)沖突代碼的合并,會提示后提交合并代碼的開發(fā)者联逻,讓其解決沖突
# Git簡介
Git是分布式版本控制系統(tǒng),控制的對象是開發(fā)的項目代碼
# 舉例
比如你在寫畢業(yè)論文换可,想刪除一個段落译荞,又怕將來想恢復(fù)找不回來怎么辦?
于是你先把當(dāng)前文件另存為一個新的文件叶骨,再接著改今膊,改到一定程度,再另存為成另一個新文件衡便,這樣一直改下去,最后你的文件變成了:
????-畢業(yè)論文1.doc
??-畢業(yè)論文2.doc
??-畢業(yè)論文3.doc
??-畢業(yè)論文-永不修改版.doc
??-畢業(yè)論文-打死不改版.doc
??-畢業(yè)論文-再改去死版.doc
過了一段時間,你想找回被刪除的文字耀销,但是已經(jīng)記不清刪除前保存在哪個文件里了,只好一個一個文件去找
看著一堆亂七八糟的文件创南,想保留最新的一個,然后把其他的刪掉亦镶,又怕哪天會用上,還不敢刪
```
## 2 Git 和SVN
![img](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggqvsye2khj30kj0a6mx3.jpg)
![img](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggqvt8t61hj30m10da3yk.jpg)
**Git:分布式,無網(wǎng)絡(luò)時也可以提交到本地版本庫,待到有網(wǎng)絡(luò)時再push到服務(wù)器. **
**svn:非分布式.無網(wǎng)絡(luò)不可以提交**
## 3 Git,GitHub,GitLab,Gitee
```python
Git:是一種版本控制系統(tǒng)笋鄙,是一個命令,是一種工具。
GitHub:是一個基于Git實現(xiàn)的在線代碼托管倉庫解阅,包含一個網(wǎng)站界面分别,向互聯(lián)網(wǎng)開放曲管,公有倉庫免費场斑,部分私有倉庫收費,全球最大的開源代碼托管平臺
GitLab:是一個基于Git實現(xiàn)的在線代碼倉庫托管軟件浩村,可以通過GitLab自己搭建一個類似于GitHub一樣的系統(tǒng)之众,用在企業(yè)內(nèi)部網(wǎng)絡(luò)搭建Git私服脊岳,用于企業(yè)團(tuán)隊內(nèi)部協(xié)作開發(fā)
Gitee:(碼云) 是 OSCHINA 推出的代碼托管平臺,支持 Git 和 SVN,提供免費的私有倉庫托管,面向互聯(lián)網(wǎng)開發(fā)卵惦,分收費和付費,中國最大的開源代碼托管平臺
```
## 4 Git工作流程
![未命名文件 (1)](https://tva1.sinaimg.cn/large/008i3skNgy1guqseyffpoj60x40eqmyu02.jpg)
## 5 Git使用
### 5.1 流程(核心總結(jié))
```python
"""
1)有紅色信息(工作區(qū)有內(nèi)容)播揪,就執(zhí)行 add?
2)全綠信息(內(nèi)容全部在暫存區(qū))米辐,才執(zhí)行 commit
3)只有被版本庫控制的代碼腹侣,才能被監(jiān)聽,所以可以回滾到任何一個版本
"""
```
### 5.2 安裝
```python
# 1.下載對應(yīng)版本:https://git-scm.com/download
# 2.安裝git:在選取安裝路徑的下一步選取 Use a TrueType font in all console windows 選項
```
### 5.3 基礎(chǔ)命令
#### 將已有的文件夾 - 初始化為git倉庫
```python
"""
>: cd 目標(biāo)文件夾內(nèi)部
>: git init
"""
```
#### 在指定目錄下 - 初始化git倉庫
```python
"""
>: cd 目標(biāo)目錄
>: git init 倉庫名
"""
```
#### 在倉庫目錄終端下 - 設(shè)置全局用戶
```python
"""
>: git config --global user.name '用戶名'
>: git config --global user.email '用戶郵箱'
注:在全局文件 C:\Users\用戶文件夾\.gitconfig新建用戶信息,在所有倉庫下都可以使用
"""
```
#### 在倉庫目錄終端下 - 設(shè)置局部用戶
```python
"""
>: git config user.name '用戶名'
????-- 用戶名
>: git config user.email '用戶郵箱'
????-- 用戶郵箱
注:在當(dāng)前倉庫下的config新建用戶信息惨篱,只能在當(dāng)前倉庫下使用
注:一個倉庫有局部用戶烈钞,優(yōu)先使用局部用戶,沒有配置再找全局用戶
"""
```
#### 查看倉庫狀態(tài)
```python
"""
# 當(dāng)倉庫中有文件增加窘奏、刪除嘹锁、修改,都可以在倉庫狀態(tài)中查看
>: git status??
????-- 查看倉庫狀態(tài)
>: git status -s??
????-- 查看倉庫狀態(tài)的簡約顯示
"""
```
#### 工作區(qū)操作
```python
# 通過任何方式完成的文件刪與改
# 空文件夾不會被git記錄
```
#### 撤銷工作區(qū)操作:改着裹、刪(了解)
```python
"""
>: git checkout .
????-- 撤銷所有暫存區(qū)的提交
>: git checkout 文件名
????-- 撤銷某一文件的暫存區(qū)提交
"""
```
#### 工作區(qū)內(nèi)容提交到暫存區(qū)
```python
"""
>: git add .??
????-- 添加項目中所有文件
>: git add 文件名??
????-- 添加指定文件
"""
```
#### 撤銷暫存區(qū)提交:add的逆運算(很少使用)
```python
"""
>: git reset HEAD .
????-- 撤銷所有暫存區(qū)的提交
>: git reset 文件名
????-- 撤銷某一文件的暫存區(qū)提交
>: git reset .
????-- 撤銷所有暫存區(qū)的提交
"""
```
#### 提交暫存區(qū)內(nèi)容到版本庫
```python
>: git commit -m "版本描述信息"
```
#### 撤銷版本庫提交:commit的逆運算
```python
"""
回滾暫存區(qū)已經(jīng)提交到版本庫的操作:
????查看歷史版本:
????????>: git log
????????>: git reflog
????查看時間點之前|之后的日志:
????????>: git log --after 2018-6-1
????????>: git log --before 2018-6-1
????????>: git reflog --after 2018-6-1
????????>: git reflog --before 2018-6-1
????查看指定開發(fā)者日志
????????>: git log --author author_name
????????>: git reflog --author author_name
????回滾到指定版本:
????????回滾到上一個版本:
????????????>: git reset --hard HEAD^
????????????>: git reset --hard HEAD~
????????回滾到上三個版本:
????????????>: git reset --hard HEAD^^^
????????????>: git reset --hard HEAD~3
????????回滾到指定版本號的版本:
????????????>: git reset --hard 版本號 (重點)
????????????>: eg: git reset --hard 35cb292
"""
```
#### 擴展閱讀
```python
# git log 和git reflog的區(qū)別
git log 命令可以顯示所有提交過的版本信息
如果感覺太繁瑣领猾,可以加上參數(shù)??--pretty=oneline,只會顯示版本號和提交時的備注信息
git reflog 可以查看所有分支的所有操作記錄(包括已經(jīng)被刪除的 commit 記錄和 reset 的操作)
# git reset --hard骇扇,--mix摔竿,--soft的區(qū)別
hard (硬)-> 全部刪除,會徹底返回到回退前的版本狀態(tài),了無痕跡
mixed (中)-> 保留工作目錄,文件回退到未commit的狀態(tài)
soft (軟)-> 保留工作目錄匠题、暫存區(qū) ,文件會回退到未 add(未到暫存)的狀態(tài)
總結(jié):
soft是撤銷commit的提交拯坟,但工作區(qū)未提交的更改還是保留;
mixed是撤銷暫存區(qū)的提交韭山,工作區(qū)的更改同樣也保留;
而hard是把工作區(qū)冷溃、暫存區(qū)钱磅、commit到倉庫的三個版本都回滾了
```
## 6 Git忽略文件
Git工作目錄中,有些文件必須要有似枕,但又不能提交它們盖淡,就可以設(shè)置忽略文件
在Git工作區(qū)的根目錄下創(chuàng)建一個特殊的`.gitignore`文件,然后把要忽略的文件名放進(jìn)去凿歼,Git就會自動忽略這些文件
```python
# .gitignore 文件
# 1)在倉庫根目錄下創(chuàng)建該文件
# 2)文件與文件夾均可以被過濾
# 3)文件過濾語法
""" 過濾文件內(nèi)容
文件或文件夾名:代表所有目錄下的同名文件或文件夾都被過濾
/文件或文件夾名:代表倉庫根目錄下的文件或文件夾被過濾
例如:
a.txt:項目中所有a.txt文件和文件夾都會被過濾
/a.txt:項目中只有根目錄下a.txt文件和文件夾會被過濾
/b/a.txt:項目中只有根目錄下的b文件夾下的a.txt文件和文件夾會被過濾
*x*:名字中有一個x的都會被過濾(*代表0~n個任意字符)
空文件夾不會被提交褪迟,空包會被提交,包可以被提交(包中有一個init空文件)
注意:
# 以'#'開始的行答憔,被視為注釋.??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
# 忽略掉所有文件名是 lqz.txt的文件.
????lqz.txt
# 忽略所有生成的 html文件,
*.html
# lqz.html是例外味赃,不在忽略范圍內(nèi)
!lqz.html
# 忽略所有.o和 .a文件.
*.[oa]
"""
```
## 7 Git分支
### 7.1 基本使用
```python
"""
1.創(chuàng)建分支
git branch 分支名
2.查看分支
git branch
3.切換分支
git checkout 分支名
4.創(chuàng)建并切換到分支
git checkout -b 分支名
5.刪除分支
git branch -d 分支名
6.查看遠(yuǎn)程分支(列出所有分支,包含遠(yuǎn)程)
git branch -a
7.合并分支
git merge 分支名
把dev分支合并到master分支:切換到master分支虐拓,執(zhí)行合并dev分支的命令
8.刪除遠(yuǎn)程分支
git push origin --delete lqz
9.新建遠(yuǎn)程分支
本地lqz分支建立完成
git push origin lqz?
"""
"""
1)多個開發(fā)者都是在一個分支上進(jìn)行開發(fā)心俗,不出意外,該分支一定叫dev(協(xié)同開發(fā))
2)如果出現(xiàn)一個特殊任務(wù)(敏感任務(wù))蓉驹,與正常業(yè)務(wù)關(guān)系不緊密城榛,甚至可能大的影響正常的dev分支開發(fā),可以依賴dev開一個子分支态兴,進(jìn)行開發(fā)狠持,開發(fā)完畢后合并到dev分支,再刪除該分支即可
3)所有的開發(fā)任務(wù)都可以在dev分支上進(jìn)行(除非公司硬性要求不能直接在dev分支開發(fā)瞻润,只能在dev子分支開發(fā)喘垂,測試通過后才能合并給dev)
"""
```
### 7.2 dev分支合并到master分支
![未命名文件 (2)](https://tva1.sinaimg.cn/large/008i3skNgy1guqz5c5882j60p107w0t002.jpg)
### 7.3 基于分支的線上bug修復(fù)(開發(fā)新功能甜刻,出現(xiàn)bug)
![未命名文件 (3)](https://tva1.sinaimg.cn/large/008i3skNgy1guqztf0lfvj60s70aqjry02.jpg)
```python
# 無沖突情況
git branch dev # 創(chuàng)建dev分支
git checkout dev # 切換到dev分支
vi d3.txt???????# 新增d3.txt
git add .
git commit -m 'd3.txt' # 提交到版本庫
git checkout master????# 切換到master分支
git branch bug?????????# 創(chuàng)建bug分支
git checkout bug???????# 切換到bug分支
vi b4.txt??????????????# 在bug分支,新增b4.txt??
git add .
git commit -m 'b4.txt'
git checkout master????# 切換回master分支
git merge bug??????????# 合并bug分支
git log
git merge dev??????????# 合并dev分支王污,無沖突罢吃,寫注釋
git log
```
```python
git branch -d dev
git branch -d bug
# 有沖突情況
git branch dev # 創(chuàng)建dev分支
git checkout dev # 切換到dev分支
vi d4.txt???????# 新增d4.txt
git add .
git commit -m 'd4.txt' # 提交到版本庫
git checkout master????# 切換到master分支
git branch bug?????????# 創(chuàng)建bug分支
git checkout bug???????# 切換到bug分支
vi b4.txt??????????????# 在bug分支,新增b4.txt??
git add .
git commit -m 'd4.txt'
git checkout master????# 切換回master分支
git merge bug??????????# 合并bug分支
git log
git merge dev??????????# 合并dev分支昭齐,出沖突
'''
CONFLICT (add/add): Merge conflict in d4.txt
Auto-merging d4.txt
Automatic merge failed; fix conflicts and then commit the result.
'''
# 打開d4.txt發(fā)現(xiàn)如下錯誤
<<<<<<< HEAD????# 原來代碼
bug-add-d4
=======?????????# 新代碼
sada
>>>>>>> dev
#??手動修復(fù)尿招,解決沖突,再提交
git add .
git commit -m '解決沖突'
git log
```
## 8 Git遠(yuǎn)程倉庫
**我們要協(xié)同開發(fā)阱驾,代碼要提交到遠(yuǎn)程倉庫就谜,可以使用gitee,github里覆,gitlab丧荐,本文以gitee為例**
### 8.1 創(chuàng)建遠(yuǎn)程倉庫
```python
# 首先注冊gitee賬號,登陸后喧枷,創(chuàng)建倉庫
```
**注意:git push -u origin master 中-u的意思是虹统,只要執(zhí)行一遍這個命令,以后執(zhí)行g(shù)it push 就等同于git push origin maste隧甚,所有-u表示設(shè)置一個默認(rèn) **
### 8.2 remote源操作
```python
"""
1)查看倉庫已配置的遠(yuǎn)程源
>: git remote
>: git remote -v
2)查看remote命令幫助文檔
>: git remote -h
3)刪除遠(yuǎn)程源
>: git remote remove 源名
eg: git remote remove origin
4)添加遠(yuǎn)程源
>: git remote add 源名 源地址
>: git remote add orgin https://gitee.com/liuqingzheng/app01.git
5)提交代碼到遠(yuǎn)程源
>: git push 源碼 分支名
6)克隆遠(yuǎn)程源
>: git clone 遠(yuǎn)程源地址
"""
"""
1)通過克隆方式連接遠(yuǎn)程源车荔,默認(rèn)遠(yuǎn)程源名就叫origin;所以主動添加遠(yuǎn)程源來連接遠(yuǎn)程倉庫戚扳,源碼也用origin
2)本地一個倉庫只需要和遠(yuǎn)程一個源進(jìn)行同步忧便,所以只需要連接一個遠(yuǎn)程源,如果還想把本地代碼同步給第三個平臺帽借,那么可以通過主動添加遠(yuǎn)程源來連接第三個平臺的遠(yuǎn)程倉庫珠增,此時的源碼就不能再叫origin了,比如online都可以
3)pull和push都可以提供選擇不同的源碼砍艾,和不同的遠(yuǎn)程倉庫交互
"""
```
### 8.3 采用ssh協(xié)議連接遠(yuǎn)程源
```python
# 生成公鑰私鑰蒂教,幫助文檔
官網(wǎng):https://gitee.com/help/articles/4181#article-header0
# 在命令行下執(zhí)行命令
ssh-keygen -t rsa -C "306334678@qq.com" # 郵箱可以任意填寫
# 生成的公鑰私鑰,會放在用戶家路徑下的.ssh文件夾下
本機命令辐董,查看公鑰:cat ~/.ssh/id_rsa.pub
# 復(fù)制公鑰悴品,粘貼到gitee上配置
????-項目倉庫 => 管理 => 部署公鑰管理 => 添加公鑰 => 添加個人公鑰
# 把原來的 origin刪除,新增ssh源
git remote remove orgin
git remote add orgin git@gitee.com:liuqingzheng/app01.git
# 配置成功后简烘,再拉取和提交代碼苔严,不需要輸入用戶名密碼認(rèn)證了
```
### 8.4 如何成為其他碼云項目的開發(fā)者
```python
如果公司項目已經(jīng)存在,同事新入職孤澎,基于原項目開發(fā)
"""
1)生成自己電腦的公鑰届氢,配置到自己的碼云個人公鑰中
2)把自己的碼云用戶名提供給別人,別人添加你成為項目開發(fā)者
3)自己確認(rèn)添加覆旭,成為開發(fā)者退子,克隆開發(fā)項目岖妄,進(jìn)行開發(fā)
"""
```
### 8.5 協(xié)同開發(fā)
```python
"""
1)作為開發(fā)者,第一次同步項目
>: git clone 項目地址
2)保證自己本地有dev分支寂祥,且與遠(yuǎn)程倉庫版本同步(沒有就自己新建)
3)本地開發(fā)的代碼荐虐,必須add、commit到本地版本庫后丸凭,才和遠(yuǎn)程倉庫進(jìn)行交互
4)交互順序:必須 先拉(pull)后提(push)
5)必須切換到要交互的分支福扬,在與遠(yuǎn)程同名的分支進(jìn)行交互,如本地dev與遠(yuǎn)程dev交互
>: git checkout dev
>: git add .
>: git commit -m '本次提交的信息提示'
>: git pull origin dev
>: git push origin dev
"""
```
### 8.6 線上分支合并(提交pr)
#### 無沖突情況
```python
# 本地創(chuàng)建分支
git branch dev
# 把本地分支提交到遠(yuǎn)程
git push??origin dev
# 在本地dev分支修改代碼
git checkout dev
vi d5.txt
git add .
git commit -m '新增d5'
# 推送到遠(yuǎn)程
git push??origin dev
```
![image-20210924002401179](https://tva1.sinaimg.cn/large/008i3skNgy1gur0wjexf0j61wa0eodi902.jpg)
![image-20210924002620931](https://tva1.sinaimg.cn/large/008i3skNgy1gur0yzez7aj61e60u041l02.jpg)
![image-20210924003103078](https://tva1.sinaimg.cn/large/008i3skNgy1gur13ujqipj61i80u0adt02.jpg)
#### 有沖突情況
```python
git pull origin master??# 主分支拉取最新
vi d5.txt
git add .
git commit -m '修改d5.txt'
git push??origin master??# 主分支修改一行惜犀,提交到遠(yuǎn)程
git checkout dev??# 切換到dev分支
?vim d5.txt
git add .
git commit -m 'dev修改d5.txt'
git push??origin dev????# 修改同一行铛碑,提交到遠(yuǎn)程,注意同一行內(nèi)容不能一致
## 線上提交pr虽界,線上不能自動合并汽烦,需要手動合并
git checkout master
git pull https://gitee.com/liuqingzheng/app01.git dev
# 手動修改沖突
git add .
git commit -m '合并pr'
git push origin master
# 再去線上,看到分支已經(jīng)合并好了
```
### 8.7 遠(yuǎn)程倉庫回滾
```python
"""
用dev分支舉例
1)本地切換到遠(yuǎn)程要回滾的分支對應(yīng)的本地分支
git checkout dev
2)回滾本地分支
git reset --hard 版本號
3)本地版本強行提交給服務(wù)器
git push origin dev -f
"""
```
## 9 沖突解決
### 9.1 多人開發(fā)同一分支導(dǎo)致沖突
```python
"""
1)在遠(yuǎn)程倉庫和本地倉庫版本不一致時莉御,拉取遠(yuǎn)程倉庫版本到本地時撇吞,兩個版本進(jìn)入融合,可能會出現(xiàn)版本沖突
2)定位沖突文件沖突代碼礁叔,線下溝通沖突代碼梢夯,整合代碼解決沖突
3)將解決沖突后的代碼重新提交到本地版本庫
4)再拉去遠(yuǎn)程倉庫,直到?jīng)]有沖突晴圾,提交本地版本庫到遠(yuǎn)程
"""
"""
<<<<<<< HEAD??# 沖突的開始
# 自己的代碼
=======??# 分割線
# 別人的代碼
>>>>>>> b63c408abd05b87fc492d40523240561999dba50??# 沖突的結(jié)束(版本)
"""
"""
1)刪除沖突相關(guān)標(biāo)識:沖突的開始、分割線噪奄、沖突的結(jié)束(版本)
2)線下溝通死姚,根據(jù)實際需求完成代碼整合
3)測試整合后的代碼
"""
"""
出現(xiàn)沖突的前提:
1)不同開發(fā)者同時操作了同一文件
2)并且在相同行寫了代碼
強調(diào):有業(yè)務(wù)交際時,版本合并不一定會出現(xiàn)沖突相關(guān)的標(biāo)識勤篮,但是可能會帶著代碼運行崩潰都毒,所有理論上每一次版本合并,都要測試合并后的所有功能(及其之少的情況)
"""
```
### 9.2 分支合并導(dǎo)致沖突
```python
分支合并出現(xiàn)沖突效果跟上面一樣碰缔,只需要解決沖突账劲,重新提交即可
"""
<<<<<<< HEAD??# 沖突的開始
# 自己的代碼
=======??# 分割線
# 別人的代碼
>>>>>>> dev??# 沖突的分支
"""
```
## 10 同一個人在公司開發(fā)和在家開發(fā)
### 10.1 正常情況
```python
# 公司電腦,有代碼
git branch lqz
git checkout lqz # 創(chuàng)建一個自己的分支金抡,寫代碼
vi new.txt
git add .
git commit -m '公司開發(fā)了'
git push origin lqz
# 家里電腦瀑焦,沒有代碼,需要先克隆
cd Desktop/proj
git clone https://gitee.com/liuqingzheng/app01.git
cd app01
git pull origin lqz #拉取lqz分支內(nèi)容
git checkout lqz????# 切換到lqz分支
# 基于此繼續(xù)開發(fā)梗肝,公司開發(fā)的代碼也拉下來了榛瓮,寫完記得提交到遠(yuǎn)程
# 到了公司只需要再pull一下即可把家中開發(fā)的開發(fā)同步過來
```
### 10.2 公司忘記提交代碼情況
```python
# 忽然有一天,在公司開發(fā)了代碼巫击,沒有提交到遠(yuǎn)程倉庫
# 回家就沒法拉取最新公司開發(fā)的代碼禀晓,只能基于遠(yuǎn)程倉庫最新代碼繼續(xù)開發(fā)其他功能(跟公司開發(fā)的功能不一樣)
# 在家中開發(fā)完成提交到遠(yuǎn)程
# 第二條天到公司精续,拉取遠(yuǎn)程最新代碼(可能有沖突)
```
## 11 Git標(biāo)簽管理
```python
# 1 打tag
git tag -a "v1.0" -m "new tag v1.0"
# 2 推送tag到遠(yuǎn)程
git push origin v1.0
# 3 可以看到遠(yuǎn)程有tag了
# 4 基于其他位置打log
git reflog # 查看日志id
# 5 打tag
git tag -a "v1.1" id號 -m 'test'
# 6 推送tag到遠(yuǎn)程
git push origin v1.1
```
## 12 為開源項目貢獻(xiàn)代碼
```python
# 第一步:fork開源代碼,fork后粹懒,在你的個人倉庫里就可以看到這個開源代碼了(相當(dāng)于copy了一份)
# 第二步:在自己倉庫進(jìn)行修改
修改代碼重付,提交暫存,提交到版本庫凫乖,提交到自己gitee
# 第三步:給開源作者提交pr
# 第四步:開源軟件作者就會收到pr确垫,他選擇是否合并,合并后拣凹,你就成了開源軟件開發(fā)者
```
![image-20210924011328551](https://tva1.sinaimg.cn/large/008i3skNgy1gur2bzmed2j61lq0u043002.jpg)
## 13 變基操作(rebase)
**讓提交記錄變得更加簡潔**
### 13.1 第一森爽,多個記錄整合成一個記錄
![未命名文件 (5)](https://tva1.sinaimg.cn/large/008i3skNgy1gur3uhyglyj60np08eaag02.jpg)
```python
git branch lqz??# 創(chuàng)建分支lqz
git checkout lqz # 切換到分支lqz
vi lqz.txt???????
git add .
git commit -m '增加lqz.txt' # 新增lqz.txt 并提交
vi lqz1.txt
git add .
git commit -m '增加lqz1.txt' # 新增lqz1.txt 并提交
vi lqz2.txt
git add .
git commit -m '增加lqz2.txt' # 新增lqz2.txt 并提交
git log???# 查看版本日志
# 指定合并從當(dāng)前版本開始往前的哪個版本(不包含)
git rebase -i 8fa035cd6805e8b35ccb9ceee9a9710c9b819b3c
# 把第二行開始,改為s
# 加入注釋嚣镜,合并后的注釋
git log # 只能看到合并后的注釋了爬迟,多次更改變成了一次
# 注意:已經(jīng)提交到遠(yuǎn)程倉庫的版本,不要再使用rebase菊匿,只合并本地版本提交的幾率
```
### 13.2第二,解決分支合并分叉問題
![未命名文件 (6)](https://tva1.sinaimg.cn/large/008i3skNgy1gur4jas2zoj61150d0dgj02.jpg)
```python
#### 正常merge合并
git branch dev
git checkout dev
vi dev.txt
git add .
git commit -m 'dev增加dev.txt'
git checkout master
vi master.txt
git add .
git commit -m 'master增加master.txt'
# 使用merge合并
git merge dev # 寫入注釋合并
# 圖形化查看版本情況
git log --graph
##### 使用rebase合并
git branch -d dev # 刪除dev分支
git branch dev
git checkout dev # 新建付呕,切換到dev分支
vi dev1.txt
git add .?
git commit -m 'dev 增加dev1.txt' # 新建dev1.txt 并提交到版本庫
git checkout master
vi master1.txt
git add .
git commit -m 'master增加master1.txt' # 切換到master,新建master1.txt跌捆,并提交到版本庫
git checkout dev
git rebase master??# 切換到dev分支徽职,完成變基
git checkout master
git merge dev?????# 切換到master,完成合并
git log --graph???# 查看佩厚,變成了一條線
```
![image-20210924023612523](https://tva1.sinaimg.cn/large/008i3skNgy1gur4q25eflj617e0kw41r02.jpg)
#### rebase合并出沖突情況解決
```python
git branch -d dev # 刪除dev分支
git branch dev
git checkout dev # 新建姆钉,切換到dev分支
vi lqz.txt???????# 在內(nèi)部增加一行話
git add .?
git commit -m 'dev 增加lqz.txt' # 新建lqz.txt 并提交到版本庫
git checkout master
vi lqz.txt
git add .??????# 在內(nèi)部也增加一行話
git commit -m 'master增加lqz.txt' # 切換到master,新建lqz.txt抄瓦,并提交到版本庫
git checkout dev
git rebase master??# 切換到dev分支潮瓶,完成變基,出現(xiàn)沖突
# 解決沖突
vi lqz.txt??# 把沖突解決掉
# 查看狀態(tài)
git status # git rebase正在進(jìn)行狀態(tài)
# 繼續(xù)往下走
git add .
git rebase --continue
git checkout master
git merge dev?????# 切換到master钙姊,完成合并
git log --graph???# 查看毯辅,變成了一條線
git rebase --continue
```
### 13.3 第三
```python
git branch -d dev
git branch dev
git checkout dev # 刪掉dev,重新創(chuàng)建煞额,并切換到dev分支
git push origin dev # 把本地dev同步到遠(yuǎn)程
vi gs.txt
git add .
git commit -m '公司寫了代碼思恐,提交到本地'??# 忘了提交到遠(yuǎn)程倉庫
# 回家后,繼續(xù)開發(fā)膊毁,從遠(yuǎn)程拉下來
mkdir pr
cd pr
git clone https://gitee.com/liuqingzheng/app01.git??# 把代碼克隆下來
cd app01
git checkout dev???# 切換到dev分支胀莹,此時是沒有g(shù)s.txt的
vi j.txt???????????# 在家繼續(xù)開發(fā)
git add .
git commit -m '家里寫了代碼'??
git push origin dev??????# 家里寫的代碼提交到遠(yuǎn)程倉庫
# 第二天來到公司,拉取代碼繼續(xù)開發(fā)媚媒,如果直接拉取嗜逻,會分叉
# 不使用git pull 拉取代碼,會分叉
# 先 git fetch 拉取
git fetch origin dev??# 先拿下來缭召,自定合并代碼栈顷,使用merge合并會分叉
# 使用rebase合并
git rebase origin/dev
'''
由原來的 git pull origin dev
變成
git fetch origin dev
git rebase origin/dev
'''
```
![image-20210924030355748](https://tva1.sinaimg.cn/large/008i3skNgy1gur5ix3r35j61160n677j02.jpg)
##?
## 14 git pull 和git fetch
```python
1. 相同點
首先在作用上他們的功能是大致相同的逆日,都是起到了更新代碼的作用。
2. 不同點
git pull 類似于 git fetch+git merge
```