GIT實操手冊 —— 值得收藏的GIT常用命令字典 目錄

目錄

  • git config 配置
  • git help 顯示有關Git的幫助信息
  • git init 初始化
  • git add 將文件內容添加到暫存區
  • git clone 將存儲庫克隆到新目錄中
  • git status 查看狀態
  • git diff 顯示提交和工作樹等之間的更改
  • git commit 提交
  • git reset 將當前HEAD復位到指定狀態,用於撤消之前的一些操作
  • git rm 從工作區和暫存區中刪除文件
  • git mv 移動或重命名文件,目錄或符號鏈接
  • git branch 列出,創建或刪除分支
  • git checkout 切換分支或恢復工作樹文件
  • git merge將兩個或兩個以上的開發歷史加入(合併)一起
  • git mergetool 運行合併衝突解決工具來解決合併衝突
  • git log 顯示提交日誌信息
  • git stash 將更改儲藏在髒工作目錄中
  • git tag 創建,列出,刪除或驗證使用GPG簽名的標籤對象
  • git remote 管理遠程主機
  • git fetch 從另一個存儲庫下載對象和引用
  • git pull 從另一個存儲庫或本地分支獲取並集成(整合)
  • git push 將本地分支的更新,推送到遠程主機
  • git submodule 初始化,更新或檢查子模塊
  • git show 用於顯示各種類型的對象
  • git shortlog 彙總git日誌輸出
  • git describe 顯示離當前提交最近的標籤
  • git rebase 合併分支
  • git reflog GIT操作歷史記錄
  • git cherry-pick 摘櫻桃模式

git config 配置

  • git config --global user.name 'hello' 設置全局用戶名hello
  • git config --global user.email '[email protected]' 設置全局郵箱[email protected]
  • git config user.name 查看配置中的配置項(用戶名)
  • git config user.email 查看配置中的配置項(郵箱)
  • git config --global core.editor emacs 配置默認的文本編輯器
  • git config --global merge.tool vimdiff 配置比較工具用來解決衝突
  • git config --list 列出Git可以在該處找到的所有的設置
  • git config -–add site.name hello 默認是添加在 local配置中的新配置項
  • git config [--local | --global | --system] –unset site.name 刪除配置項中的site.name配置值
  • git config --global alias.別名 命令 給命令設置別名,例如給git status 設置別名爲s,git config --global alias.s status

git help 顯示有關Git的幫助信息

  • git --help 在git窗口查看命令
  • git help config/git config --help/git --help config 查看git config如何使用
  • git help git/git --help git 顯示git手冊頁
  • git help help/git --help help 查看help命令如何使用

git init 初始化

  • git init 創建一個空的Git倉庫或重新初始化一個現有倉庫

git add 將文件內容添加到暫存區

  • git add <path> 把path中的文件或者目錄添加到暫存區
  • git add ./git add */git add -A 把所有的修改都添加到暫存區中
  • git add -u <path>
  • git add -i

git clone 將存儲庫克隆到新目錄中

  • git clone <版本庫的網址>
  • git clone <版本庫的網址> <本地目錄名>
  • git clone --bare
  • git clone -l
  • git clone -s
  • git clone -n
  • git clone --reference
  • git clone -o jQuery https://github.com/jquery/jquery.git 克隆遠程主機到本地,並將遠程主機重命名爲jQuery,默認是origin
  • git clone --recursive [email protected]:rbind/yihui.git 克隆庫的時候要初始化子模塊,加 --recursive 參數

git status 查看狀態

  • git status 顯示工作目錄和暫存區的狀態
  • git status -uno

