Github學習心得
Git簡介
Git是一個開源的分散式版本控制系統,可以有效、高速地處理從很小到非常大的專案版本管理,也是[Linus Torvalds](https://baike.baidu.com/item/Linus Torvalds/9336769)為了幫助管理Linux核心開發而開發的一個開放原始碼的版本控制軟體。
可以前往Git官網(https://git-scm.com)安裝對應系統的Git
安裝成功後進入終端(Terminal),鍵入git --version
會顯示出對應的git版本資訊
Git運作的整體架構
Git本地的三個工作區域,工作空間(Working Space)、暫存區(Stage/Index)、本地倉庫(Repository/Git Repository)。若再加上遠端倉庫(Remote Directory),大致關係如上圖所示
- Workspace:工作區,程式碼增刪修改即時更改的區域
- Index/Stage:暫存區,用來臨時更改工作區的程式碼改動,本質上是一個檔案(可以視為多個檔案二進位制碼集合成的一個黑盒子)
- Repository:本地倉庫,存放本地commit內容的位置(存在多個歷史記錄的版本),其中HEAD預設指向了最新放入倉庫的commit
- Remote:遠端倉庫,遠端託管程式碼的伺服器是實現多人快速搭建專案的核心
暫存區和本地倉庫儲存內容都在倉庫目錄下的.git
隱藏資料夾下
配置指令
git config --list
檢視當前git配置
git本地倉庫配置預設儲存在使用者目錄\.gitconfig
檔案下
git系統使用者配置預設儲存在Git安裝目錄\etc\gitconfig
下
可以採用以下方式進行使用者的名稱以及郵箱配置
git config [--global] user.name [使用者名稱稱]
git config [--global] user.email [使用者郵箱]
git config -l # 檢視配置
git config --[global/system] --list
每次git進行提交時都會使用該資訊
工作流程
- 工作空間新增修改刪除檔案
- 將需要進行版本管理的檔案放入暫存區
- 將暫存區檔案提交到git本地倉庫
Git 倉庫搭建
專案搭建
-
建立新專案
-
建立專案的目錄(即對應的資料夾,最好不要包括中文)
-
進入目錄後,輸入
git init
-
-
克隆已有專案
- 輸入
git clone [url]
該url可以從任意遠端倉庫中獲取,如下圖為Github與Gitee中獲取倉庫連結的地方
- 輸入
Git檔案操作
檔案狀態
- Untraked:未跟蹤狀態,此刻並沒有被加入到git倉庫,可以通過
git add
使它的狀態變為Staged - Unmodify:如果這個檔案在庫中留有副本,且這與本地庫中一致 則為該狀態,此時可以使用對它修改使其變為Modified,也可以使用
git rm
使其重新變為Untracked(如果此時add,不會使其變為Staged) - Modified:如果這個檔案在庫中留有副本,且這與本地庫中不一致 則為該狀態,可以使用
git checkout
用本地庫的檔案代替工作區檔案(可以看作修改的一種撤銷操作)使其狀態變為Unmodify,也可以使用git add
使其狀態變為Staged - Staged:暫存狀態,可以使用
git commit
將暫存區內容提交到本地庫中,使得檔案變為Unmodify,或者使用git reset HEAD [檔名稱]
讓暫存區內容回滾(相當於從未add過了),使得該檔案變為Modify
忽略檔案
建立.gitignore
檔案,使得一些檔案不被納入版本控制範圍(例如使用git add .
命令時)、
檔案規則
#
為註釋符- 可以使用 linux萬用字元
!
代表例外規則,指該檔案符合已指定規則,但不想被忽略(即優先順序高於指定規則)/
放在最前面,表示忽略指定路徑下的檔案/
放在最後面,表示忽略該目錄下的子目錄內的檔案
Git命令
工作區操作
HEAD
往往指向當前所在分支中的最後一次commit
,Head^^^...
代表過去前的第X個版本,X等同於^的數量
git checkout [檔案1] [檔案2]... # 恢復暫存區檔案到工作區
git checkout [commithash] [檔案1]... # 將指定commit的檔案恢復到工作區
git reset --hard # 同時重置HEAD,暫存區與工作區
git reset --mixed # 同時重置HEAD,暫存區(預設)
git reset --soft # 只重置HEAD
git diff # 檢視暫存區與工作區的不同
git diff --cached # 檢視暫存區與HEAD的不同
git diff HEAD # 檢視工作區與HEAD的不同
git diff [commithash] # 將工作區內容與某次commit進行比較
如果名稱\(a\)既是某個分支名,又是某個檔名,需要使用--
來說明這是一個檔案路徑
暫存區管理
git add [檔案1] [檔案2] ... # 向暫存區中新增指定檔案
git add [目錄1] [目錄2] ... # 向暫存區中新增指定目錄
git add . # 向暫存區新增當前目錄下所有檔案
git rm [檔案1] [檔案2] ... # 向暫存區中新增指定檔案
git rm --force # 強制刪除
git rm --cached # 刪除暫存區中的檔案,但不對工作區改動
git mv [Source] [Destination] # 移動檔案
git status # 檢視暫存區狀態
本地庫操作
git commit -m [備註資訊] # 提交暫存區到本地倉庫
git commit -a # 可以把未進行add命令的修改一併提交到本地庫
git commit # 可以用編輯器對此次提交進行更細緻的備註
git commit 規範
<type>(<scope>): <subject>
// 空行
<body>
// 空行
<footer>
type一般包括
- feat 新功能
- fix 補修bug
- docs 修改文件
- style 格式化程式碼結構(不影響原始碼正常執行)
- refactor 重構程式碼(更改程式碼,但邏輯結構與原有結構一致)
- chore 構建過程或輔助工具改動
分支管理
git branch [新分支名] # 建立新分支
git branch -v # 顯示本地所有分支
git branch -r # 顯示遠端所有分支
git branch -a # 顯示本地遠端所有分支
git branch -d [分支名] # 刪除指定分支 D為強制刪除
git checkout [分支名] # 切換到指定分支
git checkout -b [新分支名] # 建立並切換到新分支
git merge [分支名] # 合併指定分支到當前分支
分支切換時,對應的工作區和暫存區也會被切換
衝突處理
可以參考部落格(https://blog.csdn.net/qq_27905183/article/details/78575247)
遠端庫操作
git clone [遠端庫地址] # 將遠端庫克隆到本地目錄下
git fetch [遠端庫地址] # 獲取遠端庫所有改動
git pull [遠端地址別名] [本地分支名] # 等同於fetch+merge
git remote -v # 顯示遠端地址別名
git remote add [遠端地址別名] [遠端地址] # 新增遠端地址
git push [遠端地址別名] [本地分支名] # 上傳本地分支到遠端倉庫
git push --force # 強制推送
git push -all [遠端地址別名] # 將本地所有分支推送到遠端倉庫
Git track
其實在從遠端分支分出來的分支都是跟蹤分支(track),當對該分支進行 push 和 pull 時,如果該分支和遠端分支同名,git會知道推送到遠端哪個分支,從哪個遠端分支同步到本地分支。每次克隆一個倉庫時,本地都會新建一個master
分支來track 遠端的origin/master
。如果不同名,我們需要人為指定 git push origin branch_name
Github
Gitee類似,且為中文這裡就不詳細介紹了
是一個開源且免費的遠端倉庫,可以託管程式碼,便於實現專案的團隊開發
建立遠端倉庫
點選New repository
建立自己的遠端倉庫
設定倉庫屬性
在Repository name
中可以設定自己的遠端倉庫名稱,Description
中新增對於倉庫的描述,Public/Private
決定了倉庫內容是否被公開(Private的倉庫不可以設為靜態網頁供他人訪問)
常常還會✔上Add a README file
為自己的倉庫建立一個介紹文件,讓訪問者更加迅速、便捷地瞭解到專案內容
設定繫結本機SSH金鑰
這步可以實現免密碼登入,當本機與遠端倉庫進行檔案傳輸時,遠端伺服器會用已儲存的公鑰進行檢測,如果有匹配的私鑰則可以免密傳輸
生成SSH金鑰
預設金鑰生成在本地使用者目錄\.ssh
下
其中私鑰為id_rsa
,公鑰為id_rsa.pub
ssh-keygen -t rsa # 生成本機ssh金鑰
之後一路點選回車即可
下圖是Github與Gitee中新增SSH公鑰的皮膚(新增id_rsa.pub
中內容)