Git-深入挖掘
- (一)、Git分布式版本控制工具
- 1.目標
- 2.概述
- (1).開發中的實際常見
- (2).版本控制器的方式
- (3).SVN (集中版本控制器)
- (4).Git (分布版本控制器)
- (5).Git工作流程圖
- (二)、Git安裝與常用命令
- 1.Git環境配置
- (1).安裝Git的操作
- (2).Git的配置操作
- (3).為常用的指令配置別名 (可選)
- (4).解決GitBash中文亂碼問題
- 2. 創建本地倉庫
- 3.基礎操作命令
- (1).查看修改的狀態 (status)
- (2).添加工作區到暫存區 (git add)
- (3).提交暫存區到本地倉庫 (git commit)
- (4).查看提交日志 (git log)
- (5).版本回退 (回退指定版本)
- (6).添加文件至忽略列表
- 4.分支
- (1).查看本地分支
- (2).創建本地分支 (branch)
- (3).切換分支 (checkout)
- (4).合并分支 (merge)
- (5).刪除分支 (branch)
- (6).解決合并沖突 (本地倉庫)
- (7).開發中分支使用原則與流程
- (三)、Git遠程倉庫
- 1.常用的托管服務[遠程倉庫]
- 2.注冊碼云
- 3.創建遠程倉庫
- 4.配置SSH公鑰
- 5.操作遠程倉庫
- (1).添加遠程倉庫
- (2).查看遠程倉庫
- (3).本地倉庫推送到遠程倉庫
- (4).查看本地倉庫與遠程倉庫分支之間的關聯
- (5).從遠程倉庫克隆到本地
- (6).從遠程倉庫中抓取和拉取
- (7).解決合并沖突 (遠程倉庫版本)
- (四)、在Idea中使用Git
- 1.在Idea中配置Git
- 2.在idea中操作Git
- (1).創建項目遠程倉庫
- (2).創建本地倉庫
- (3).提交到本地倉庫
- (4).推送到遠程倉庫
- (5).推送到遠程倉庫
- (6).克隆遠程倉庫到本地
- (7). 解決合并沖突 (idea版本)
- (8).創建本地分支
- (五)、場景分析
- 1.場景再現
- 2.場景鐵令
(一)、Git分布式版本控制工具
1.目標
- 了解Git基本概念
- 能夠概述Git工作流程
- 能夠使用Git常用命令
- 熟悉Git代碼托管服務
- 能夠使用idea操作Git
組長:創建本地倉庫和遠程倉庫
# 1.初始化
git init
# 2.將本地倉庫與遠程倉庫關聯
git remote add origin git@gitee.com:lwt121788/git_test.git
# 3.將本地倉庫的master分支和遠程倉庫origin的master進行關聯 (并提交)
git push --set-upstream origin master
開發者:第一次
# 1.首先進行克隆項目到本地倉庫
git clone;
# 2.創建并選擇自己的分支xxx
xxx
xxxgit checkout dev01;
# 3.添加到本地倉庫
git add .
git commit -m "提交注釋"
# 5.切換到主分支master
git checkout master
# 6.與master進行合并
git merge dev01
# 7.拉取遠程倉庫查看是否沖突
git pull
# 7.提交到遠程倉庫 (為什么要切換到master分支? 因為就master分支和遠程master進行關聯了)
git push
開發者第二次到N次:
# 1.創建并選擇自己的分支
git checkout dev01;
# 2.首先進行拉取項目到本地倉庫
git pull; xxx
xxx
xxx# 3.添加到本地倉庫
git add .
git commit -m "提交注釋"
# 5.切換到主分支master
git checkout master
# 6.與master進行合并
git merge dev01
# 7. 拉取遠程倉庫查看是否沖突
git pull
# 4.提交到遠程倉庫
git push
2.概述
(1).開發中的實際常見
場景一: 備份小米負責的模塊就要完成了,就在即將Release之前的一瞬間,硬盤光榮犧牲了,幾個月來的努力付之東流。
場景二: 代碼還原這個項目需要一個很復雜的功能,老王摸索了一個星期終于有眉目了,可是這被改的面目全非的代碼已經回不到從前了。什么地方能買到哆啦A夢的時光機啊?
場景三: 協同開發小A和小B先后從文件服務器上下載了同一個文件: assay.java。小A在這個文件中的第30行增加了一個方法叫做count(),先保存到了文件服務器上。小B在assay.java文件中的第50行增加了一個方法叫做sum(),也隨后保存到了文件服務器上,于是count()方法只存在于小剛的記憶中了。
場景四: 追溯問題代碼的編寫人和編寫時間!老王式另一位項目經理,每次因為項目進度挨罵之后,他都不知道是扣哪一個程序員的工資,于是使用Gite可以追溯。
(2).版本控制器的方式
a.集中式版本控制工具集中式版本控制工具,版本是幾種存放在中央服務器上的,team里的每個人work時從中央服務器下載代碼,是必須聯網才能工作,局域網或者互聯網,個人修改后然后提交到中央版本庫。 舉例: SVN和CVS
b.分布式版本控制工具分布式版本控制系統沒有 "中央服務器",每個人的電腦都是一個完整的版本庫,這樣工作的時候,無需聯網了。因為版本庫就在你自己的電腦上,多人協作只需要各自的修改推送給對方,就能互相看到對方的修改了。舉例: Git
(3).SVN (集中版本控制器)
- 工作流程
SVN是集中式版本控制系統,版本庫是集中放在中央服務器的工作流程如下:
1.從中央服務器遠程倉庫下載代碼
2.修改后將代碼提交到中央服務器遠程倉庫
- 優缺點
優點: 簡單,易操作
缺點:所有代碼必須放在中央服務器 1.服務器一旦宕機無法提交代碼,即容錯性較差2.離線無法提交代碼,無法及時記錄我們的提交行為
(4).Git (分布版本控制器)
Git是分布式的,Git不需要中心服務器,我們每臺電腦擁有的東西都是一樣的,我們使用Git并且有個中心服務器。僅僅是為了方便交換大家的修改,但是這個服務器的地位和我們每個人的PC都是一樣的。沒有它大家一樣可以工作,只不過"交換"修改不方便而已。分為兩種類型的倉庫:本地倉庫和遠程倉庫。
速度
簡單的設計
對非線性開發模式的強力支持
(允許成千上萬個并行并發
的分支)完全分布式
有能力高效管理類似 Linux 內核一樣的超大規模項目
(速度和數據量)
(5).Git工作流程圖
- clone (克隆): 從遠程倉庫中克隆或拉取代碼到本地倉庫。
- checkout (檢出): 從本地進行代碼修改
- add (添加): 在提交前先將代碼提交到暫存區
- commit (提交): 提交到本地倉庫。本地倉庫中保存修改的各個歷史版本
- fetch (抓取): 從遠程庫,抓取到本地倉庫,不進行任何的合并動作,一般操作比較少
- pull (拉取): 從遠程庫拉到本地倉庫,自動進行合并(merge),然后放到工作區,相當于
fetch+merge
- fetch (抓取): 修改完成后,需要和團隊成員共享代碼時,將代碼push到遠程倉庫。
(二)、Git安裝與常用命令
1.Git環境配置
(1).安裝Git的操作
https://git-scm.com/download
傻瓜式一鍵安裝,假如安裝成功的話。我們右鍵會得到一個這個
(2).Git的配置操作
當安裝Git后首先要做的事情就是設置用戶名稱和email地址。這是非常重要的,因為每次Git提交都會使用該用戶信息。
- 打開Git Bash
- 設置用戶信息
這里的郵箱和名字都可以隨意寫!!!
git config --global user.name "jsxs"
git config --global user.email "xxxxx.@qq.com"
- 查看配置信息
git config --global user.name
git config --global user.email
我們也可以到 C:\Users\22612\.gitconfig 下查看!
(3).為常用的指令配置別名 (可選)
有些常用的指令參數非續航多,每次都要輸入好多參數,我們可以使用別名。
- 打開用戶目錄,創建
.bashrc
文件
部分windows系統不允許用戶創建點擊開頭的文件,可以打開gitBash,執行 touch ~/.bashrc
- 在
.bshrc
文件中輸入如下內容
# 用于輸出git的提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于輸出當前目錄所有文件及其基本信息
alias ll='ls -al'
- 打開gitBash,執行
source ~/.bashrc
(4).解決GitBash中文亂碼問題
- 打開GitBash執行下面的命令
git config --global core.quotepath false
- ${git_home}/etc/bash.bashrc 文件最后假如下面兩行
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
- 假如找不到git安裝在哪了
- 在
C:\Program Files\Git\etc
配置我們的bash.bashrc
2. 創建本地倉庫
要使用Git對我們的代碼進行版本控制,首先需要獲得本地倉庫
(1). 在電腦的任意位置創建一個空目錄 (例如 test) 作為我們的本地Git倉庫。
(2).進入這個目錄中,點擊右鍵打開Git Bash窗口。
(3).執行 git init
。
(4).如果創建成功后可在文件夾上看到隱藏的 .git 目錄。
(5).除了.git文件夾外,其他的目錄都是工作目錄。
3.基礎操作命令
Git工作目錄下對于文件的 修改
(增加、刪除、更新)會存在幾個狀態,這些修改的狀態隨著我們執行Git的命令會發生變化。
- 未跟蹤: 就是文件創建好了但是還沒有和Git有任何關聯。
- 未暫存: 就是文件創建好了,且和Git有關聯(
就是進行修改了
)。 - 已暫存: 就是將我們的文件發生了修改還未放入暫存區。
- 已暫存: 就是我們的文件發生了修改且放入了我們的暫存區 (
git add.
)。 - 本地倉庫: 就是將我么的暫存區的數據放入倉庫 (
git commit
)。
git add (工作區 -> 暫存區 )gi commit (暫存區 -> 本地倉庫)
(1).查看修改的狀態 (status)
# 我們在剛才創建的本地倉庫,添加工作目錄
touch file01.txt
# 檢查我們的狀態
git status
(2).添加工作區到暫存區 (git add)
# 將我們未跟蹤的工作目錄放進我們的暫存區
git add .
# 查看我們的工作目錄的狀態 (狀態為暫存區)
git status
未跟蹤狀態轉換成我們的暫存區
(3).提交暫存區到本地倉庫 (git commit)
# 將暫存區的數據放入我們的本地倉庫
git commit -m "add file01"
# 將我們暫存區的數據放入我們的本地倉庫后 (工作目錄會清空)git status
暫存區轉換成本地倉庫
(4).查看提交日志 (git log)
# 查看誰提交的
git log
- git log [option]
- option
- –all
顯示所有分支
- –pretty=oneline
將提交信息顯示為一行
- –abbrev-commit
使得輸出的commit更簡短
- –graph 以圖的形式顯示
查看時誰提交的..
- –all
- option
#我們再次修改我們的文件內容
vim file01.txt
# 查看狀態
git status
# 未暫存轉換成暫存
git add .
# 暫存轉換成本地倉庫
git commit -m "udate the textfile02"
(5).版本回退 (回退指定版本)
-
作用: 版本切換
-
命令形式:
git reset --hard commitID
- commitID 可以使用
git-log
或git log
指令查看。
回退成功,內容被清除
查看我們的日志 git-log 我們發現沒有了
- commitID 可以使用
-
如何查看已經刪除的記錄?
-
git reflog
。
git reset --hard 08db245: 恢復刪除的
-
這個指令可以看到已經刪除的提交記錄。
-
(6).添加文件至忽略列表
一半我們總會有一些文件無需納入Git的管理,也不希望他們總出現未跟蹤文件列表。通常都是些自動生成的文件,比如日志文件,或者編譯過程中創建的臨時文件等。在這種情況下,我們可以在工作目錄中創建一個 .gitignore
的文件 (文件名稱固定),列出要忽略的文件模式。
git add [fileneme]:
:只添加指定文件到暫存區
git add .
:添加所有工作目錄到暫存區
1.假如說我們不想要指定文件
touch .gitignorevim .gitignore
所有的以a結尾的文件,都不要加入到我們的暫存區中
4.分支
幾乎所有的版本控制系統都以某種形式支持分支。使用分支意味著你可以把你的工作從開發主線上分離開來進行重大的Bug修改、開發新的功能,一面影響開發主線。
(1).查看本地分支
- 命令:
git branch
(2).創建本地分支 (branch)
- 命令:
git branch 分支名
1.master提交 .gitignore。 dev01分支沒提交
2.master目錄如下
(3).切換分支 (checkout)
- 命令:
git checkout 分支名
切換到我們的dev01目錄,發現沒有.gitignore文件
我們還可以直接切換到一個不存在的分支 (創建并切換)
- 命令:
git checkout -b 分支名
(4).合并分支 (merge)
一個分支上的提交可以合并到另一個分支
命令: git merge 分支名稱
我們發現我們在 A
分支提交之后,那么 B
分支我們看不到,是因為我們 A沒有和B進行 合并(merge)
的。我們在dev01
分支上進行新建一個 file02.txt
文件,那么 master
分支上就不會有。
1.切換到我們的dev01分支并進行提交
2.我們將 dev01 分支合并到我們的 master 分支下
# 我們先切換到 master 分支下
git checkout master
# 將我們的 dev01 與 master 進行合并
git merge dev01
我們發現合并成功!!
master擁有所有的 dev01文件;但dev01不一定有master所有的!!
(5).刪除分支 (branch)
不能刪除當前分支,只能刪除其他分支。 也就是需要先切換到其他分支,然后再其他分支上進行刪除。
git branch -d b1
刪除分支時,需要做各種檢查。
git branch -D b1
不做任何檢查,強制刪除 (未合并merge就刪除,就出現不讓刪除,我們可以使用強制刪除)。
(6).解決合并沖突 (本地倉庫)
當兩個分支上對文件的修改可能會存在沖突,列如同時修改了同一個文件的同一行,這時就需要手動解決沖突
,解決沖突步驟如下:
處理文件中沖突的地方
將解決完沖突的文件加入暫存區
(add)提交到倉庫
(commit)
- 沖突部分的內容理解如下所示:
1. 使用dev分支修改我們的 file01.txt
2. 使用master分支也進行修改我們的 file01.txt
未修改前:
修改后: (還未執行合并)
3.進行合并 merge
# 切換成我們的master
git checkout master
# 進行合并我們的分支
git merge dev
- 如何解決我們的沖突問題
1.查看我們共同修改的文件:
2.進行解析我們這個被git托管的文件
3.處理文件中沖突的地方: 就是最終生成什么.
4. 將解決完沖突的文件加入暫存區并提交到倉庫
我們發現我們沖突解決了,而且進行了合并
5.master分支下更改成了我們想要的
6.dev分支下依然是dev原有的
(7).開發中分支使用原則與流程
幾乎所有的版本控制系統都以某種形式支持分支。使用分支以為這你可以把你的工作主線上分離開來進行重大的Bug修改、開發新的功能,以免影響開發主線。
在開發中,一般有如下分支使用原則與流程:
- master (生產) 分支
- 線上分支,主分支,中小項目線上運行的應用對應的分支。
- develop (開發) 分支(小版本)
是從master創建的分支
,一般作為開發部門的主要開發分支,如果沒有其他分支開發不同期上線要求,都可以在次版本進行開發,但開發完成后,需要時合并到master分支
,準備上線。
- feature/xxxx 分支 (功能開發)
從develop創建的分支
,一般是同期并行開發,但不同期上線時創建的分支,分支上的研發性任務完成后合并到develop分支
- hotfix/xxxx 分支 (BUG修改)
- 從master派生的分支,一般作為
線上bug修復使用,修復完后需要合并到 master、test、develop分支
。
- 從master派生的分支,一般作為
- 還有一些其他分支,在此不再詳述,列如test分支 (用于代碼測試)、pre分支(預上線分支)等等。
(三)、Git遠程倉庫
1.常用的托管服務[遠程倉庫]
前面我們已經知道了Git中存在兩種類型的倉庫,即本地倉庫和遠程倉庫。那么我們如何搭建Git遠程倉庫呢?我們可以借用互聯網上提供的一些代碼托管服務來實現,其中比較常用的就是 碼云、GitLab、Github等等。
2.注冊碼云
要想使用碼云的相關服務,需要注冊賬號:
3.創建遠程倉庫
1.創建倉庫
4.配置SSH公鑰
-
創建SSH公鑰
ssh-keygen -t rsa
-
不斷回車
- 如果公鑰已經存在,則自動覆蓋
-
Gitt設置賬戶公鑰
- 查看生成的公鑰
cat ~/.ssh/id_rsa.pub
- 查看生成的公鑰
-
驗證是否配置成功
ssh -T git@gitee.com
5.操作遠程倉庫
1.將本地倉庫與遠程倉庫進行關聯
關聯語法: git remote [遠程倉庫名] [遠程倉庫SSH]
# 將本地倉庫與遠程倉庫管理 git@gitee.com:lwt121788/git_test.gitgit remote add origin git@gitee.com:lwt121788/git_test.git
# 查看本地倉庫關聯的遠程倉庫
git remote
2.將本地倉庫推送到已關聯的遠程倉庫
本地倉庫推送到遠程倉庫語法: git push [遠程倉庫名] [分支名]
#
git push origin master
(1).添加遠程倉庫
此操作時先初始化本地倉庫,然后再一創建的遠程倉庫進行對接。
- 命令: git remote add <遠端名稱> <遠倉路徑>
- 遠端名稱,默認是orign,取決于遠端服務器設置
- 倉庫路徑,從遠端服務器獲取此URL
- 列如:
git remote add origin git@gitee.com:lwt121788/git_test.git
(2).查看遠程倉庫
- 命令:
git remote
(3).本地倉庫推送到遠程倉庫
- 命令:
git push [-f] [-set-upstream] [遠端名稱 [本地分支][:遠端分支]]
-
如果遠程分支名和本地分支名相同,則可以只些本地分支
git push origin master
-
--set -upstream
推送到遠端的同時并且建立起本地和遠端分支的關聯關系
git push --set-upstream origin master
-
如果當前分支已經和遠端分支關聯,則可以省略分支名和遠端名。
- 執行本地和遠程關聯之前,也就是本地倉庫的master和遠程倉庫的master未執行
git push --set-upstream origin master
- git push 將master分支推送到已關聯的遠端分支
git push
。也就是本地倉庫和遠程倉庫執行git push --set-upstream origin master
之后。
- 執行本地和遠程關聯之前,也就是本地倉庫的master和遠程倉庫的master未執行
-
(4).查看本地倉庫與遠程倉庫分支之間的關聯
#將本地的master與遠程的master進行關聯
git push --set-upstream origin master
# 查看本地倉庫的分支與遠程倉庫的分支關系git branch -vv
(5).從遠程倉庫克隆到本地
如果已經有一個遠端倉庫,我么可以直接clone到本地
- 命令: git clone <倉庫路徑> [本地目錄]
- 本地目錄可以省略,會自動生成一個目錄。
git clone git@gitee.com:lwt121788/git_test.git hello-git
- 本地目錄可以省略,會自動生成一個目錄。
(6).從遠程倉庫中抓取和拉取
遠程分支和本地的分支一樣,我們可以進行merge操作,知識需要把遠端倉庫里的更新都下載到本地,再進行操作。
- 抓取命令:
git fetch [remote name] [branch name]
-
抓取指令就是將倉庫里的更新都抓取到本地,不會進行合并。
1.未執行合并操作 git fetch
2.進行合并剛才拉取的文件 git merge origin/master
-
如果不指定遠端名稱和分支名稱,則抓取所有分支。
-
- 拉取 命令:
git pull [remote name] [branch name]
-
拉取指令就是將遠端倉庫的修改拉到本地并進行自動合并,等于fetch+merge。
1. 執行拉取 git pull
-
如果不指定遠端名稱和分支名稱,則抓取所有并更新當前分支。
-
(7).解決合并沖突 (遠程倉庫版本)
在一段時間A、B用戶修改了同一個文件,且修改了同一行位置的代碼,此時會發生合作沖突。
A用戶再本地修改代碼后優先推送到遠程倉庫,此時B用戶再本地修訂代碼,提交到本地倉庫后,也要繼續推送到遠程倉庫,此時B用戶晚于A用戶,故需要先拉取遠程倉庫的提交,經過合并后才能推送到遠端分支,如下圖所示:
在B用戶拉取代碼時,因為A、B用戶同一段時間修改了同一個文件的相同位置代碼,故會發生合并沖突。
遠程分支也是分支,所以合并時沖突的解決方式也和解決本地分支沖突相同。
- 解決遠程合并沖突
因為剛開始的時候都處于同一個階段,所有的文件都一樣。然后A開始第一次遠程推送,推送成功?。代表著修改的同一個文件的同一個位置已經進行了修改,此時B分支還不知道他和A修改的是同一個位置,但知道A進行了一次遠程推送。所以先進行一次拉取合并的操作,因為提交記錄中有和B分支一樣修改的內容會覺得有沖突。
總結: 在我們push之前,先進行pull拉取。
(四)、在Idea中使用Git
1.在Idea中配置Git
安裝好Idea后,如果Git安裝在默認路徑下,那么idea會自動找到git的位置,如果更改了Git的安裝位置則需要手動配置下Git的路徑。選擇File->Settings打開設置窗口,找到 Version Controller下的Gitde 選項。
2.在idea中操作Git
場景: 本地已經有一個項目,但是并不是git項目,我們需要將這個放到碼云的倉庫里,和其他開發人員繼續一起寫作開發。
(1).創建項目遠程倉庫
(2).創建本地倉庫
(3).提交到本地倉庫
工作區 -> 暫存區 -> 倉庫區
(4).推送到遠程倉庫
``
將本地倉庫和遠程倉庫進行關聯
(5).推送到遠程倉庫
(6).克隆遠程倉庫到本地
(7). 解決合并沖突 (idea版本)
- 分支之間的沖突
- 其他分支進行提交
發現分支之間出現沖突
- 解決沖突
一個遠程分支代表一個版本!!!
(8).創建本地分支
1.使用idea創建遠程分支
(五)、場景分析
1.場景再現
- 由組長,基于項目創建本地倉庫;創建遠程倉庫,推送項目到遠程倉庫。
- 每一位組員從遠程克隆項目到idea中,這樣每位同學在自己電腦上就有一個工作副本,可以正式的開始開發了。我們模擬兩個組員(組員A、組員B),克隆兩個工作區。
3. 組員A修改工作區,提交到本地倉庫,再推送到遠程倉庫。組員B可以直接從遠程倉庫獲取最新的代碼。
4. 組員A和組員B修改了同一份文件的同一行,提交到本地沒有問題,但是推送到遠程倉庫時,后一個推送操作就會失敗。
解決辦法: 需要先獲取遠程倉庫到本地倉庫,編輯沖突,提交并推送代碼。
2.場景鐵令
- 切換分支前線提交本地的修改。
- 代碼計時提交,提交過了就不會丟。
- 遇到任何問題都不要刪除文件目錄。