Git操作說明
1 Git 介紹
Git 是一款開源免費的分散式的版本控制系統。是 Linux 之父 Linus Torvalds(林納斯·託瓦茲)為了方便管理 linux 程式碼程式碼而開發的。
Git 可以實現的功能:
-
程式碼備份
-
版本回退
-
多人協作
-
許可權控制
Git 工具下載地址:https://git-scm.com/
GIt 官方文件地址:https://git-scm.com/book/zh/v2
2 Git 準備工作
2.1 常用 Linux 操作
① 常用 Linux 命令
ls 列出當前目錄下所有的檔案和目錄
命令選項:
-a 列出當前目錄下的包括隱藏檔案在內的所有檔案和目錄
-l 列出當前目錄下的檔案和目錄的詳細資訊
-al 列出當前目錄下的包括隱藏檔案在內的所有檔案和目錄的詳細資訊
cd 目錄路徑 進入指定的目錄
cd .. 表示進入上一個目錄
mkdir 目錄名 建立一個目錄
touch 檔名 建立一個檔案
cat 檔名 快速讀取檔案中的內容(適合檔案中的內容不是太多)
mv 舊的名字 新的名字 重新命名檔案或目錄
rm -rf 路徑 刪除檔案或目錄
clear 清空當前的命令列工具
② 常用快捷鍵
tab 路徑補全
ctrl + L 清空當前的命令列工具
ctrl + C 結束當前正在執行命令
鍵盤上下方向鍵 檢視歷史命令
2.2 Vim 的使用
vim 可以用來讀取、編輯檔案內容,使用 vim 命令開啟檔案。
如果 vim 開啟的檔案的不存在,會自動建立。
vim 檔名
vi/vim 共分為三種模式,分別是命令模式(Command mode),輸入模式(Insert mode)和底線命令模式(Last line mode)。
① 命令模式
vim 檔名
開啟檔案之後,進入的就是命令模式; 在命令模式下不可編輯內容。
常用命令:
-
i
命令,可以進入輸入模式。 -
x
命令,刪除當前游標後面的字元。 -
:
命令,可以進入底線命令模式。
② 輸入模式
在命令模式下,輸入 i
命令可以進入輸入模式,
在輸入模式下,可以編輯文字內容。
按 ESC
可以退出輸入模式,回撥命令模式。
③ 底線命令模式
在命令模式下,輸入 :
可以進入底線命令模式。
在底線命令模式下,可以進行儲存或退出。
-
w
命令,儲存。按完回車執行,回到命令模式。 -
q
命令,退出,如果沒有沒存是無法退出的,如果要強制退出,可以使用q!
,可以不儲存就退出。 -
wq
命令,儲存並退出。可以使用wq!
表示強制儲存並退出。
3 Git 基礎概念
3.1 .git
目錄 倉庫目錄
-
hooks 目錄包含客戶端或服務端的鉤子指令碼,在特定操作下自動執行。
-
info 包含一個全域性性排除檔案,可以配置檔案忽略。
-
logs 儲存日誌資訊。
-
objects 目錄儲存所有資料內容,本地的版本庫存放位置。
-
refs 目錄儲存指向資料的提交物件的指標(分支)。
-
config 檔案包含專案特有的配置選項。
-
description 用來顯示對倉庫的描述資訊。
-
HEAD 檔案指示目前被檢出的分支。
-
index 暫存區資料。
切記: 不要手動去修改 .git 資料夾中的內容。
3.2 Git 倉庫的三個區域
-
工作區 (程式碼編輯區)
-
暫存區 (修改待提交區)
-
版本庫(程式碼儲存區)
4 Git 基礎命令總結
4.1 初始化配置
git 工具安裝完成之後,要先進性一次初始化配置;只配置一次集合,以後不需要配置。
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
如果要查詢配置的情況,可以使用以下命令:
git config -l
4.2 倉庫初始化
git init
每個專案都要進行一個倉庫初始化,通過倉庫的初始化可以建立與該專案對應的倉庫。
會在當前的目下建立一個 .git
目錄,.git
目錄是個·隱藏檔案,該目錄就是倉庫目錄。
4.3 檢視狀態
git status
4.4 新增暫存區
git add <file> # 新增指定檔案到暫存區
git add -u # 提交所有被刪除或被修改的檔案到暫存區(不包括新增檔案)。
git add . # 提交所有修改和新建的檔案到暫存區(不包括刪除的檔案)。
git add -A # 提交所有被刪除、被替換、被修改和新增的檔案到暫存區。 推薦!!!
4.5 提交版本庫
git commit -m '註釋資訊' # 提交暫存區到版本庫並註釋。
git commit -a -m '註釋' #一步新增且提交修改。(新增的檔案不會提交)
4.6 檢視暫存前後具體的變化
git diff # 檢視工作區(沒有新增快取的)和版本庫的差異 (不會顯示新新增的檔案)
git diff --cached # 檢視暫存區和版本庫的差異
4.7 撤銷修改和撤銷暫存
git resotre <file> # 撤銷工作區中的修改,指定檔案,會與版本庫對比 (無法撤銷新增的檔案)
git restore . # 撤銷工作區中所有的修改;會與版本庫對比 (無法撤銷新增的檔案)
git restore --staged <file> # 指定檔案,把修改從暫存區撤銷
git restore --staged . # 把所有修改從暫存區撤銷
# 舊的 git 命令
git checkout -- <file> # 同 git restore <file> 作用一致
git checkout -- . # 同 git restore . 作用一致
4.8 歷史版本回滾
① 檢視歷史版本號
git log # 檢視所有歷史版本號
git log -n # 查詢最近的前 n 次提交的版本號;n 是數字。
git log --oneline # 查詢所有歷史版本號,在一行顯示;版本號只顯示前七位
git reflog # 檢視包括已刪除的版本在內所有的歷史版本號!
② 通過指定版本號回滾
git reset --hard b815fd5a6ae655b521a31a9
注意:
進行版本回退時,不需要使用完整的 commitId(版本號),前七位即可。
版本切換之前,要提交當前的修改狀到倉庫。
③ 快捷回滾
git reset --hard HEAD^ # 恢復到上個版本
git reset --hard HEAD^^ # 恢復到上上個版本
git reset --hard HEAD^^^ # 恢復到上上上個版本
5 忽略檔案
5.1 被忽略的檔案
專案目中有些檔案是不需要進入版本庫中,比如編輯器的配置。
忽略檔案的原則是:
-
忽略作業系統自動生成的檔案,比如縮圖等;
-
忽略編譯生成的中間檔案、可執行檔案等,也就是如果一個檔案是通過另一個檔案自動生成的,那自動生成的檔案就沒必要放進版本庫,比如 Java 編譯產生的
.class
檔案; -
忽略你自己的帶有敏感資訊的配置檔案,比如存放口令的配置檔案。
5.2 設定忽略檔案 .gitignore
在該檔案中配置想要忽略的檔案
該檔案可以放在專案內的任意目錄下,放在哪個目錄只對哪個目錄以及子目錄進行設定。
通常,忽略檔案放在專案目錄下。
5.3 忽略檔案的語法
-
空格不匹配任意檔案,可作為分隔符,可用反斜槓轉義。(空格沒意義)
-
#
開頭的檔案標識註釋,可以使用反斜槓進行轉義。 -
!
開頭的模式標識否定,該檔案將會再次被包含,如果排除了該檔案的父級目錄,則使用!
也不會再次被包含。可以使用反斜槓進行轉義。 -
/
結束的模式只匹配目錄以及在該目錄路徑下的內容。(不加也可以) -
/
開始的模式匹配當前目錄下的,(.gitignore
檔案所在的目錄) -
**
匹配多級目錄,可在開始,中間,結束。 -
*
匹配任意數量的任意字串。 -
?
通用匹配單個字元。 -
[]
通用匹配單個字元列表。
以用git check-ignore <file>
命令檢查 .gitignore
檔案格式是否正確。
git check-ignore .gitignore
5.4 忽略檔案配置示例
# 忽略 readme.md 檔案 (目錄下自己子目錄所有的 readme.md)
readme.md
# 忽略當前目錄下的 readme.md
/readme.md
# 忽略所有以 html 為字尾的檔案
*.html
# 忽略當前目錄下 以 html 為字尾的檔案
/*.html
# 忽略目錄
configs/
# 忽略當前目錄下的 指定目錄
/configs/
# 忽略所有的 以html為字尾的檔案,除了 index.html
*.html
!index.html
# ? 匹配一個任意字元; * 匹配任意數量的任意字元
??.html
# .html 的前面只能有一個字元,該字元可以是 a、b或c
[abc].html
# 忽略 static 目錄下的 以html為字尾的檔案(只是static目錄下,不包括子目錄)
static/*.html
# 忽略 static 下以及子目錄下 以 html 為字尾的檔案
static/**/*.html
6 Git 分支
6.1 分支介紹
分支並非 Git 的專利,幾乎所有的版本控制系統都以某種形式支援分支。
使用分支意味著你可以把你的工作從開發主線上分離開來,以免影響開發主線。
6.2 分支操作
① 建立分支
git branch <nmae>
② 切換分支
git switch <nmae>
# 或者
git checkout <name>
③ 建立並切換到該分支
git switch -c <name>
# 或者
git checkout -b <name>
④ 檢視分支
git branch
⑤ 刪除分支
git branch -d <name> # 分支能被刪除的前提是,以及合併到了其他分支
git branch -D <name> # 強制刪除分支
⑥ 合併分支
git merge <name> # 把指定的分支合併到當前分支
git merge <name1> <name2> <name3> # 合併多個分支到當前分支
把 shopcart 分支合併到 dev 分支,本質會在 dev 分支上做一次提交。
shopcart 在合併到 dev 之前,一定要把自己的修改都提交的。
6.3 合併分支衝突解決
發生衝突的原因: 兩個分支對同一個檔案進行了修改,合併的時候必然衝突。
解決衝突: 合併之後,處於 mergeing
狀態,手動修改程式碼解決衝突,新增並提交。
7 GitHub - Git 遠端倉庫
7.1 GitHub 介紹
Hub 是一個程式碼倉庫的託管平臺,因為只支援 Git 作為唯一的版本庫格式進行託管,故名 GitHub。可以建立遠端中心倉庫,為多人合作開發提供便利。
目前,其註冊使用者已經超過 350 萬,託管版本數量也是非常之多,其中不乏知名開源專案 Ruby on Rails、jQuery、python等。
2018 年 6 月 4 日,微軟宣佈,通過 75 億美元的股票交易收購程式碼託管平臺 GitHub。
網址:
從搜尋框,輸入,可以檢視星數十萬以上,會從高到低排列
stars:>100000
7.2 GitHub 使用流程
① 場景一: 本地有倉庫 遠端沒有倉庫
-
註冊並登陸 GitHub 賬號。
-
在GitHub上,建立遠端倉庫。
-
獲取遠端倉庫的地址。
-
本地配置遠端倉庫的地址
git remote add origin https://github.com/unclealan/test2.git # 如果地址新增錯了,需要刪除再重新新增 git remote rm origin # 刪除 origin
origin 相當於 地址的別名
-
本地提交(保證在進行同步之前,本地已經提交)
-
向遠端倉庫推送
git push -u origin master
-u origin
可以記錄遠端倉庫的地址,以後推送的的時候只執行git push
即可master 表示提交到遠端倉庫的 master 分支。
② 場景二: 本地沒倉庫 遠端有倉庫
-
註冊並登陸 GitHub 賬號。
-
獲取遠端倉庫的地址。
-
把遠端倉庫克隆到本地
git clone https://github.com/unclealan/test2.git
-
本地可以進行
push
操作以及pull
操作。 無需再指定地址,因為克隆的時候自動指定了。
7.3 多人合作
① 建立組織配置許可權
首頁 -> 右上角 `+` 號 -> new Organization 免費計劃 填寫組織名稱和聯絡方式(不用使用中文名稱) 邀請其他開發者進入組織(會有郵件邀請,==如收不到,請檢視垃圾箱==) 配置組織許可權,組織首頁右側 settings -> Member privileges -> 選擇 write
② 多人合作工作流程
第一天:
1. 克隆遠端倉庫 2. 進行本地操作,修改程式碼,新增提交,分支操作 3. 下班之前 先 git pull 4. 最後 git push
推送的時候一定先拉取。
如果遠端倉庫的版本比本地版本高,是無法推送的。所以一定先拉取。
第二天:
1. 早上 git pull 2. 進行本地操作 3. 下班之前 先 git pull 4. 最後 git push
③ 衝突解決
衝突原因: 兩個人向同一個分支提交,修改了相同的檔案; 第一推送的會成功推送,第二個人在拉取的時候就會報錯。
解決衝突: 手動修改程式碼,再次新增提交(遠端倉庫的分支就可以合併到本地分支)。
7.4 GitHub 免密登入
-
在本地建立金鑰對
ssh-keygen -t rsa -C "[email protected]"
-
檔案預設儲存在家目錄(c:/使用者/使用者名稱/.ssh)的 .ssh 資料夾中。
-
id_rsa 私鑰
-
id_rsa.pub 公鑰
-
-
將公鑰(.pub)檔案內容配置到賬號中
首頁 -> 右上角頭像-> settings -> SSH and GPG keys -> new SSH Key
-
使用 git 協議的遠端倉庫地址
[email protected]:unclealan/Myproject03.git
-
以後就可以免密操作
8 GitFlow - Git 開發流程
-
Master 主分支。上面只儲存正式釋出的版本
-
Hotfix 線上程式碼 Bug 修復分支。開發完後需要合併回Master和Develop分支,同時在Master上打一個tag
-
Feather 功能分支。當開發某個功能時,建立一個單獨的分支,開發完畢後再合併到 dev 分支
-
Release 分支。待發布分支,Release分支基於Develop分支建立,在這個Release分支上測試,修改Bug
-
Develop 開發分支。開發者都在這個分支上提交程式碼