git config --global user.name 'hello'
設置全局用戶名hellogit config --global user.email 'hello@zuoyebang.com'
設置全局郵箱hello@zuoyebang.comgit 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 statusgit --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倉庫或從新初始化一個現有倉庫git add <path>
把path中的文件或者目錄添加到暫存區git add ./git add */git add -A
把全部的修改都添加到暫存區中git add -u <path>
git add -i
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,默認是origingit clone --recursive git@github.com:rbind/yihui.git
克隆庫的時候要初始化子模塊,加 --recursive 參數git status
顯示工做目錄和暫存區的狀態git status -uno
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 -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
將暫存區裏的全部文件恢復到工做樹中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 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 <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 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 checkout dev
切換新分支(沒有commit的文件會跟隨新分支切換)git checkout -b hello
建立並切換到新分支hellogit 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 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 可視化工具。能夠設置BeyondCompare,DiffMerge等做爲git的比較和合並的可視化工具,方便操做。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之間的記錄,不包括commit1git log HEAD^
HEAD表明最後一次提交,HEAD^爲最後一個提交的父提交,等同於HEAD~1git 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 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的展開diffgit stash clear
刪除全部緩存的stashgit stash branch testNew
從stash建立分支,若是成功,將會丟棄儲藏。若是你儲藏了一些工做,暫時不去理會,而後繼續在你儲藏工做的分支上工做,你在從新應用工做時可能會碰到一些問題。若是嘗試應用的變動是針對一個你那以後修改過的文件,你會碰到一個歸併衝突而且必須去化解它。若是你想用更方便的方法來從新檢驗你儲藏的變動,你能夠運行 git stash branch,這會建立一個新的分支,檢出你儲藏工做時的所處的提交,從新應用你的工做,若是成功,將會丟棄儲藏。這是一個很棒的捷徑來恢復儲藏的工做而後在新的分支上繼續當時的工做。
爲何有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 -v
查看遠程主機的網址git remote show <主機名>
查看主機的詳細信息git remote add <主機名> <網址>
添加遠程主機git remote rm <主機名>
刪除遠程主機git remote rename <原主機名> <新主機名>
重命名遠程主機一般是將遠程主機的版本庫有了新的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:branch2jquery
取回遠程主機某個分支的更新,再與本地的指定分支合併,它的完整格式稍稍有點複雜。
默認模式下,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 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 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 tagName
看到說明文字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
若是最新一次提交沒有註釋標籤,那麼會顯示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
git describe --all
git describe --contains
git describe --always
這部分的內容,能夠參考以前的文章 包你學會git rebase
git rebase
將合併分支合併到當前分支,並將當前分支的代碼合併到後面,獲取乾淨整潔的班版本樹git rebase --continue
git遇到衝突會停下要求解決衝突,衝突解決完以後會繼續應用(apply)餘下的補丁git rebase --skip
跳過當前合併的衝突,進入下一個提交的diffgit rebase --abort
任什麼時候候均可以用這個命令終止rebase操做,分支會回到rebase開始的狀態通常用於維護和數據恢復。當你在一個倉庫下工做時,你的每一步操做都會記錄下來,包括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 commitID
能夠選擇某個分支的一個或幾個commit合併到另外一個分支上。假設有一個穩定版本,如今要升級版本,若是將兩個版本的分支合併,那麼會形成版本混亂,不利於維護,通常會將要增長的功能單獨提交一個分支,而後增長到新版本上,就可使用cherry-pick了。記住cherry-pick是一個本地操做。假如你在pull代碼以後有人又提交了代碼,那麼須要先pull代碼,再進行cherry-pickgithub