1. 程式人生 > 其它 >Git配置管理工具

Git配置管理工具

Git配置管理工具

一、入門

1. 簡介

Git是一個分散式版本管理系統(VCS),最早由Linux之父Linus使用C語言開發,主要有以下四個概念:

  • Workspace:工作區,即工作目錄
  • Index / Stage:暫存區,指.git目錄下的index檔案
  • Repository:倉庫區或本地倉庫,就是工作目錄下的隱藏目錄.git
  • Remote:遠端倉庫,一般是程式碼託管平臺上或伺服器上搭建的的倉庫

2. 安裝

  1. 檢視git
    命令列輸入git檢視是否已安裝git

  2. 安裝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入門示例

  1. 建立倉庫

    1. 新建空目錄gitdemo,並進入到gitdemo
    2. 命令列輸入git init
      命令初始化倉庫。這時該目錄下會多出一個.git隱藏目錄
  2. 編輯檔案
    在gitdemo(或其子目錄)下新建文字文件readme.txt,內容如下:

    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    
  3. 新增到倉庫

    1. 命令列輸入如下命令把工作區中的內容新增到暫存區

      git add readme.txt  
      
    2. 命令列輸入如下命令把暫存區中的內容提交到版本庫

      git commit readme.txt -m "the first commit"    
      

二、版本管理

1. 建立倉庫

  1. 進入已有目錄或新建空目錄(推薦)並進入
  2. 使用git init命令初始化倉庫
    注意
    git只能跟蹤文字檔案的變化,例如.txt, .html, .java等;對於二進位制檔案,只能進行管理,無法跟蹤變化,例如.docx, .img等

2. 新增到倉庫

  1. 使用git add <file>命令把工作區中檔案<file>變化新增到暫存區

  2. 使用git commit <file> -m <comment>命令把暫存區中的內容提交到版本庫,其中,-m 引數和後面的說明<comment>可以省略,但為了查詢方便,建議新增說明,例如:

    git commit -m "the fitst commit"  
    

3. 版本回退

  1. 使用git log --pretty=oneline命令按照從近到遠的順序顯示提交歷史,--pretty=oneline引數表示只顯示精簡資訊,可以省略,例如:

    git log  
    
  • 說明
    • HEAD表示最新提交的版本,HEAD^表示上一個提交的版本, HEAD^^表示上上一個提交的版本……依此類推
    • HEAD~<n>表示最新提交之前的第<n>個版本
  1. 使用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. 撤銷修改

  1. 如果已經把變動新增到暫存區,使用git reset HEAD <file>命令撤銷暫存區中的變動
  2. 命令git checkout -- <file>撤銷工作區中檔案<file>的所有變動,回退到最近一次git addgit commit的狀態
    注意
    區分git checkout -- <file>git checkout <branch>

7. 刪除檔案

  1. git rm <file>命令刪除暫存區檔案
  2. 如果要刪除刪除版本庫中的檔案,再執行git commit命令提交暫存區即可
  3. 如果要恢復工作區中的檔案,使用git checkout -- <file>撤銷工作區中的變動(這裡是指刪除)即可

三、遠端倉庫

1. 新增遠端倉庫

  1. 在github或gitee等支援Git的平臺上建立一個倉庫,例如倉庫gitdemo
  2. 使用git remote add origin <repo-name>命令關聯遠端倉庫<remote-repo>,其中,origin是慣用名,可以根據需要更改,例如改為giteegithub
  3. 使用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分支

多人協作

  1. 嘗試git push origin <branch-name>推送自己的變動
  2. 如果推送失敗,使用git pull抓取以合併分支;如果提示no tracking information,則使用git branch --set-upstream-to <branch-name1> origin/<branch-name2>
  3. 如果合併衝突,則解決衝突,並在本地提交
  4. 如果沒有衝突或已經解決了衝突,使用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. 刪除標籤

  1. git tag -d <tag-name>命令刪除標籤<tag-name>
  2. 如果標籤推送到遠端,刪除遠端標籤應再執行命令git push origin :refs/tags/<tag-name>

4. 推送標籤

  • git push origin <tag-name>命令推送標籤到遠端(建立的標籤都在本地,不會自動推送到遠端)
  • git push origin --tags命令推送尚未推送的所有標籤到遠端

六、自定義Git

1. 忽略特殊檔案

  1. 在工作區建立.gitignore檔案,然後把需要忽略的檔名或規則填寫到該檔案中去。該檔案本身需要放到版本庫中進行管理
  2. 使用git status命令檢查上述檔案中的規則是否正確。規則中,*表示匹配所有,!表示不匹配
  3. 如果不正確,使用命令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