git diff 顯示提交和工作樹等之間的更改

  • git diff 是查看working tree與暫存區文件的差異
  • git diff <file> 比較某文件和暫存區文件差異
  • git diff --cached/git diff --staged/ 比較暫存區和上次commit的HEAD的差異
  • git diff HEAD 顯示工作版本(Working tree)和上次commit的HEAD的差異
  • git diff HEAD^ HEAD 比較上次提交和上上次提交的差異
  • git diff HEAD -- ./lib 顯示當前目錄下的lib目錄和上次提交之間的差別(更準確的說是在當前分支下)
  • git diff commitID1 commitID2比較兩個歷史版本之間的差異
  • git diff topic 比較當前分支與topic分支的差別
  • git diff topic dev /git diff topic..dev 在dev和topic兩個分支之間比較變更
  • git diff --stat 僅僅比較統計信息(簡單結果)

git commit 提交

  • git commit 將暫存區中的文件、描述、更改用戶、日誌消息一起提交到存儲庫
  • git commit -a/git commit --all 將所有已跟蹤文件中的執行修改或刪除操作的文件都提交到本地倉庫,即使它們沒有經過git add添加到暫存區,新加的文件(即沒有被git系統管理的文件)是不能被提交到本地倉庫的。(建議一般不要使用-a參數)
  • git commit -m 'message' /git commit --message 'message' 簡要說明提交的信息
  • git commit --amend 追加提交,它可以在不增加一個新的commit-id的情況下將新修改的代碼追加到前一次的commit-id中
  • git commit -v 查看要提交的內容與版本庫中的比較,然後進行提交

git reset 將當前HEAD復位到指定狀態,用於撤消之前的一些操作

  • git reset 將暫存區裏的所有文件恢復到工作樹中
  • git reset <path> 將暫存區裏的指定文件恢復到工作樹中
  • git reset -- README.md 將暫存區的單獨一個文件恢復到工作樹中。
  • git reset --soft HEAD^ commit之後取消本地提交,回到沒有提交之前的暫存區中。
  • git reset --hard commit_id
  • git reset --hard HEAD~3 永久刪除最後幾個提交
  • git reset --hard ORIG_HEAD 執行git pull完後,發現這次拉取下來的修改不滿意,想要回滾到git pull之前的狀態,並清空本地沒有加入暫存區的內容。
  • git reset --merge ORIG_HEAD 執行git pull完後,發現這次拉取下來的修改不滿意,想要回滾到git pull之前的狀態,可以避免在回滾時清除工作區,保留暫存區和工作樹的內容。
  • git reset --soft
  • git reset --keep start

git rm 從工作區和暫存區中刪除文件

  • git rm test.txt 刪除test.txt文件,並把它從git倉庫管理系統中刪除,需要執行git commit才能真正提交到git 倉庫
  • git rm -r mydir 刪除mydir文件夾,並把它從git的倉庫管理系統中刪除
  • git rm --cache test.txt 從暫存區中移除test.txt文件,對文件本身不進行改變。
  • git rm -f 取消rm操作

git mv 移動或重命名文件,目錄或符號鏈接

  • git mv <source> <destination> 例如:git mv test.txt mydir 將test.txt文件移動到mydir目錄下
  • git mv test.txt test1.txt 將test.txt文件重命名爲test1.txt

此操作必須要在暫存區或者文件commit之後才能進行rename,此時不需要再git add, 否則會報錯
fatal: not under version control, source=home/test.txt, destination=home/test1.txt )

  • git mv -f
  • git mv -k

git branch 列出,創建或刪除分支

  • git branch 查看本地分支和當前分支
  • git branch test 新建test分支(還在當前分支中)
  • git branch -a 查看本地分支和遠程分支
  • git branch -r 查看遠程分支
  • git branch -m test test1 修改本地分支名稱
  • git branch -d test 刪除本地分支
  • git branch -D test 強制刪除本地test分支,有時候-d的時候回提示沒有完全合併
  • git branch --set-upstream dev origin/test 將本地dev分支與遠程主機的test分支建立追蹤關係

