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用暫存區或某次commit的文件代替工作區文件(可以看作修改的一種撤銷操作)使其狀態變為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 checkout --track [遠程地址別名] [遠程地址] # 創建本地同名分支,並track該遠程分支
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 push --set-upstream [遠程地址別名] [遠程地址] # 同時設置track的遠程分支
git push -u [遠程地址別名] [遠程地址] # 有多個track的遠程分支時,設置默認push的遠程分支
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中內容)


