Git常用功能總結
Git基礎
使用者名和郵箱配置
$ git config [--global] user.name = <username>
$ git config [--global] user.email = <useremail>
- 如果省略
選項,配置隻對目前倉庫生效--global
- 否則就對目前使用者的所有倉庫有效
- 就近原則,本地配置比全局配置的優先級更高
擷取幫助
擷取詳細幫助資訊
$ git help <cmd>
$ git <cmd> --help
$ man git-<cmd>
擷取簡略幫助資訊
将上面的三個指令的
help
替換成
h
即可獲得簡略資訊
擷取倉庫的兩種方式
初始化一個目錄為一個新的倉庫
- 在某一目錄執行以下指令,便可将該目錄轉變成一個Git倉庫
$ git init
- 指令執行之後會生成一個
檔案夾.git
克隆一個已經存在的倉庫
- 使用以下指令克隆一個倉庫
- 其中
為需要克隆的倉庫的位址,<url>
是可選的,即克隆到本地的倉庫的名字,如果沒有這一選項,就在本地建立一個和克隆處名字一樣的本地庫<name>
記錄每次更新到Git倉庫
檢視檔案狀态
$ git status
暫存建立或者是已修改的檔案
- 其後也可以是一個目錄
- 如果是目錄,就遞歸地将目錄中的已修改的檔案暫存到暫存區
狀态簡覽
- 使用
指令的狀态結果可能略顯繁瑣git status
- 我們可以使用
或者是--short
選項,使得輸出簡化-s
$ git status -s
忽略檔案 .gitignore
.gitignore
可以在倉庫根目錄之下建立一個
.gitionore
檔案,在其中指定不進行版本管理的檔案
檔案差異對比
工作區和暫存區的檔案差異的對比
- 其中
是可選的,如果沒有,就會輸出所有的檔案的差異<filename>
本地庫和暫存區的檔案差異對比
工作區和本地庫的最新版的檔案差異對比
送出更新
- 在編輯器中輸入送出資訊
$ git commit
- 該指令會将暫存區中的檔案一次性全部送出到本地庫
- 使用
選項攜帶送出資訊-m
- 跳過使用暫存區域
- 該指令會将**已跟蹤**的檔案全部暫存然後一次性送出
- 對于**未跟蹤**檔案,不會進行暫存和送出
移除檔案
- 将三個區中的檔案進行移除
- 保留工作區中的檔案
- 工作區和本地庫版本不一緻的檔案,需要使用
選項進行強制删除-f
- 對于未追蹤的檔案,不能使用該指令,實際上直接使用
指令删除就行了rm
移動或者重命名檔案
這相當于
$ mv <from_file> <to_file>
$ git rm <from_file>
$ git add <to_file>
檢視送出曆史
git log
- 常用的選項
選項 說明 -p 按更新檔格式顯示每個送出引入的差異 -n 僅輸出最近的n條送出記錄 –stat 顯示送出的檔案修改的統計資訊 –shortstat 隻顯示–stat中最後的行數添加删除統計 –name-only 僅在送出資訊後顯示已修改的檔案清單 –name-status 顯示新增、修改和删除的檔案清單 –abbrev-commit 僅顯示SHA-1校驗和的前幾個字元 –relative-date 使用較短的相對時間而不是完整的日期格式顯示日期 –graph 在日志旁使用ASCII圖形顯示分支與合并曆史 –pretty 自定義日志的輸出顯示格式 –oneline –pretty=oneline --abbrev-commit合用的簡寫 - 限制日志輸出長度的常用選項
選項 說明 –author 隻顯示指定作者修改的送出記錄 –grep 隻顯示送出說明中包含–grep選項指定的關鍵字的送出記錄 -num 隻顯示最後的num個送出記錄 –since or --after 隻顯示指定日期之後的送出記錄 –until or --before 隻顯示指定日期之前的送出記錄 –committer 隻顯示指定送出者送出的記錄 -S 隻顯示檔案資料中添加或者是删除了包含-S選項指定的字元串的送出記錄
撤銷操作
修補送出
- 送出之後想要修改送出資訊,不修改檔案内容
$ git commit --amend
- 執行該指令之後Git會讓你重新輸入送出資訊,然後覆寫上一次送出的資訊
- 不僅修改送出資訊,還修改實際的送出内容
- 先對檔案進行修改
- 再執行下面的指令
$ git commit --amend
- 最後就會使用新的送出覆寫掉上一次的送出
- 僅修改送出内容,不修改送出資訊
$ git commit --amend --no-edit
版本回退
僅移動 HEAD
以及其所指的分支
HEAD
$ git reset --soft HEAD~/HEAD^n
- 一個
号表示回退一個版本~
-
的^n
表示回退的版本數n
将 HEAD
所指向的分支指向的送出版本的檔案複制到暫存區中
HEAD
$ git reset [--mixed] HEAD~/HEAD^n
覆寫工作區的内容
$ git reset --hard HEAD~/HEAD^n
取消暫存的檔案
- 這實際上就是使用
所指向的分支的目前送出的版本的HEAD
覆寫暫存區中的相應檔案<file>
壓縮
- 在我們進行了一次送出之後,再次對檔案進行修改
- 然後執行如下指令
$ git reset --soft HEAD~
- 然後再執行
$ git commit
- 就相當于将上一次的送出給覆寫了。當然,實際上那個送出依然存在
引用日志
使用如下指令可以檢視引用日志
$ git reflog
根據引用日志可以傳回到更新的版本
- 使用引用日志指令,找到想要到的指定版本的校驗和
- 執行如下指令
- 就可以回到前面的版本
檢出(checkout)
不帶路徑(切換分支)
- 将
指向HEAD
<point>
帶路徑(撤銷對檔案的修改)
- 實際上就是不移動
,而是将HEAD
所指的分支目前指向的送出版本的HEAD
覆寫暫存區中的對應檔案,同時覆寫工作區中的對應檔案<file>
遠端倉庫的使用
遠端倉庫檢視
- 檢視遠端庫清單
$ git remote
- 檢視遠端庫清單的詳細資訊
$ git remote -v
添加一個遠端庫
-
是遠端庫的簡寫名稱<name>
-
是遠端庫的具體位址<url>
抓取遠端庫的資料到本地
-
遠端庫的簡稱<name>
-
遠端庫的具體位址<url>
合并資料到本地分支
- 該指令将遠端庫
的<name>
分支的内容合并到目前的分支上<branch>
拉取遠端庫上的指定分支的内容
-
為遠端庫的簡稱<name>
- 要使用該指令,必須先将本地庫的目前分支與遠端庫的分支進行關聯
- 該指令會将遠端庫上的内容下載下傳到本地并将和目前分支關聯的遠端分支與目前分支進行合并
推送到遠端庫
-
是遠端庫的名稱<name>
-
實際上可以是其他分支<master>
檢視某個遠端倉庫
-
為遠端倉庫名<name>
遠端倉庫重命名
- 該指令也就是更改本地對于遠端庫的稱呼,并非将遠端倉庫的倉庫名字改了
遠端倉庫的移除
- 該指令隻是将和遠端倉庫關聯的遠端倉庫簡寫名稱從本地删除了,也就是說以後我們的倉庫不能再連接配接相應的遠端庫了,而不是說我們真的把一個倉庫從遠端伺服器上移除了
打标簽
列出标簽清單
- 列出所有标簽
$ git tag
- 列出滿足一定條件的标簽
-
為一個篩選條件,可以是一個正規表達式<regex>
-
建立标簽
建立附注标簽
-
為标簽名<tagName>
-
為标簽資訊<msg>
檢視标簽資訊以及打标簽的送出的送出資訊
建立輕量标簽
附注标簽和輕量标簽的差別
附注标簽附帶這标簽資訊,輕量标簽沒有标簽資訊。輕量标簽就相當于一個簡單的标記。
補打标簽
這個和為目前版本的送出打标簽類似,不過就是再最後增加一項,也就是想要打标簽的送出的校驗和(或者部分檢驗和)
共享标簽
- 将某一個标簽顯示推送到遠端伺服器
-
為遠端庫名稱<remote>
-
為要推送的标簽名<tagname>
-
- 将所有标簽一次性全部推送到遠端伺服器
$ git push <remote> --tags
删除标簽
删除本地标簽
删除共享到遠端伺服器上面的标簽
- 第一種方式
- 更直覺的方式
檢出标簽
- 這實際上就是将
指向HEAD
所指向的送出<tagname>
- 這回導緻倉庫處于頭指針分離狀态
- 在這種狀态下,我們如果要進行新送出,一般要先建立一個分支
Git别名
為Git内部的指令起别名
- 其中,如果有
,那麼這個指令的别名就會在整個目前使用者都有效,這些配置檔案在Git的全局配置檔案中[--global]
- 如果沒有
,那麼這個别名就隻在本倉庫生效,配置資訊在目前倉庫的[--global]
檔案夾下的.git
檔案中.gitconfig
-
為指令别名<title>
-
為要起别名的具體指令<cmd>
為Git外部的指令起别名
- 可以看出,和為内部指令起别名的差別就是要在外部指令前添加一個
号!
Git 分支
檢視目前倉庫的所有分支
$ git branch
分支的建立
建立分支
切換分支
或者是
建立并切換分支
或者是
檢視各分支所指向的送出對象
$ git log --decorate
檢視各分支的更加詳細資訊
$ git log --oneline --decorate --graph --all
分支的合并
-
表示要并入的主分支<master>
-
表示要被合并的分支<dev>
- 就是要将
的内容合并到<dev>
<master>
- 如果省略
分支,預設将<master>
分支合并到目前分支<dev>
分支的删除
- 删除已經進行了合并的分支
- 删除一個還沒有和其他分支進行合并的分支
-
表示強制删除-D
-
分支合并産生沖突的解決辦法
-
檢視沖突的檔案git status
- 對于有沖突的檔案進行手動修正
-
将沖突檔案暫存git add
-
将暫存的檔案進行送出git commit
- 合并完成
分支管理
列出所有分支
$ git branch
檢視每一個分支的最後一次送出資訊
$ git branch -v
檢視已經和指定分支進行了合并的分支
- 如果省略後面的分支名,則預設為目前分支
檢視還沒有和指定分支進行過合并的分支
遠端分支
擷取遠端引用(包括分支、标簽等)的完整清單
或者是
将分支推送到遠端庫上
遠端庫分支和本地分支名字相同
給遠端分支起名字
本地分支和遠端分支的合并
和已有分支合并
- 将
分支合并到<remote>/<remoteBranch>
分支<localBranch>
- 若預設本地分支名稱,預設為目前分支
基于遠端分支建立一個本地分支
- 這相當于建立的分支的起點和遠端分支的一緻
- 這實際上就建立了一個跟蹤分支
<newBranch>
跟蹤分支
跟蹤分支就是和遠端分支關聯起來了的本地分支。在一個跟蹤分支上面執行
pull
指令,Git會抓取到正确的遠端分支的内容,然後自動合并到跟蹤分支上。
建立跟蹤分支
- 正常建立方法
- 建立一個和遠端分支同名的跟蹤分支
設定跟蹤分支
- 設定目前分支為跟蹤分支,其上遊分支為
<remote>/<branch>
上遊快捷方式
可以使用
@{u}
或者是
@{upstream}
來引用跟蹤分支的上遊分支
檢視所有的跟蹤分支
$ git branch -vv
擷取資料并合并
抓取
合并
拉取
對于跟蹤分支,可以直接使用
指令進行自動抓取和合并
删除遠端分支
變基
普通的變基操作
- 将
分支變基到<B>
分支上<A>
- 如果預設
選項,就預設将目前分支變基到<B>
分支上<A>
- 變基之後還要進行快進合并操作才能完成最終的變基
$ git checkout <A> $ git merge <B>
進階變基操作
- 将在
上但是不在<c>
上的送出曆史變基到<b>
上<a>
- 進行快進合并
$ git checkout <a> $ git merge <c>
Git工具
分支引用
我們可以使用一個分支指針來指定一個送出記錄。此時該記錄就是分支指針所指向的目前送出記錄。例如
$ git show master
引用日志
- 引用日志和一般日志的差別是:引用日志記錄了
以及分支指針指向的變化,而日志就是記錄了送出曆史的變化。引用日志會記錄每一次HEAD
或者是個分支指針的變化。在我們剛克隆一個倉庫的時候,所得倉庫的引用日志是空的,這說明引用日志記錄的是本地倉庫的指針在本地經曆的變化。Head
- 檢視引用日志
$ git reflog
- 使用
檢視具體的某一個引用日志show
- 檢視一個指針在指定時間之前所在的位置
- 使用如下指令可以檢視類似于
輸出格式的引用日志資訊git log
$ git log -g
祖先引用
脫節符( ^
)
^
- 在一個指針之後添加一個脫節符
,表示該指針的父送出(它所指向的前一個送出)。^
$ git show master^
- 表示顯示
分支所指向的送出的父送出的資訊master
- 表示顯示
- 在脫字元
之後再加上一個數字^
,表示該指針的第n
個父送出。如果一個引用沒有這麼多個父送出,就會出現引用錯誤n
$ git show master^2
- 表示顯示
分支所指向的送出的第二個父送出的資訊。隻有master
分目前所指的送出對象是由合并得來的時候,該指令才能正确執行。master
- 表示顯示
-
的windows
中,cmd
号是一個特殊字元,是以需要使用雙引号括起來^
$ git show HEAD^ #ERROR $ git show "HEAD^" #OK $git show HEAD^^ # OK
波浪号( ~
)
~
- 在一個指針之後加上一個
号,也表示該指針指向的送出的父送出~
$ git show master~
- 在
号之後再增加一個數字~
,表示該指針目前指向的送出沿着某一路徑的回溯的第n
個送出n
$ git show master~2
-
的父送出的父送出master
-
送出區間
雙點
- 選出在
分支上但是不在<dev>
分支上的送出記錄<master>
多點
- 在一個分支前面加上
或者^
表示不包含在該分支上的送出--not
- 在分支名前加上
,表示隻對其後的第一個分支的否定^
$ git log ^<master> <dev> $ git log <dev> ^<master>
- 上面兩條指令都表示在
上但是不在<dev>
上的送出<master>
- 上面兩條指令都表示在
- 使用
,表示對其後的所有分支的否定--not
$ git log --not <master> <dev> $ git log <master> --not <dev>
- 這兩個指令效果不同
- 第一個指令表示不在
和<master>
上的送出<dev>
- 第二個指令表示在
上但是不在<master>
上的送出<dev>
三點
- 表示表示存在于
或者是<master>
分支上,但是不同時存在于這兩個分支上的送出<dev>
- 也就是那些非
和<master>
同時共有的送出<dev>
在該指令之後添加一個
--left-right
選項能夠顯示每一個送出所屬的分支,使得結果更加清晰
$ git log <master>...<dev> --left-right
貯藏
普通貯藏
- 該指令将工作區和暫存區中的所有沒有送出的修改貯藏起來
- 貯藏之後工作目錄和暫存區就會變為幹淨的狀态
貯藏應用
$ git stash apply
- 将最新的一次貯藏内容應用于目前分支
檢視貯藏清單
$ git stash list
應用舊版本的貯藏
-
可以通過檢視貯藏清單獲得stash@{<n>}
應用貯藏并且将原本暫存的檔案暫存
$ git stash apply --index
删除貯藏内容
應用貯藏之後删除該貯藏
$ git stash pop
保留暫存區的内容
$ git stash --keep-index
讓貯藏包含建立檔案
$ git stash --include-untracked/-u
把所有檔案(包括被忽略的檔案)都貯藏
$ git stash -a/--all
建立一個分支用于應用貯藏
搜尋
Git grep
- Git中提供了一個
指令,用于在送出曆史、工作目錄甚至是索引中查找一個字元串grep
- 該指令支援正則查找
- 基本用法
-
為比對字元串<regex>
-
- 輸出比對行行号
- 隻輸出比對結果的概略資訊
$ git grep -c/--count <regex?
- 顯示比對結果的上下文(比對結果所在的函數或者方法)