Git會自動在本地分支與遠程分支之間,建立一種追蹤關係(tracking)。比如,在git clone的時候,所有本地分支默認與遠程主機的同名分支,建立追蹤關係,也就是說,本地的master分支自動"追蹤"origin/master分支。

  • git push origin -d <branchName> 遠程刪除git服務器上的分支

git checkout 切換分支或恢復工作樹文件

  • git checkout dev 切換新分支(沒有commit的文件會跟隨新分支切換)
  • git checkout -b hello 創建並切換到新分支hello
  • git checkout -B hello 強制創建並切換到新分支,如果當前目錄有這個分支,進行覆蓋操作
  • git checkout [commitID] 切換到某一個提交版本的分支
  • git checkout --detach hello 切換到hello分支的最後一次提交的commitID版本的分支
  • git checkout --orphan <branch>
  • git checkout --merge <branch>
  • git checkout -p <branch>
  • git checkout <tagName> 切換到tagName標籤的分支中

git merge 將兩個或兩個以上的開發歷史加入(合併)一起

  • git merge hello 合併hello分支到當前分支

Fast-forward信息,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。這種合併看不出來曾經做過合併。

  • git merge hello1 hello2 合併hello1和hello2分支的東西到當前分支,多個分支合併。
  • git merge --abort 放棄合併
  • git merge --continue 合併繼續,這個命令後是修改合併生成的commit信息
  • git merge -s ours obsolete
  • git merge --no-ff -m "merge with no-ff" dev 普通模式合併,合併後歷史上有分支,能看出來曾經做過合併,表示禁用Fast forward,準備合併dev分支,因爲要創建一個新的commit,所以加上-m參數,把commit的表述寫進去

git mergetool 運行合併衝突解決工具來解決合併衝突

  • git mergetool git設置 mergetool 可視化工具。可以設置BeyondCompare,DiffMerge等作爲git的比較和合並的可視化工具,方便操作。

git log 顯示提交日誌信息

  • git log 顯示提交日誌信息
  • git log --no-merges 顯示整個提交歷史記錄,但跳過合併記錄
  • git log dev home 顯示home子目錄中的任何文件的所有提交
  • git log --graph 可以看到分支合併圖
  • git log -3 查看最近三次提交
  • git log --author=csf 查看csf作者的提交記錄
  • git log --after={2019-03-01}/git log --since={2019-03-01} 查看2018-03-01日之後的提交記錄,包括當前日期
  • git log --until={2019-03-01}/git log --before={2019-03-01} 查看2018-03-01日之前的提交記錄,不包括當前日期
  • git log --until={2019-03-07} --after={2019-03-05} 查看2018-03-05到2018-03-06兩天的提交記錄
  • git log commitID 查看包含commitID之前的歷史記錄
  • *git log commitID1 commitID2 查詢commit1與commit2之間的記錄,包括commit1和commit2
  • *git log commitID1..commitID2 查詢commit1與commit2之間的記錄,不包括commit1
  • git log HEAD^ HEAD代表最後一次提交,HEAD^爲最後一個提交的父提交,等同於HEAD~1
  • git log HEAD~2 HEAD~2代表倒數第二次提交
  • git log --pretty=oneline 按指定格式顯示日誌信息(顯示一行,可選項有:oneline,short,medium,full,fuller,email,raw以及format:,默認爲medium)
  • git log --pretty=oneline --abbrev-commit 按指定格式顯示日誌信息,顯示一行,commitID使用7位數
  • git log --pretty=format:"%an %ae %ad %cn %ce %cd %cr %s" --graph 自定義格式圖文形式輸出

選項說明
%H —— 提交對象(commit)的完整哈希字串
%h —— 提交對象的簡短哈希字串
%T —— 樹對象(tree)的完整哈希字串
%t —— 樹對象的簡短哈希字串
%P —— 父對象(parent)的完整哈希字串
%p —— 父對象的簡短哈希字串
%an —— 作者(author)的名字
%ae —— 作者的電子郵件地址
%ad —— 作者修訂日期(可以用 -date= 選項定製格式)
%ar —— 作者修訂日期,按多久以前的方式顯示
%cn —— 提交者(committer)的名字
%ce —— 提交者的電子郵件地址
%cd —— 提交日期
%cr —— 提交日期,按多久以前的方式顯示
%s —— 提交說明

