Git配置管理工具
Git配置管理工具
一、入門
1. 簡介
Git是一個分散式版本管理系統(VCS),最早由Linux之父Linus使用C語言開發,主要有以下四個概念:
- Workspace:工作區,即工作目錄
- Index / Stage:暫存區,指
.git
目錄下的index
檔案 - Repository:倉庫區或本地倉庫,就是工作目錄下的隱藏目錄
.git
- Remote:遠端倉庫,一般是程式碼託管平臺上或伺服器上搭建的的倉庫
2. 安裝
-
檢視git
命令列輸入git
檢視是否已安裝git -
安裝git
-
Windows/Mac
在Git官網下載安裝程式,然後按照提示安裝即可 -
Linux
命令列輸入:sudo apt-get install git
-
3. 配置
命令列輸入:
git config --global user.name <user-name>
git config --global user.email <user-email>
其中,<user-name>
是使用者名稱,<user-email>
是使用者郵箱
-
說明
-
--system
引數將配置應用於所有使用者 -
--global
引數將配置應用於本使用者 -
--local
引數將配置應用於本倉庫
-
4. git入門示例
-
建立倉庫
- 新建空目錄gitdemo,並進入到gitdemo
- 命令列輸入
git init
.git
隱藏目錄
-
編輯檔案
在gitdemo(或其子目錄)下新建文字文件readme.txt,內容如下:Git is a distributed version control system. Git is free software distributed under the GPL.
-
新增到倉庫
-
命令列輸入如下命令把工作區中的內容新增到暫存區
git add readme.txt
-
命令列輸入如下命令把暫存區中的內容提交到版本庫
git commit readme.txt -m "the first commit"
-
二、版本管理
1. 建立倉庫
- 進入已有目錄或新建空目錄(推薦)並進入
- 使用
git init
命令初始化倉庫
注意
git只能跟蹤文字檔案的變化,例如.txt, .html, .java等;對於二進位制檔案,只能進行管理,無法跟蹤變化,例如.docx, .img等
2. 新增到倉庫
-
使用
git add <file>
命令把工作區中檔案<file>
的變化新增到暫存區 -
使用
git commit <file> -m <comment>
命令把暫存區中的內容提交到版本庫,其中,-m
引數和後面的說明<comment>
可以省略,但為了查詢方便,建議新增說明,例如:git commit -m "the fitst commit"
3. 版本回退
-
使用
git log --pretty=oneline
命令按照從近到遠的順序顯示提交歷史,--pretty=oneline
引數表示只顯示精簡資訊,可以省略,例如:git log
-
說明
-
HEAD
表示最新提交的版本,HEAD^
表示上一個提交的版本,HEAD^^
表示上上一個提交的版本……依此類推 -
HEAD~<n>
表示最新提交之前的第<n>
個版本
-
-
使用
git reset --hard <version>
命令回退到<version>
標識的版本,其中<version>
可以用HEAD
格式表示,也可以用<commit id>
表示(可以不寫全),例如回退到上一個版本(9bd243df8476a7b4e1a6eba21f2433789a79e673
標識的版本):git reset --hard HEAD^
或
git reset --hard 9bd243
-
說明
-
使用
<commit id>
可以回退版本,也可以在回退後恢復到回退前的版本,例如,如果當前已經回退到9bd243df8476a7b4e1a6eba21f2433789a79e673
所標識的版本之前,恢復到該版本可以使用如下命令:git reset --hard 9bd243
-
如果忘記了
commit id
,可以使用git reflog
命令檢視命令歷史
-
4. 檢視狀態
git status
命令檢視狀態資訊
5. 檢視區別
git diff <version> -- <file>
命令顯示版本庫中<version>
標識的版本和工作區中版本的差別,例如顯示版本庫中readme.txt的最新版本和工作區中版本的差別
git diff HEAD -- readme.txt
6. 撤銷修改
- 如果已經把變動新增到暫存區,使用
git reset HEAD <file>
命令撤銷暫存區中的變動 - 命令
git checkout -- <file>
撤銷工作區中檔案<file>
的所有變動,回退到最近一次git add
或git commit
的狀態
注意
區分git checkout -- <file>
和git checkout <branch>
7. 刪除檔案
-
git rm <file>
命令刪除暫存區檔案 - 如果要刪除刪除版本庫中的檔案,再執行
git commit
命令提交暫存區即可 - 如果要恢復工作區中的檔案,使用
git checkout -- <file>
撤銷工作區中的變動(這裡是指刪除)即可
三、遠端倉庫
1. 新增遠端倉庫
- 在github或gitee等支援Git的平臺上建立一個倉庫,例如倉庫gitdemo
- 使用
git remote add origin <repo-name>
命令關聯遠端倉庫<remote-repo>
,其中,origin
是慣用名,可以根據需要更改,例如改為gitee
,github
等 - 使用
git push origin <branch-name>
命令將當前分支推到遠端倉庫的<branch-name>
分支。第一次推送時,-u
引數把本地分支和遠端倉庫分支關聯起來,可以簡化後續使用時的命令
2. 刪除遠端倉庫
git remote rm <remote-repo>
命令刪除遠端倉庫<remote-repo>
,建議刪除前先檢視遠端倉庫資訊
3. 檢視遠端倉庫
-
git remote
命令檢視遠端倉庫的資訊 -
git remote -v
命令檢視遠端倉庫的詳細資訊
4. 克隆遠端倉庫
git clone <remote-repo>
命令克隆遠端倉庫<remote-repo>
到本地
注意
Git執行多種協議,如ssh、https等,推薦使用ssh協議
5. 抓取遠端分支
git pull <remote-repo>
命令抓取遠端倉庫<remote-repo>
到本地
四、分支管理
1. 建立分支
-
git branch <branch-name>
命令建立一個新的分支,名字為<branch-name>
,例如:git branch dev
新版Git可使用
git switch <branch-name>
命令 -
git chechout -b <branch-name>
命令建立並切換到分支<branch-name>
,例如:git checkout -b dev
新版Git可使用命令
git switch -b <branch-name>
-
git checkout -b <branch-name1> origin/<branch-name2>
命令在本地建立與遠端分支<branch-name2>
對應的分支<branch-name1>
,並切換到該分支,建議<branch-name1>
和<branch-name2>
名字相同
2. 切換分支
git chechout <branch-name>
命令切換當前分支為<branch-name>
,例如:
git checkout dev
3. 檢視分支
-
git branch
命令檢視所有分支,其中當前分支前用*
標識 -
git log --graph
命令檢視含有分支合併圖的歷史資訊
4. 合併分支
-
git merge <branch-name>
命令將分支<branch-name>
合併到當前分支,例如:git merge dev
--no-ff
引數表示不使用Fast forward
合併模式,而是使用基礎合併(新的提交),此時建議使用-m
引數指定提交說明 -
注意
-
Fast forward
合併模式是指合併時,將當前分支指標指向待合併分支指標所指的版本 - 合併分支衝突時需要先解決衝突,然後再提交,合併後完成合並
-
-
git cherry-pick <commit id>
命令將<commit id>
標識的版本合併到當前分支,例如:git cherry-pick 9bd243
其中,
9bd243df8476a7b4e1a6eba21f2433789a79e673
是一個版本標識
5. 刪除分支
-
git branch -d <branch-name>
命令刪除分支<branch-name>
,例如:git branch -d dev
-
git branch -D <branch-name>
命令強行刪除分支<branch-name>
,例如:git branch -D dev
6. 關聯分支
git branch --set-upstream-to <branch-name1> origin/<branch-name2>
命令將本地分支<branch-name1>
與遠端分支<branch-name2>
關聯起來
7. rebase
git rebase
命令將交叉分支整理成直線分支
8. 管理未提交分支
-
git stash
命令儲存正在進行的未提交分支的工作現場 -
git stash list
命令檢視儲存的現場 -
git stash apply
命令恢復儲存的現場 -
git stash drop
命令刪除儲存的現場 -
git stash pop
命令恢復並刪除儲存的現場
例如:
一次bug修復前:git stash
bug修復後:
git stash apply git stash drop
或
git stash pop
分支策略
- master分支:非常穩定,僅用來發布新版本,時刻與遠端同步
- dev分支:不穩定,供開發使用,釋出新版本時合併到master分支,時刻與遠端同步
- bug分支:本地修復bug,無需推送到遠端
- other分支:每個人在自己的分支上工作,併合併到dev分支
多人協作
- 嘗試
git push origin <branch-name>
推送自己的變動 - 如果推送失敗,使用
git pull
抓取以合併分支;如果提示no tracking information
,則使用git branch --set-upstream-to <branch-name1> origin/<branch-name2>
- 如果合併衝突,則解決衝突,並在本地提交
- 如果沒有衝突或已經解決了衝突,使用
git push origin <branch-name>
推送
五、標籤管理
1. 建立標籤
-
git tag <tag-name>
命令建立一個標籤<tag-name>
,例如:git tag v1.0.0
-
git tag <tag-name> <commit id>
命令為<commit id>
標識的版本建立標籤<tag-name>
-
git tag -a <tag-name> -m <comment> <commit id>
命令為標籤<tag-name>
指定說明<comment>
2. 檢視標籤
-
git tag
命令檢視標籤,其中標籤按字母順序排列 -
git show <tag-name>
命令檢視標籤說明
3. 刪除標籤
-
git tag -d <tag-name>
命令刪除標籤<tag-name>
- 如果標籤推送到遠端,刪除遠端標籤應再執行命令
git push origin :refs/tags/<tag-name>
4. 推送標籤
-
git push origin <tag-name>
命令推送標籤到遠端(建立的標籤都在本地,不會自動推送到遠端) -
git push origin --tags
命令推送尚未推送的所有標籤到遠端
六、自定義Git
1. 忽略特殊檔案
- 在工作區建立
.gitignore
檔案,然後把需要忽略的檔名或規則填寫到該檔案中去。該檔案本身需要放到版本庫中進行管理 - 使用
git status
命令檢查上述檔案中的規則是否正確。規則中,*
表示匹配所有,!
表示不匹配 - 如果不正確,使用命令
git check-ignore -v <file>
檢查規則
2. 配置別名
-
git config --global alias.<alias> <name>
命令為<name>
配置別名<alias>
,例如:git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
-
.git/config
檔案是Git的配置檔案,[alias]
後是已經配置的別名
檔案忽略原則
- 忽略作業系統自動生成的檔案
- 忽略編譯生成的中間檔案、可執行檔案等
- 忽略自己的帶有敏感資訊的配置檔案
七、常用命令
1. 配置Git
# 顯示配置資訊
$ git config --list
# 編輯配置檔案
$ git config -e [--global]
# 配置使用者資訊
$ git config [--global] user.name [<user-name>]
$ git config [--global] user.email [<user-email>]
2. 新建倉庫
# 當前目錄下新建倉庫
$ git init
# 新建目錄並將其初始化為倉庫
$ git init [<dir>]
# 克隆專案及其提交歷史
$ git clone [<url>]
# 克隆專案及其提交歷史,並指定本地資料夾名稱
$ git clone [<url>] [<dir>]
3. 新增
# 新增指定檔案到暫存區
$ git add [<file1>] [<file2>] ...
# 新增指定目錄及其子目錄到暫存區
$ git add [<dir>]
# 添加當前目錄下所有檔案、資料夾到暫存區
$ git add .
# 分多次提交同一檔案的多處變動,新增每個變動都需要確認
$ git add -p
4. 刪除
# 刪除工作區中指定檔案,並在暫存區記錄本次刪除
$ git rm [<file1>] [<file2>] ...
# 停止追蹤指定檔案,但該檔案仍保留在工作區
$ git rm --cached [<file>]
# 更改檔名,並在暫存區記錄本次變動
$ git mv [<old-name>] [<new-name>]
5. 提交
# 提交暫存區所有內容到倉庫
$ git commit -m [<comment>]
# 提交暫存區的指定檔案到倉庫
$ git commit [<file1>] [<file2>] ... -m [<comment>]
# 提交自上次提交後工作區的變動到倉庫
$ git commit -a
# 提交時顯示所有變動資訊
$ git commit -v
# 替代上一次提交
$ git commit --amend -m [<comment>]
# 重做上一次提交,同時提交指定檔案的變化
$ git commit --amend [<file1>] [<file2>] ...
6. 撤銷
# 恢復暫存區的指定檔案到工作區
$ git checkout [<file>]
# 恢復某次提交中的指定檔案到暫存區和工作區
$ git checkout [<version>] [<file>]
# 恢復暫存區的所有檔案到工作區
$ git checkout .
# 暫存區中的指定檔案重置為上一次提交的版本,但工作區不變
$ git reset [<file>]
# 暫存區與工作區重置為上一次提交的版本
$ git reset --hard
# 當前分支的指標重置為指定提交,並重置暫存區為該提交的版本,但工作區不變
$ git reset [<version>]
# HEAD指標重置為指定提交,同時重置暫存區和工作區為該提交的版本
$ git reset --hard [<version>]
# HEAD指標重置為指定提交,但保持暫存區和工作區不變
$ git reset --keep [<version>]
# 當前分支新建提交,並將指定的版本撤銷到該提交
$ git revert [<version>]
# 儲存並移除未提交的變動
$ git stash
# 儲存的未提交變動移入工作區,但不刪除儲存
$ git stash apply
# 刪除儲存的未提交變動
$ git stash drop
# 儲存的未提交變動移入工作區,並刪除儲存
$ git stash pop
7. 檢視
# 顯示檔案的變化
$ git status
# 顯示檔案變化的簡簡訊息
$ git status -s
# 顯示當前分支的提交歷史
$ git log
# 顯示當前分支的提交歷史和每次提交發生變動的檔案
$ git log --stat
# 圖形化顯示分支合併歷史
$ git log --graph
# 顯示每次提交的tag資訊
$ git log --decorate
# 顯示指定作者的提交歷史
$ git log --author=[<author-name>]
# 顯示根據時間篩選的log資訊
$ git log [--since] [--util] [--before] [--after]
# 根據關鍵詞搜尋提交歷史
$ git log -S [<keyword>]
# 顯示某次提交之前的所有提交說明,每個說明佔一行
$ git log [<tag>] <version> --pretty --oneline
# 顯示某次提交之前符合搜尋條件的所有提交說明
$ git log [<tag>] <version> --grep <condition>
# 顯示某個檔案包括改名在內的提交歷史
$ git log --follow [<file>]
$ git whatchanged [<file>]
# 顯示指定檔案的每一次變動
$ git log -p [<file>]
# 顯示最近n次提交
$ git log -<n> --pretty --oneline
# 顯示所有提交過的使用者,按提交次數排序
$ git shortlog -sn
# 顯示指定檔案的修改者、修改時間、修改內容等歷史資訊
$ git blame [<file>]
# 顯示暫存區和工作區的差異
$ git diff
# 顯示暫存區中指定檔案和上一次提交的差異
$ git diff --cached [<file>]
# 顯示工作區與當前分支最新提交的差異
$ git diff HEAD
# 顯示兩個分支分開後的差異
$ git diff [<version1>]...[<version2>]
# 顯示未提交的變動行數
$ git diff --shortstat "@{0 day ago}"
# 顯示某次提交的元資料和內容變化
$ git show [<version>]
# 顯示某次提交發生變動的檔案
$ git show --name-only [<version>]
# 顯示指定提交中指定檔案的變動內容
$ git show [<version>]:[<file>]
# 顯示當前分支的最近提交
$ git reflog
8. 遠端同步
# 獲取遠端倉庫的所有變動
$ git fetch [<remote-repo>]
# 顯示所有遠端倉庫
$ git remote -v
# 顯示某個遠端倉庫的資訊
$ git remote show [<remote-repo>]
# 增加一個新的遠端倉庫,並命名
$ git remote add [<repo-name>] [<url>]
# 獲取遠端倉庫的變動,並與本地分支合併
$ git pull [<remote-repo>] [<branch-name>]
# 推送本地指定分支到遠端倉庫
$ git push [<remote-repo>] [<branch-name>]
# 強行推送當前分支到遠端倉庫
$ git push [<remote-repo>] --force
# 推送所有分支到遠端倉庫
$ git push [<remote-repo>] --all
9. 分支管理
# 顯示所有本地分支
$ git branch
# 顯示所有遠端分支
$ git branch -r
# 顯示所有本地分支和遠端分支
$ git branch -a
# 新建一個分支但不切換分支
$ git branch [<branch-name>]
# 新建一個分支並切換到該分支
$ git checkout -b [<branch-name>]
# 新建一個指向指定提交的分支
$ git branch [<branch-name>] [<version>]
# 新建一個分支並與指定的遠端分支建立聯絡
$ git branch --track [<branch-name>] [<remote-branch>]
# 切換到指定分支,並更新工作區
$ git checkout [<branch-name>]
# 切換到上一個分支
$ git checkout -
# 本地分支與指定的遠端分支建立聯絡
$ git branch --set-upstream [<branch-name>] [<remote-branch>]
# 合併指定分支到當前分支
$ git merge [<branch-name>]
# 合併指定提交到當前分支
$ git cherry-pick [<version>]
# 刪除分支
$ git branch -d [<branch-name>]
# 刪除遠端分支
$ git push origin --delete [<branch-name>]
$ git branch -dr [<remote/branch>]
10. 標籤管理
# 顯示所有tag
$ git tag
# 為當前提交新建一個tag
$ git tag [<tag>]
# 為指定提交新建一個tag
$ git tag [<tag>] [<version>]
# 刪除本地tag
$ git tag -d [<tag>]
# 刪除遠端tag
$ git push origin :refs/tags/[<tag>]
# 檢視tag資訊
$ git show [<tag>]
# 提交指定tag
$ git push [<remote-repo>] [<tag>]
# 提交所有tag
$ git push [<remote-repo>] --tags
# 新建一個分支,指向某個tag
$ git checkout -b [<branch-name>] [<tag>]
11. 其他
# 生成一個可供釋出的壓縮包
$ git archive