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倉庫正則表達式
$ git init
-
命令執行以後會生成一個
.git
文件夾windows
克隆一個已經存在的倉庫
-
使用如下命令克隆一個倉庫bash
$ git clone <url> [<name>]
-
其中
<url>
爲須要克隆的倉庫的地址,<name>
是可選的,即克隆到本地的倉庫的名字,若是沒有這一選項,就在本地建立一個和克隆處名字同樣的本地庫服務器
記錄每次更新到Git倉庫
查看文件狀態
$ git status
暫存新建或者是已修改的文件
$ git add <filename>/<dirname>
- 其後也能夠是一個目錄
- 若是是目錄,就遞歸地將目錄中的已修改的文件暫存到暫存區
狀態簡覽
-
使用
git status
命令的狀態結果可能略顯繁瑣app -
咱們可使用
--short
或者是-s
選項,使得輸出簡化編輯器$ git status -s
忽略文件.gitignore
能夠在倉庫根目錄之下建立一個.gitionore
文件,在其中指定不進行版本管理的文件函數
文件差別對比
工做區和暫存區的文件差別的對比
$ git diff [<filename>]
- 其中
<filename>
是可選的,若是沒有,就會輸出全部的文件的差別
本地庫和暫存區的文件差別對比
$ git diff --cached/--staged [<filename>]
工做區和本地庫的最新版的文件差別對比
$ git diff HEAD -- [<filename>]
提交更新
-
在編輯器中輸入提交信息工具
$ git commit
- 該命令會將暫存區中的文件一次性所有提交到本地庫
-
使用
-m
選項攜帶提交信息fetch$ git commit -m "<msg>"
-
跳過使用暫存區域
$ git commit -a -m "<msg>"
- 該命令會將**==已跟蹤==**的文件所有暫存而後一次性提交
- 對於**==未跟蹤==**文件,不會進行暫存和提交
移除文件
-
將三個區中的文件進行移除
$ git rm <filename>
-
保留工做區中的文件
$ git rm --cached <filename>
-
工做區和本地庫版本不一致的文件,須要使用
-f
選項進行強制刪除 -
對於未追蹤的文件,不能使用該命令,實際上直接使用
rm
命令刪除就好了
移動或者重命名文件
$ git mv <fromfile> <tofile>
這至關於
$ 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
以及其所指的分支
$ git reset --soft HEAD~/HEAD^n
- 一個
~
號表示回退一個版本 ^n
的n
表示回退的版本數
將HEAD
所指向的分支指向的提交版本的文件複製到暫存區中
$ git reset [--mixed] HEAD~/HEAD^n
覆蓋工做區的內容
$ git reset --hard HEAD~/HEAD^n
取消暫存的文件
$ git reset [HEAD] <file>
- 這實際上就是使用
HEAD
所指向的分支的當前提交的版本的<file>
覆蓋暫存區中的相應文件
壓縮
-
在咱們進行了一次提交以後,再次對文件進行修改
-
而後執行以下命令
$ git reset --soft HEAD~
-
而後再執行
$ git commit
-
就至關於將上一次的提交給覆蓋了。固然,實際上那個提交依然存在
引用日誌
使用以下命令能夠查看引用日誌
$ git reflog
根據引用日誌能夠返回到更新的版本
-
使用引用日誌命令,找到想要到的指定版本的校驗和
-
執行以下命令
$ git reset --hard/--soft/[--mixed] <checksum>/HEAD@{<n>}
-
就能夠回到前面的版本
檢出(checkout)
不帶路徑(切換分支)
$ git checkout <point>
- 將
HEAD
指向<point>
帶路徑(撤銷對文件的修改)
$ git checkout -- <file>
- 實際上就是不移動
HEAD
,而是將HEAD
所指的分支當前指向的提交版本的<file>
覆蓋暫存區中的對應文件,同時覆蓋工做區中的對應文件
遠程倉庫的使用
遠程倉庫查看
-
查看遠程庫列表
$ git remote
-
查看遠程庫列表的詳細信息
$ git remote -v
添加一個遠程庫
$ git remote add <name> <url>
<name>
是遠程庫的簡寫名稱<url>
是遠程庫的具體地址
抓取遠程庫的數據到本地
$ git fetch <name>/<url>
<name>
遠程庫的簡稱<url>
遠程庫的具體地址
合併數據到本地分支
$ git merge <name>/<branch>
- 該命令將遠程庫
<name>
的<branch>
分支的內容合併到當前的分支上
拉取遠程庫上的指定分支的內容
$ git pull <name>
<name>
爲遠程庫的簡稱- 要使用該命令,必須先將本地庫的當前分支與遠程庫的分支進行關聯
- 該命令會將遠程庫上的內容下載到本地並將和當前分支關聯的遠程分支與當前分支進行合併
推送到遠程庫
$ git push <name> <master>
<name>
是遠程庫的名稱<master>
實際上能夠是其餘分支
查看某個遠程倉庫
$ git remote show <name>
<name>
爲遠程倉庫名
遠程倉庫重命名
$ git remote rename <oldname> <newname>
- 該命令也就是更改本地對於遠程庫的稱呼,並不是將遠程倉庫的倉庫名字改了
遠程倉庫的移除
$ git remote remove/rm <name>
- 該命令只是將和遠程倉庫關聯的遠程倉庫簡寫名稱從本地刪除了,也就是說之後咱們的倉庫不能再鏈接相應的遠程庫了,而不是說咱們真的把一個倉庫從遠程服務器上移除了
打標籤
列出標籤列表
-
列出全部標籤
$ git tag
-
列出知足必定條件的標籤
$ git tag -l/--list <regex>
<regex>
爲一個篩選條件,能夠是一個正則表達式
建立標籤
建立附註標籤
$ git tag -a <tagName> -m "<msg>"
<tagName>
爲標籤名<msg>
爲標籤信息
查看標籤信息以及打標籤的提交的提交信息
$ git show <tagname>
建立輕量標籤
$ git tag <tagname>
附註標籤和輕量標籤的區別
附註標籤附帶這標籤信息,輕量標籤沒有標籤信息。輕量標籤就至關於一個簡單的標記。
補打標籤
這個和爲當前版本的提交打標籤相似,不過就是再最後增長一項,也就是想要打標籤的提交的校驗和(或者部分檢驗和)
共享標籤
-
將某一個標籤顯示推送到遠程服務器
$ git push <remote> <tagname>
<remote>
爲遠程庫名稱<tagname>
爲要推送的標籤名
-
將全部標籤一次性所有推送到遠程服務器
$ git push <remote> --tags
刪除標籤
刪除本地標籤
$ git tag -d <tagname>
刪除共享到遠程服務器上面的標籤
-
第一種方式
$ git push <remote> : ref/tags/<tagname>
-
更直觀的方式
$ git push <remote> --delete <tagname>
檢出標籤
$ git checkout <tagname>
- 這實際上就是將
HEAD
指向<tagname>
所指向的提交 - 這回致使倉庫處於頭指針分離狀態
- 在這種狀態下,咱們若是要進行新提交,通常要先新建一個分支
Git別名
爲Git內部的命令起別名
$ git config [--global] alias.<title> '<cmd>'
- 其中,若是有
[--global]
,那麼這個命令的別名就會在整個當前用戶都有效,這些配置文件在Git的全局配置文件中 - 若是沒有
[--global]
,那麼這個別名就只在本倉庫生效,配置信息在當前倉庫的.git
文件夾下的.gitconfig
文件中 <title>
爲命令別名<cmd>
爲要起別名的具體命令
爲Git外部的命令起別名
$ git config [--global] alias.<title> '!<cmd>'
- 能夠看出,和爲內部命令起別名的區別就是要在外部命令前添加一個
!
號
Git 分支
查看當前倉庫的全部分支
$ git branch
分支的建立
建立分支
$ git branch <branchname>
切換分支
$ git checkout <branch>
或者是
$ git switch <branch>
建立並切換分支
$ git checkout -b <branch>
或者是
$ git switch -c <branch>
查看各分支所指向的提交對象
$ git log --decorate
查看各分支的更加詳細信息
$ git log --oneline --decorate --graph --all
分支的合併
$ git merge <master> <dev>
<master>
表示要併入的主分支<dev>
表示要被合併的分支- 就是要將
<dev>
的內容合併到<master>
- 若是省略
<master>
分支,默認將<dev>
分支合併到當前分支
分支的刪除
-
刪除已經進行了合併的分支
$ git branch -d <branch>
-
刪除一個尚未和其餘分支進行合併的分支
$ git branch -d -D <branch>
-D
表示強制刪除
分支合併產生衝突的解決辦法
git status
查看衝突的文件- 對於有衝突的文件進行手動修正
git add
將衝突文件暫存git commit
將暫存的文件進行提交- 合併完成
分支管理
列出全部分支
$ git branch
查看每個分支的最後一次提交信息
$ git branch -v
查看已經和指定分支進行了合併的分支
$ git branch --merged [<branch>]
- 若是省略後面的分支名,則默認爲當前分支
查看尚未和指定分支進行過合併的分支
$ git branch --no-merged [<branch>]
遠程分支
獲取遠程引用(包括分支、標籤等)的完整列表
$ git ls-remote <remote>
或者是
$ git remote show <remote>
將分支推送到遠程庫上
遠程庫分支和本地分支名字相同
$ git push <remote> <branch>
給遠程分支起名字
$ git push <remote> <localName> : <remoteName>
本地分支和遠程分支的合併
和已有分支合併
$ git merge [<localBranch>] <remote>/<remoteBranch>
- 將
<remote>/<remoteBranch>
分支合併到<localBranch>
分支 - 若缺省本地分支名稱,默認爲當前分支
基於遠程分支新建一個本地分支
$ git checkout -b <newBranch> <remote>/<branch>
- 這至關於新建的分支的起點和遠程分支的一致
- 這實際上就建立了一個跟蹤分支
<newBranch>
跟蹤分支
跟蹤分支就是和遠程分支關聯起來了的本地分支。在一個跟蹤分支上面執行pull
命令,Git會抓取到正確的遠程分支的內容,而後自動合併到跟蹤分支上。
建立跟蹤分支
-
常規建立方法
$ git checkout -b <newBranch> <remote>/<branch>
-
建立一個和遠程分支同名的跟蹤分支
$ git checkout --track <remote>/<branch>
設置跟蹤分支
$ git branch -u/--set-upstream-to <remote>/<branch>
- 設置當前分支爲跟蹤分支,其上游分支爲
<remote>/<branch>
上游快捷方式
可使用@{u}
或者是@{upstream}
來引用跟蹤分支的上游分支
查看全部的跟蹤分支
$ git branch -vv
獲取數據併合並
抓取
$ git fetch <origin>
合併
$ git merge [<localBranch>] <remote>/<branch>
拉取
對於跟蹤分支,能夠直接使用
$ git pull [<remote>]
命令進行自動抓取和合並
刪除遠程分支
$ git push <remote> --delete <branch>
變基
普通的變基操做
$ git rebase <A> [<B>]
-
將
<B>
分支變基到<A>
分支上 -
若是缺省
<B>
選項,就默認將當前分支變基到<A>
分支上 -
變基以後還要進行快進合併操做才能完成最終的變基
$ git checkout <A> $ git merge <B>
高級變基操做
$ git rebase --onto <a> <b> <c>
-
將在
<c>
上可是不在<b>
上的提交歷史變基到<a>
上 -
進行快進合併
$ git checkout <a> $ git merge <c>
Git工具
分支引用
咱們可使用一個分支指針來指定一個提交記錄。此時該記錄就是分支指針所指向的當前提交記錄。例如
$ git show master
引用日誌
-
引用日誌和通常日誌的區別是:引用日誌記錄了
HEAD
以及分支指針指向的變化,而日誌就是記錄了提交歷史的變化。引用日誌會記錄每一次Head
或者是個分支指針的變化。在咱們剛克隆一個倉庫的時候,所得倉庫的引用日誌是空的,這說明引用日誌記錄的是本地倉庫的指針在本地經歷的變化。 -
查看引用日誌
$ git reflog
-
使用
show
查看具體的某一個引用日誌$ git show <checksum>/HEAD@{<N>}
-
查看一個指針在指定時間以前所在的位置
$ git show <branch>@{<time>}
-
使用以下命令能夠查看相似於
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
的父提交的父提交
提交區間
雙點
$ git log <master>..<dev>
- 選出在
<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>
上的提交
三點
$ git log <master>...<dev>
- 表示表示存在於
<master>
或者是<dev>
分支上,可是不一樣時存在於這兩個分支上的提交 - 也就是那些非
<master>
和<dev>
同時共有的提交
在該命令以後添加一個--left-right
選項可以顯示每個提交所屬的分支,使得結果更加清晰
$ git log <master>...<dev> --left-right
貯藏
普通貯藏
$ git stash [push]
- 該命令將工做區和暫存區中的全部沒有提交的修改貯藏起來
- 貯藏以後工做目錄和暫存區就會變爲乾淨的狀態
貯藏應用
$ git stash apply
- 將最新的一次貯藏內容應用於當前分支
查看貯藏列表
$ git stash list
應用舊版本的貯藏
$ git stash apply stash@{<n>}
stash@{<n>}
能夠經過查看貯藏列表得到
應用貯藏而且將本來暫存的文件暫存
$ git stash apply --index
刪除貯藏內容
$ git stash drop stash@{<n>}
應用貯藏以後刪除該貯藏
$ git stash pop
保留暫存區的內容
$ git stash --keep-index
讓貯藏包含新建文件
$ git stash --include-untracked/-u
把全部文件(包括被忽略的文件)都貯藏
$ git stash -a/--all
新建一個分支用於應用貯藏
$ git stash branch <branch>
搜索
Git grep
-
Git中提供了一個
grep
命令,用於在提交歷史、工做目錄甚至是索引中查找一個字符串 -
該命令支持正則查找
-
基本用法
$ git grep <regex>
<regex>
爲匹配字符串
-
輸出匹配行行號
$ git grep --line-number/-n <regex>
-
只輸出匹配結果的概略信息
$ git grep -c/--count <regex?
-
顯示匹配結果的上下文(匹配結果所在的函數或者方法)
$ git grep -p/--show-function <regex>
Git日誌搜索
搜索新增或者刪除一個字符串的提交日誌
$ git log -S <regex>
搜索一行或者一個函數的提交歷史
$ git log -L <regex>