git stash 將更改儲藏在髒工作目錄中

  • git stash/git stash save 將更改儲藏在髒工作目錄中(只是會將git跟蹤的文件(unstaged changes)和暫存區中的文件(staged changes)進行修改)
  • git stash -u 將更改儲藏在髒工作目錄中(git跟蹤的文件(unstaged changes)、暫存區中的文件(staged changes)、工作目錄中的新文件(untracked files))
  • git stash -a/git stash --all 將當前目錄的所有文件都進行儲藏(git跟蹤的文件(unstaged changes)、暫存區中的文件(staged changes)、工作目錄中的新文件(untracked files)、被忽略的文件(ignored files))
  • git stash list 查看現有的儲藏
  • git stash apply 應用最新一次儲藏的內容,不刪除贓工作目錄
  • git stash apply stash@{2} 應用指定儲藏版本的內容
  • git stash apply --index
  • git stash drop stash@{0} 刪除指定儲藏版本的內容,之後的名稱1會變成從0開始
  • git stash pop 應用最新一次儲藏版本的內容,並將其從堆棧中移走,此時運行git stash list將沒有這個儲藏的記錄
  • git stash show/git stash show stash@{0} 查看最新一個stash的diff統計信息
  • git stash show -p/git stash show -p stash@{0} 查看最新一個stash的展開diff
  • git stash clear 刪除所有緩存的stash
  • git stash branch testNew 從stash創建分支,如果成功,將會丟棄儲藏。

如果你儲藏了一些工作,暫時不去理會,然後繼續在你儲藏工作的分支上工作,你在重新應用工作時可能會碰到一些問題。如果嘗試應用的變更是針對一個你那之後修改過的文件,你會碰到一個歸併衝突並且必須去化解它。如果你想用更方便的方法來重新檢驗你儲藏的變更,你可以運行 git stash branch,這會創建一個新的分支,檢出你儲藏工作時的所處的提交,重新應用你的工作,如果成功,將會丟棄儲藏。這是一個很棒的捷徑來恢復儲藏的工作然後在新的分支上繼續當時的工作。

git tag 創建,列出,刪除或驗證使用GPG簽名的標籤對象

爲什麼有commit還要有tag?因爲每次記commitID很複雜,直接找commit對應的有意義的tag,就很好找了。

  • git tag/git tag -l/git tag -l <tagName> 查看所有標籤、查看指定標籤
  • git tag <name> 當前分支的最新HEAD打新標籤
  • git tag <name> <commitID> 給對應的某個commitID打標籤
  • git tag <name>-light 創建輕量標籤
  • git tag -a <name> -m "message" 創建帶有說明的標籤,即註釋標籤,用-a指定標籤名,-m指定說明文字
  • git tag -d <name> 刪除本地標籤
  • git tag start ?

git remote 管理遠程主機

  • git remote 列出所有遠程主機
  • git remote -v 查看遠程主機的網址
  • git remote show <主機名> 查看主機的詳細信息
  • git remote add <主機名> <網址> 添加遠程主機
  • git remote rm <主機名> 刪除遠程主機
  • git remote rename <原主機名> <新主機名> 重命名遠程主機

git fetch 從另一個存儲庫下載對象和引用

通常是將遠程主機的版本庫有了新的commit的時候,將這些更新取回本地,這個命令通常用來查看其他人的進程,因爲它取回的代碼對本地的開發代碼沒有影響。
可以使用git merge和git rebase命令,在本地分支合併遠程分支。
這個命令主要是在合併之前可以看看有哪些地方進行了修改

  • git fetch <遠程主機名> 將遠程主機的更新全部取回本地,默認是所有分支的更新
  • git fetch <遠程主機名><分支名> 取回遠程主機中的特定分支的更新(git fetch origin dev)
  • *git fetch origin branch1:branch2

