有錯誤和改進的地方望留言,謝謝 : )
順便推薦一下,git入門教程html
Git 使用規範流程
Git 工做流程
Commit message 和 Change log 編寫指南git
git config --system
// 對應的是 /etc/gitconfig
文件。git config --global
// 對應的是 ~/.gitconfig
文件。github
git config --global user.name 'Your name'
// 設置git的用戶名git config --global user.email 'youremail@email.com'
// 設置Email地址git config --global core.editor vim
// 默認編輯器修改成 Vim
正則表達式
git config --global alias.別名 '原命令'
// 爲命令取別名git config --global alias.st status
// 把status => stgit config --global alias.co checkout
// checkout => cogit config --global alias.ci commit
// commit => cigit config --global alias.br branch
// branch => brgit config --global alias.unstage reset HEAD
// reset HEAD => unstagegit config --global alias.last log -1
// 顯示最後一次提交信息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
顯示日誌時,不一樣區域顯示不一樣的顏色。git config --global color.ui true
// 讓git顯示顏色。config
是命令 --global
是 config
的參數,用了這個參數,表示你這臺機器上全部的Git倉庫都會使用這個配置,固然也能夠對某個倉庫指定不一樣的用戶名和Email地址。shell
.gitignore
// 在Git工做區的根目錄下建立一個特殊的.gitignore文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件。編程
#
開頭的行都會被 Git
忽略。glob
模式匹配。/
)說明要忽略的是目錄。glob
模式是指shell
所使用的簡化了的正則表達式。星號(*
)匹配零個或多個任意字符;[abc]
匹配任何一個列在方括號中的字符(這個例子要麼匹配一個a
,要麼匹配一個b
,要麼匹配一個c
);問號(?
)只匹配一個任意字符;若是在方括號中使用短劃線分隔兩個字符,表示全部在這兩個字符範圍內的均可以匹配(好比[0-9]
表示匹配全部0
到9
的數字)。
cat .git/config
// 查看 git
的配置文件,若是要刪除某個全局設置,直接刪除對應的行便可。vim
git help
// 查看 git 命令的全部參數,和 git 下的全部命令git help commit
// 能夠查看commit命令的全部參數,和其餘詳細信息,此命令至關好用 。git <verb> --help
// 查看某個命令信息man git-<verb>
// 查看某個命令信息app
git init
// 初始化一個有工做區域的倉庫,工做目錄下面的全部文件都不外乎這兩種狀態:已跟蹤或未跟蹤。git init --bran git.git
// 初始化一個不帶工做區的倉庫
初始化時git會自動初始化一個 master
主分支,而且在當前目錄下會出現一個名爲 .git
的目錄,全部 Git 須要的數據和資源都存放在這個目錄中。
全部的版本控制系統,其實只能跟蹤文本文件的改動,好比TXT文件,網頁,全部的程序代碼等等,Git也不例外。版本控制系統能夠告訴你每次的改動,好比在第5行加了一個單詞「Linux」,在第8行刪了一個單詞「Windows」。而圖片、視頻這些二進制文件,雖然也能由版本控制系統管理,但無法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是隻知道圖片從100KB改爲了120KB,但到底改了啥,版本控制系統不知道,也無法知道。git remote
// 它會列出每一個遠程庫的簡短名字。git remote add [shortname] [url]
// 添加遠程倉庫。git remote -v
// 此爲 --verbose
的簡寫,會列出 shortname url 權限。git remote show [remote-name]
// 查看某個遠程倉庫的詳細信息。git remote rename [old-name] [new-name]
// 修改某個遠程倉庫在本地的簡稱。git remote rm [repertory-name]
// 移除某個遠端倉庫。編輯器
git clone [url]
// 克隆某個倉庫,初次克隆某個倉庫時,工做目錄中的全部文件都屬於已跟蹤文件,且狀態爲未修改,會自動將遠程倉庫歸於 origin
名下,並自動建立了本地的 master 分支用於跟蹤遠程倉庫中的 master 分支(假設遠程倉庫確實有 master 分支)。git clone git://github.com/schacon/grit.git
// 在當前目錄下建立一個名爲grit的目錄,其中包含一個 .git
的目錄,用於保存下載下來的全部版本記錄,而後從中取出最新版本的文件拷貝。git clone git://github.com/schacon/grit.git mygrit
// 本身定義要新建的項目目錄名稱,能夠在上面的命令末尾指定新的名字,這裏是 mygrid
。ide
git add <file>
// 添加一個文件添加到暫存區,可反覆屢次使用,添加多個文件 如: git add text.txt text2.txt
,其實 git add
的潛臺詞就是把目標文件快照放入暫存區域,也就是 add file into staged area
,同時不曾跟蹤過的文件標記爲須要跟蹤。git add <dirname>
// 添加目錄下全部文件到暫存區。git add --all
// 把全部修改的文件添加到暫存區。git add .
// 把全部修改的文件添加到暫存區。git stage
// 跟 add
做用相同。git add -f <file>
// 強制添加到倉庫中,可用於添加已被忽略的文件git add -rf <dir>
// 強制添加到倉庫中,可用於添加已被忽略的文件夾
git commit
// 不帶 -m
的提交會啓動文本編輯器以便輸入本次提交的說明,(默認會啓用 shell 的環境變量 $EDITOR 所指定的軟件,通常都是 vim 或 emacs。固然也能夠按照第一章介紹的方式,使用 git config --global core.editor 命令設定你喜歡的編輯軟件。),若是啓用的是vim,打開後光標所在行就是輸入行,按 i
進入輸入模式(在光標所在行插入內容),輸入內容不用帶單引或雙引,按 Esc
退出輸入模式,按 Shift + :
進入命令模式,輸入 wq
保存並退出。
git commit -m 'add a file'
// 把暫存區裏的東西提交到當前分支,-m
參數後面輸入的是本次提交的說明。git commit -a -m 'some message'
// 加上 -a
選項,Git
就會自動把全部已經跟蹤過的文件暫存起來一併提交,從而跳過 git add
步驟。git commit --amend
// 此命令將使用當前的暫存區域快照提交。若是剛纔提交完沒有做任何改動,直接運行此命令的話,至關於有機會從新編輯提交說明,但將要提交的文件快照和以前的同樣。
git commit -m 'initial commit' git add forgotten_file git commit --amend
上面的三條命令最終只是產生一個提交,第二個提交命令修正了第一個的提交內容,若是給 commit
加上 -m
參數,那麼會覆蓋之前的說明,不加會彈出編輯器,能夠修改說明。
git push [remote-name] [branch-name]
git push origin master
// 把master分支當前版本推送到遠程倉庫對應的分支上。git push -f origin master
// 強制推送到遠程分支
git fetch orgin
// 將遠端的數據拉到本地倉庫,並不自動合併到當前工做分支。git pull
// 抓取遠程倉庫全部分支更新併合併到本地。git pull origin master
// 更新遠程分支 master
合併到本地 master
分支。
git status
// 可讓咱們時刻掌握倉庫當前的狀態。git diff <file>
// 查看具體的修改,顯示的格式正是Unix通用的diff格式,此命令比較的是工做目錄中當前文件和暫存區域快照之間的差別,也就是修改以後尚未暫存起來的變化內容(不加文件名顯示的是所有文件)。git diff --staged
// 此命令比較的是已經暫存起來的文件和上次提交時的快照之間的差別,該命令是1.6.1之後出現的,之前的版本用 git diff --cached
,功能是同樣的。git log
// 顯示提交日誌,從最近到最遠。git log -- <path>
// 某個目錄下的日誌,放在全部參數以後用 --
隔開路徑。git log -p -2
// -p
選項展開顯示每次提交的內容差別,用 -2
則僅顯示最近的兩次更新。git log --pretty=format:"%h - %an, %ar : %s"
// 定製要顯示的記錄格式,這樣的輸出便於後期編程提取分析。
%H
提交對象(commit)的完整哈希字串
%h
提交對象的簡短哈希字串
%T
樹對象(tree)的完整哈希字串
%t
樹對象的簡短哈希字串
%P
父對象(parent)的完整哈希字串
%p
父對象的簡短哈希字串
%an
做者(author)的名字,指的是實際做出修改的人
%ae
做者的電子郵件地址
%ad
做者修訂日期(能夠用 -date= 選項定製格式)
%ar
做者修訂日期,按多久之前的方式顯示
%cn
提交者(committer)的名字,最後將此工做成果提交到倉庫的人
%ce
提交者的電子郵件地址
%cd
提交日期
%cr
提交日期,按多久之前的方式顯示
%s
提交說明
git log --graph --pretty=oneline
// 多出一些 ASCII
字符串表示的簡單圖形,形象地展現了每一個提交所在的分支及其分化衍合狀況。
下面列出了 git log
一些其餘經常使用的選項及其釋義。
-p
按補丁格式顯示每一個更新之間的差別。
--stat
顯示每次更新的文件修改統計信息。
--shortstat
只顯示 --stat 中最後的行數修改添加移除統計。
--name-only
僅在提交信息後顯示已修改的文件清單。
--name-status
顯示新增、修改、刪除的文件清單。
--abbrev-commit
僅顯示 SHA-1 的前幾個字符,而非全部的 40 個字符。
--relative-date
使用較短的相對時間顯示(好比,「2 weeks ago」)。
--graph
顯示 ASCII 圖形表示的分支合併歷史。
--pretty
使用其餘格式顯示歷史提交信息。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式)。
-(n)
僅顯示最近的 n 條提交。
--since
,--after
僅顯示指定時間以後的提交,時間格式2.weeks
,2015-01-01
,2 years 1 day 3 minutes ago
等。
--until
,--before
僅顯示指定時間以前的提交。
--author
僅顯示指定做者相關的提交。
--committer
僅顯示指定提交者相關的提交。
--grep
搜索提交說明中的關鍵字,獲得同時知足這兩個選項搜索條件的提交,就必須用--all-match
選項。不然,知足任意一個條件的提交都會被匹配出來。
git reflog
// 能夠查看全部分支的全部操做記錄(包括commit和reset的操做),包括已經被刪除的commit記錄,git log則不能察看已經刪除了的commit記錄。git config --list
// 檢查已有的配置信息,有時候會看到重複的變量名,那就說明它們來自不一樣的配置文件(好比 /etc/gitconfig 和 ~/.gitconfig),不過最終 Git 實際採用的是最後一個。git config user.name
// 能夠直接查閱某個環境變量的設定,只要把特定的名字跟在後面便可。
git reset --hard HEAD^
// 回退到上一個版本,^^
就是退回上兩個版本,HEAD
指向的版本是當前版本。git reset --hard HEAD~100
// 退回到上100個版本。git reset --hard 112312
// 回到指定的版本112312,版本號不用寫全,只要能惟一肯定是哪一個版本就好了。git checkout -- <file>
// 重置選着的文件, 在工做區的修改,從上一個已提交的版本中更新回來,未提交的內容所有會回滾。git checkout -- .
// 重置工做區全部文件的全部修改,從上一個已提交的版本中更新回來,未提交的內容所有會回滾。git reset HEAD <file>
// 把暫存區的修改撤銷掉,從新放回工做區,git reset
命令既能夠回退版本,也能夠把暫存區的修改回退到工做區。當咱們用HEAD
時,表示最新的版本。git revert HEAD^
// 恢復到現有的提交,併產生新提交,和reset
不一樣的是,revert
是會產生新的提交記錄,而 reset
是把 HEAD
指向了之前的一個版本,並不會產生新提交。
git branch
// 查看分支,會列出全部分支,當前分支前面會標一個 *
號。git branch dev
// 建立名叫 dev
的分支。git checkout dev
// 切換到 dev
分支上。git checkout -b dev
// 建立+切換分支。git checkout -b dev origin/dev
// 做用是 checkout
遠程的dev分支,在本地起名爲 dev
分支,並切換到本地的 dev
分支git merge dev
// 合併分支,把 dev
分支合併到當前分支,快速合併模式 Fast forward
,「快速模式」,也就是直接把master指向dev的當前提交,若是兩個分支的文件都有改動是不能快速合併的。git merge --no-ff -m '合併分支' dev
// 把 dev
合併到當前分支,不用快速合併。git branch --set-upstream-to=origin/master master
// 做用是使你的本地master分支與遠程的origin/master分支關聯,關聯目的是若是在本地分支下操做: git pull, git push ,不須要指定在命令行指定遠程的分支。git rebase
// 移動分支。git branch -d dev
// 刪除分支。git branch -D feature-vulcan
// 強行刪除沒有被合併過的 feature-vulcan 分支。git branch -a
查看遠程分支,遠程分支會用紅色表示出來(若是你開了顏色支持的話)
在Git v1.7.0 以後,可使用這種語法刪除遠程分支:
git push origin --delete <branchName>
// 刪除遠程分支
git push origin :<branchName>
// 不然,可使用這種語法,推送一個空分支到遠程分支,其實就至關於刪除遠程分支
Git 使用的標籤有兩種類型:輕量級的(lightweight)和含附註的(annotated)。輕量級標籤就像是個不會變化的分支,實際上它就是個指向特定提交對象的引用。而含附註標籤,其實是存儲在倉庫中的一個獨立對象,它有自身的校驗和信息,包含着標籤的名字,電子郵件地址和日期,以及標籤說明,標籤自己也容許使用 GNU Privacy Guard (GPG) 來簽署或驗證。通常咱們都建議使用含附註型的標籤,以便保留相關信息;固然,若是隻是臨時性加註標籤,或者不須要旁註額外信息,用輕量級標籤也沒問題。
git tag
// 查看全部標籤信息,標籤是按字母排序的,不是按建立時間。git tag v1.0
// 在當前分支上建立一個 輕量級標籤
v1.0
標籤,默認是打在最新提交的commit上的。git tag v1.0 commit_id
// 在當前分支上的commit_id上打一個標籤 v1.0
,那麼之後你想查看該版本時,就可使用 v1.0
標籤名,而不是哈希值了。git tag -a <tagname> -m <message> <branchName>
// 建立帶有附註的標籤,用 -a
指定標籤名,-m
指定附註文字 <branchName> 指明把標籤打在那個分支上。git show <tagname>
// 查看標籤信息。git -d <tagname>
// 刪除標籤。git push origin <tagname>
// 推送某個標籤到遠程。git push origin --tags
// 推送全部未推送的標籤到遠程。git push origin :refs/tags/<tagname>
// 刪除某個遠程的標籤,要刪除遠程標籤,必需要先刪除本地。
在Git v1.7.0 以後,可使用這種語法刪除遠程Tag
git push origin --delete tag <tagname>
刪除遠程tag
git tag -d <tagname>
// 這是刪除tag的方法,推送一個空tag到遠程tag:git push origin :refs/tags/<tagname>
git stash
// git 把當前分支的工做區儲藏起來,切換到其餘分支不會影響儲藏的分支。git stash list
// 查看儲藏的工做區。git stash apply
// 恢復儲藏的工做區。git stash drop
// 刪除儲藏工做區。git stash pop
// 恢復+刪除儲藏工做區。
git mv file_from file_to
// mv
是移動文件,此處做用至關於更名。把 file_from
改成 file_to
。
git rm <filename>
// 從當前的工做空間中和索引中刪除文件。git rm --cached <filename>
// 把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然但願保留在當前工做目錄中。git rm log/\*.log
// 注意到星號 *
以前的反斜槓 \
,由於 Git 有它本身的文件模式擴展匹配方式,因此咱們不用 shell
來幫忙展開(譯註:實際上不加反斜槓也能夠運行,只不過按照 shell
擴展的話,僅僅刪除指定目錄下的文件而不會遞歸匹配。上面的例子原本就指定了目錄,因此效果等同,但下面的例子就會用遞歸方式匹配,因此必須加反斜槓。)。此命令刪除全部 log/
目錄下擴展名爲 .log
的文件。git rm \*~
// 會遞歸刪除當前目錄及其子目錄中全部 ~ 結尾的文件。git clean -f -d
// 做用是清理項目,-f 是強制清理文件的設置,-d 選項命令連文件夾一併清除。
git config --global core.editor vim // 默認編輯器修改成 Vim git config --global core.filemode false // 設置 git 無論理文件權限的變動