首先執行上面的fetch操作,使用遠程branch1分支在本地創建branch2(但不會切換到該分支),如果本地不存在branch2分支, 則會自動創建一個新的branch2分支,如果本地存在branch2分支, 並且是`fast forward', 則自動合併兩個分支, 否則, 會阻止以上操作.

git fetch origin :branch2
等價於: git fetch origin master:branch2

git pull 從另一個存儲庫或本地分支獲取並集成(整合)

取回遠程主機某個分支的更新,再與本地的指定分支合併,它的完整格式稍稍有點複雜。
默認模式下,git pull 是git fetch 和git merge FETCH_HEAD的縮寫

  • git pull <遠程主機名> 將遠程主機的全部分支取回並與本地分支合併,如果當前分支和遠程分支有追蹤關係,git pull就可以省略遠程分支名。

  • git pull <遠程主機名><遠程分支名> 將遠程主機的某一個分支取回和本地當前分支合併

  • git pull <遠程主機名><遠程分支名>:<本地分支名> 將遠程的某一分支取回和本地某一分支進行合併(git pull dev:test)

  • git pull --rebase <遠程主機名><遠程分支名>:<本地分支名> 將遠程某一分支取回和本地某個分支進行rebase合併,不寫默認是merge

  • *git pull -p 如果遠程主機刪除了某個分支,就會在本地刪除遠程已經刪除的分支 (等同git fetch --prune origin → git fetch -p)

git push 將本地分支的更新,推送到遠程主機

  • git push 如果遠程主機和當先分支有追蹤關係,那麼主機名可以忽略,默認是將所有的分支都取回
  • git push <遠程主機名><遠程分支名>:<本地分支名> 將本地某一分支推送到遠程主機的某一分支上

git push origin 如果遠程主機和當先分支有追蹤關係,將本地當前分支推送到origin遠程主機的對應分支
git push origin test 將本地的當前分支推送到遠程主機的test分支,如果test分支不存在,則會被新建
git push origin test:test1 將本地的test分支推送到origin遠程主機的test1分支上

  • git push <遠程主機名> --delete <遠程分支名> / git push <遠程主機名> :<遠程分支名> 刪除遠程某一分支(第二種相當於推送一個空的本地分支到遠程分支,也是刪除遠程分支的)

git push origin --delete test /git push origin :test 刪除遠程test分支

  • git push --all origin 將所有本地分支都推送到origin遠程主機(當遠程主機的版本bii本地版本更新的時候,推送時git會報錯,要求先在本地做git pull合併差異)
  • git push --force origin/git push -f origin 將本地分支強推送到origin遠程主機,結果導致在遠程主機產生一個”非直進式”的合併(non-fast-forward merge)。除非你很確定要這樣做,否則應該儘量避免使用–-force選項。
  • git push -f origin dev:student 將本地的dev分支強覆蓋origin遠程主機的遠程student分支
  • git push -u origin master 如果當前分支與多個主機存在追蹤關係,使用-u指定一個默認主機,這樣就可以不加任何參數的使用git push(這個是指定了origin主機的master爲默認選項)
  • git push origin <tagName> 推送某個標籤到遠程分支
  • git push origin --tags 一次性推送全部尚未推送到遠程的本地標籤
  • git push origin :<tagname> / git push origin :refs/tags/<tagname> 刪除一個遠程標籤

git submodule 初始化,更新或檢查子模塊

  • git submodule add http://github.com/chaconinc/DbConnector 添加一個名爲 “DbConnector” 的庫。默認情況下,子模塊會將子項目放到一個與倉庫同名的目錄中,如果你想要放到其他地方,看下面。
  • git submodule add <版本庫的網址> <本地目錄名> 把某版本庫添加到本地的某個目錄中。
  • git submodule update --init --recursive 已經克隆了主庫但沒初始化子模塊
  • git submodule update --recursive --remote 已經克隆並初始化子模塊,而需要從子模塊的源更新這個子模塊.更新之後主庫的,git 差異中會顯示新的 SHA 碼,把這個差異選中提交即可。
  • git submodule 查看子模塊
  • git submodule update 更新項目內子模塊到最新版本
  • git submodule update --remote 更新子模塊爲遠程項目的最新版本
  • git submodule init 初始化子模塊

git show 用於顯示各種類型的對象

  • git show tagName 看到說明文字

git shortlog 彙總git日誌輸出

  • git shortlog 彙總每個人的commit記錄,進行簡單輸出
  • git shortlog -s 參數省略每次 commit 的註釋,僅僅返回一個簡單的統計。
  • git shortlog -n 參數按照 commit 數量從多到少的順利對用戶進行排序
  • git shortlog -sn/git shortlog -s -n 按照commit的數量從多到少進行排序,並簡單的統計數量。
  • git shortlog -2 查看最近兩次的commit記錄

git describe 顯示離當前提交最近的標籤

該命令查找從提交可訪問的最新標記。如果標籤指向提交,則只顯示標籤。
否則,它將標記 名稱與標記對象之上的其他提交數量 以及 最近提交的縮寫對象名稱後綴

  • git describe 如果最新一次提交沒有註釋標籤,那麼會顯示

fatal: No annotated tags can describe 'daa38004d76012c77029727096b9e4ef724030a7'.
However, there were unannotated tags: try --tags.

  • git describe --tags 顯示離當前提交最近的標籤,不限於只是註釋標籤, 如果tag之後沒有提交,就只顯示名字,如果之後有提交,就顯示下面的

merge1this-1-g84a2cd7說明:

"最新一次tagName""打tagName以來有兩次提交commit""最新一個g+commitID" ,g表示git
如果之後沒有提交,後面兩個參數不會寫。

  • git describe --all
  • git describe --contains
  • git describe --always

git rebase 合併分支

這部分的內容,可以參考之前的文章 包你學會git rebase

  • git rebase 將合併分支合併到當前分支,並將當前分支的代碼合併到後面,獲取乾淨整潔的班版本樹
  • git rebase --continue git遇到衝突會停下要求解決衝突,衝突解決完之後會繼續應用(apply)餘下的補丁
  • git rebase --skip 跳過當前合併的衝突,進入下一個提交的diff
  • git rebase --abort 任何時候都可以用這個命令終止rebase操作,分支會回到rebase開始的狀態

git reflog GIT操作歷史記錄

一般用於維護和數據恢復。當你在一個倉庫下工作時,你的每一步操作都會記錄下來,包括checkout,rebase,merge,commit操作。所以這個也是一個很好的回滾方式。

  • git reflog / git reflog show 顯示所有的git操作歷史記錄
  • git reflog dev 顯示在dev分支上面的操作歷史記錄 git reset --hard git@{1} 回滾到那個位置

  • git reflog --date=local | grep merge1 根據本地時間查看merge1分支的git操作記錄

  • git reflog delete HEAD@{1} 刪除對應步驟的git操作歷史記錄

git cherry-pick 摘櫻桃模式

  • git cherry-pick commitID 可以選擇某個分支的一個或幾個commit合併到另一個分支上。

假設有一個穩定版本,現在要升級版本,如果將兩個版本的分支合併,那麼會造成版本混亂,不利於維護,一般會將要增加的功能單獨提交一個分支,然後增加到新版本上,就可以使用cherry-pick了。

記住cherry-pick是一個本地操作。假如你在pull代碼之後有人又提交了代碼,那麼需要先pull代碼,再進行cherry-pick

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章