git基礎(chǔ)總結(jié)
在工作目錄中初始化新倉庫:$ git init
將文件添加到git:
格式:$ git add
舉例:
$ git add *.c
$ git add README
提交文件到git:
格式:$ git commit [-m '備注']
舉例:$ git commit -m 'initial project version'
設(shè)置自己喜歡的編輯軟件:默認(rèn)會(huì)啟用 shell 的環(huán)境變量 $EDITOR 所指定的軟件挪圾,一般都是 vim 或 emacs瘫怜。
git config --global core.editor
從倉庫克隆到本地的命令:
格式:$ git clone [url] [folder_path]
舉例:$ git clone git://github.com/schacon/grit.git demo_folder
查看分支:
格式:$ git branch [-a]
舉例(所有分支):$ git branch -a
舉例(本地分支):$ git branch
檢查當(dāng)前文件狀態(tài):$ git status
查看具體修改了什么地方:$ git diff
查看已經(jīng)暫存起來的文件和上次提交時(shí)的快照之間的差異:$ git diff --cached
Git>=1.6.1還允許使用(效果是相同的):$ git diff --staged
git獲取幫助
格式:$ git help
舉例:要學(xué)習(xí)config命令可以怎么用新娜,運(yùn)行:$ git help config
格式:$ git?--help
舉例:$ git config --help
格式:$ man git-
舉例:$ man git-config
按q退出
忽略文件
忽略某些文件:創(chuàng)建.gitignore文件
內(nèi)容舉例:
$ cat .gitignore
*.[oa] #告訴 Git 忽略所有以 .o 或 .a 結(jié)尾的文件
*~ #告訴 Git 忽略所有以波浪符(~)結(jié)尾的文件朝捆,許多文本編輯軟件(比如 Emacs)都用這樣的文件名保存副本
#此為注釋 – 將被 Git 忽略
#忽略所有 .a 結(jié)尾的文件
*.a
#但 lib.a 除外
!lib.a
#僅僅忽略項(xiàng)目根目錄下的 TODO 文件,不包括 subdir/TODO
/TODO
#忽略 build/ 目錄下的所有文件
build/
#會(huì)忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
#忽略 doc/ 目錄下所有擴(kuò)展名為 txt 的文件
doc/**/*.txt
**\通配符從 Git 版本 1.8.2 以上已經(jīng)可以使用坪仇。
跳過使用暫存區(qū)域:$ git commit -a -m ''
移除文件
格式:git rm [] [--] ...
查看git rm具體參數(shù)嚷兔,在命令行輸入:$ git rm
刪除文件:$ rm grit.gemspec
移除git上的文件的操作:$ git rm grit.gemspec
如果刪除之前修改過并且已經(jīng)放到暫存區(qū)域的話,則必須要用強(qiáng)制刪除選項(xiàng)-f(譯注:即 force 的首字母)类腮,以防誤刪除文件后丟失修改的內(nèi)容臊泰。
要移除跟蹤但不刪除文件:
$ git rm --cached readme.txt
也可以使用glob模式:
舉例:$ git rm log/\*.log
解釋:此命令刪除所有l(wèi)og/目錄下擴(kuò)展名為 .log 的文件。
舉例:$ git rm \*~
解釋:會(huì)遞歸刪除當(dāng)前目錄及其子目錄中所有~結(jié)尾的文件蚜枢。
移動(dòng)文件
在Git中對(duì)文件改名:
舉例:$ git mv file_from file_to
解釋:
其實(shí)缸逃,運(yùn)行g(shù)it mv就相當(dāng)于運(yùn)行了下面三條命令:
$ mv file_from file_to
$ git rm file_from
$ git add file_to
查看提交歷史
查看提交歷史命令:$ git log
常用命令:
舉例:$ git log -p -2
解釋:常用-p選項(xiàng)展開顯示每次提交的內(nèi)容差異,用 -2 則僅顯示最近的兩次更新
僅顯示簡要的增改行數(shù)統(tǒng)計(jì):
$ git log --stat
常用命令:
舉例:$ git log --pretty=oneline
解釋:常用的--pretty選項(xiàng)厂抽,可以指定使用完全不同于默認(rèn)格式的方式展示提交歷史需频。
--pretty的值有:oneline、short筷凤、full 昭殉、 fuller和format
oneline將每個(gè)提交放在一行顯示,這在提交數(shù)很大時(shí)非常有用嵌施。
format:可以定制要顯示的記錄格式饲化,這樣的輸出便于后期編程提取分析。
舉例:$ git log --pretty=format:"%h - %an, %ar : %s"
常用的格式占位符寫法及其代表的意義:
%H 提交對(duì)象(commit)的完整哈希字串
%h 提交對(duì)象的簡短哈希字串
%T 樹對(duì)象(tree)的完整哈希字串
%t 樹對(duì)象的簡短哈希字串
%P 父對(duì)象(parent)的完整哈希字串
%p 父對(duì)象的簡短哈希字串
%an 作者(author)的名字
%ae 作者的電子郵件地址
%ad 作者修訂日期(可以用-date=選項(xiàng)定制格式)
%ar 作者修訂日期吗伤,按多久以前的方式顯示
%cn 提交者(committer)的名字
%ce 提交者的電子郵件地址
%cd 提交日期
%cr 提交日期吃靠,按多久以前的方式顯示
%s 提交說明
其他3項(xiàng)展示的信息或多或少有些不同,請(qǐng)自己動(dòng)手實(shí)踐一下看看效果如何足淆。
用oneline或 format 時(shí)結(jié)合 --graph 選項(xiàng)巢块,可以看到開頭多出一些 ASCII 字符串表示的簡單圖形礁阁,形象地展示了每個(gè)提交所在的分支及其分化衍合情況。在我們之前提到的 Grit 項(xiàng)目倉庫中可以看到:
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* ?5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
* ?11d191e Merge branch 'defunkt' into local
git log其他常用的選項(xiàng)及其釋義:
-p 按補(bǔ)丁格式顯示每個(gè)更新之間的差異族奢。
--word-diff 按word diff格式顯示差異姥闭。
--stat 顯示每次更新的文件修改統(tǒng)計(jì)信息。
--shortstat 只顯示--stat中最后的行數(shù)修改添加移除統(tǒng)計(jì)越走。
--name-only 僅在提交信息后顯示已修改的文件清單棚品。
--name-status 顯示新增、修改廊敌、刪除的文件清單铜跑。
--abbrev-commit 僅顯示SHA-1的前幾個(gè)字符,而非所有的 40 個(gè)字符骡澈。
--relative-date 使用較短的相對(duì)時(shí)間顯示(比如锅纺,“2 weeks ago”)。
--graph 顯示ASCII圖形表示的分支合并歷史肋殴。
--pretty 使用其他格式顯示歷史提交信息囤锉。可用的選項(xiàng)包括oneline护锤,short官地,full,fuller 和 format(后跟指定格式)烙懦。
--oneline --pretty=oneline --abbrev-commit的簡化用法区丑。
Git在輸出所有提交時(shí)會(huì)自動(dòng)調(diào)用分頁程序(less),要看更早的更新只需翻到下頁即可修陡。
另外還有按照時(shí)間作限制的選項(xiàng)沧侥,比如--since和 --until。下面的命令列出所有最近兩周內(nèi)的提交:
舉例:$ git log --since=2.weeks
其他常用的類似選項(xiàng):
-(n) 僅顯示最近的n條提交
--since, --after 僅顯示指定時(shí)間之后的提交魄鸦。
--until, --before 僅顯示指定時(shí)間之前的提交宴杀。
--author 僅顯示指定作者相關(guān)的提交。
--committer 僅顯示指定提交者相關(guān)的提交拾因。
請(qǐng)注意旺罢,如果要得到同時(shí)滿足這兩個(gè)選項(xiàng)搜索條件的提交,就必須用--all-match選項(xiàng)绢记。否則扁达,滿足任意一個(gè)條件的提交都會(huì)被匹配出來:
例子:
$ git log --pretty="%h - %an, %ar : %s" --author=gitster --after="2008-10-01"
???--before="2008-11-01" --no-merges -- t/
撤消操作
修改最后一次提交:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
上面的三條命令最終只是產(chǎn)生一個(gè)提交,第二個(gè)提交命令修正了第一個(gè)的提交內(nèi)容蠢熄。
不小心用git add .全加到了暫存區(qū)域跪解,取消已經(jīng)暫存的文件:git status 的命令輸出已經(jīng)告訴了我們?cè)撛趺醋觯?/p>
取消暫存文件使用:git reset HEAD ...
$ git reset HEAD benchmarks.rb
取消對(duì)文件的修改,回到之前的狀態(tài)签孔,git status同樣提示了具體的撤消方法
在第二個(gè)括號(hào)中叉讥,我們看到了拋棄文件修改的命令(至少在Git 1.6.1以及更高版本中會(huì)這樣提示窘行,如果你還在用老版本,我們強(qiáng)烈建議你升級(jí)图仓,以獲取最佳的用戶體驗(yàn))罐盔,讓我們?cè)囋嚳矗篻it checkout -- ...
$ git checkout -- benchmarks.rb
遠(yuǎn)程倉庫的使用
查看當(dāng)前的遠(yuǎn)程庫
命令:$ git remote
實(shí)現(xiàn):
克隆項(xiàng)目$ git clone git://github.com/schacon/ticgit.git
$ cd ticgit
$ git remote
顯示對(duì)應(yīng)的克隆地址:
$ git remote -v
添加遠(yuǎn)程倉庫
運(yùn)行g(shù)it remote add [shortname] [url]
$ git remote
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
現(xiàn)在可以用字符串pb指代對(duì)應(yīng)的倉庫地址了。比如說救崔,要抓取所有 Paul 有的惶看,但本地倉庫沒有的信息,可以運(yùn)行 git fetch pb:
$ git fetch pb
從遠(yuǎn)程倉庫抓取數(shù)據(jù)
$ git fetch [remote-name]
注意:需要記住六孵,fetch命令只是將遠(yuǎn)端的數(shù)據(jù)拉到本地倉庫碳竟,并不自動(dòng)合并到當(dāng)前工作分支,只有當(dāng)你確實(shí)準(zhǔn)備好了狸臣,才能手工合并。
常用:
從原始克隆的遠(yuǎn)端倉庫中抓取數(shù)據(jù)后昌执,合并到工作目錄中的當(dāng)前分支烛亦。
$ ?git pull
推送數(shù)據(jù)到遠(yuǎn)程倉庫
命令:git push [remote-name] [branch-name]
例子:
$ git push origin master
或者
$ git push
查看遠(yuǎn)程倉庫信息
命令:git remote show [remote-name]
例子:
$ git remote show origin
* remote origin
??URL: git@github.com:defunkt/github.git
??Remote branch merged with 'git pull' while on branch issues
????issues
??Remote branch merged with 'git pull' while on branch master
????master
??New remote branches (next fetch will store in remotes/origin)
????caching
??Stale tracking branches (use 'git remote prune')
????libwalker
????walker2
??Tracked remote branches
????acl
????apiv2
????dashboard2
????issues
????master
????postgres
??Local branch pushed with 'git push'
????master:master
它告訴我們,運(yùn)行g(shù)it push時(shí)缺省推送的分支是什么(譯注:最后兩行)懂拾。它還顯示了有哪些遠(yuǎn)端分支還沒有同步到本地(譯注:第六行的 caching 分支)煤禽,哪些已同步到本地的遠(yuǎn)端分支在遠(yuǎn)端服務(wù)器上已被刪除(譯注:Stale tracking branches 下面的兩個(gè)分支),以及運(yùn)行 git pull 時(shí)將自動(dòng)合并哪些分支(譯注:前四行中列出的 issues 和 master 分支)岖赋。
遠(yuǎn)程倉庫的刪除和重命名
修改遠(yuǎn)程倉庫在本地的簡稱:
格式:git remote rename
例子(想把pb改成 paul):
$ git remote rename pb paul
$ git remote
注意檬果,對(duì)遠(yuǎn)程倉庫的重命名,也會(huì)使對(duì)應(yīng)的分支名稱發(fā)生變化唐断,原來的pb/master分支現(xiàn)在成了 paul/master选脊。
刪除對(duì)應(yīng)的遠(yuǎn)端倉庫,可以運(yùn)行g(shù)it remote rm命令:
$ git remote rm paul
打標(biāo)簽
列顯已有的標(biāo)簽:
$ git tag
注意:顯示的標(biāo)簽按字母順序排列脸甘,所以標(biāo)簽的先后并不表示重要程度的輕重恳啥。
篩選標(biāo)簽:
$ git tag -l 'v1.4.2.*'
新建標(biāo)簽
一般我們都建議使用含附注型的標(biāo)簽,以便保留相關(guān)信息丹诀;當(dāng)然钝的,如果只是臨時(shí)性加注標(biāo)簽,或者不需要旁注額外信息铆遭,用輕量級(jí)標(biāo)簽也沒問題硝桩。
輕量級(jí)的(lightweight)
創(chuàng)建標(biāo)簽:
$ git tag v1.4-lw
$ git tag
查看標(biāo)簽版本信息:$ git show v1.4-lw
含附注的(annotated)
創(chuàng)建標(biāo)簽:用-a(譯注:取 annotated 的首字母)指定標(biāo)簽名字即可:
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4
而-m選項(xiàng)則指定了對(duì)應(yīng)的標(biāo)簽說明,Git 會(huì)將此說明一同保存在標(biāo)簽對(duì)象中枚荣。如果沒有給出該選項(xiàng)碗脊,Git 會(huì)啟動(dòng)文本編輯軟件供你輸入標(biāo)簽說明
查看相應(yīng)標(biāo)簽的版本信息,并連同顯示打標(biāo)簽時(shí)的提交對(duì)象:
$ git show v1.4
簽署標(biāo)簽
如果你有自己的私鑰橄妆,還可以用GPG來簽署標(biāo)簽望薄,只需要把之前的 -a 改為 -s (譯注: 取 signed 的首字母)即可:
$ git tag -s v1.5 -m 'my signed 1.5 tag'
查看標(biāo)簽版本信息:$ git show v1.4
驗(yàn)證標(biāo)簽
使用git tag -v [tag-name](譯注:取 verify 的首字母)的方式驗(yàn)證已經(jīng)簽署的標(biāo)簽疟游。此命令會(huì)調(diào)用 GPG 來驗(yàn)證簽名,所以你需要有簽署者的公鑰痕支,存放在 keyring 中颁虐,才能驗(yàn)證:
$ git tag -v v1.4.2.1
若是沒有簽署者的公鑰,會(huì)報(bào)告類似下面這樣的錯(cuò)誤:
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'
后期加注標(biāo)簽
你甚至可以在后期對(duì)早先的某次提交加注標(biāo)簽卧须。比如在下面展示的提交歷史中:
$ git log --pretty=oneline
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
在提交“updated rakefile” 后為此項(xiàng)目打上版本號(hào) v1.2
補(bǔ)標(biāo)簽:$ git tag -a v1.2 9fceb02
列顯已有的標(biāo)簽:$ git tag
查看相應(yīng)標(biāo)簽的版本信息另绩,并連同顯示打標(biāo)簽時(shí)的提交對(duì)象:$ git show v1.2
分享標(biāo)簽
運(yùn)行g(shù)it push origin [tagname]
描述:
默認(rèn)情況下,git push并不會(huì)把標(biāo)簽傳送到遠(yuǎn)端服務(wù)器上花嘶,只有通過顯式命令才能分享標(biāo)簽到遠(yuǎn)端倉庫笋籽。其命令格式如同推送分支,運(yùn)行 git push origin [tagname] 即可:
$ git push origin v1.5
要一次推送所有本地新增的標(biāo)簽上去:
$ git push origin --tags
技巧和竅門
自動(dòng)補(bǔ)全
如果你用的是Bash shell椭员,可以試試看 Git 提供的自動(dòng)補(bǔ)全腳本车海。下載 Git 的源代碼,進(jìn)入 contrib/completion 目錄隘击,會(huì)看到一個(gè) git-completion.bash 文件侍芝。將此文件復(fù)制到你自己的用戶主目錄中(譯注:按照下面的示例,還應(yīng)改名加上點(diǎn):cp git-completion.bash ~/.git-completion.bash)埋同,并把下面一行內(nèi)容添加到你的 .bashrc 文件中:
source ~/.git-completion.bash
也可以為系統(tǒng)上所有用戶都設(shè)置默認(rèn)使用此腳本州叠。Mac上將此腳本復(fù)制到 /opt/local/etc/bash_completion.d 目錄中,Linux 上則復(fù)制到 /etc/bash_completion.d/ 目錄中凶赁。這兩處目錄中的腳本咧栗,都會(huì)在 Bash 啟動(dòng)時(shí)自動(dòng)加載。
如果在Windows上安裝了 msysGit虱肄,默認(rèn)使用的 Git Bash 就已經(jīng)配好了這個(gè)自動(dòng)補(bǔ)全腳本致板,可以直接使用。
實(shí)例:
$ git co
commit config
此例中:
linux中鍵入 git co 然后連按兩次 Tab 鍵咏窿,會(huì)看到兩個(gè)相關(guān)的建議(命令) commit 和 config可岂。繼而輸入 m 會(huì)自動(dòng)完成 git commit 命令的輸入。
windows中鍵入 git co 然后連按兩次 Tab 鍵翰灾,會(huì)看到命令在變缕粹,選擇相應(yīng)的命令即可。
實(shí)例:
比如運(yùn)行g(shù)it log的時(shí)候忘了相關(guān)選項(xiàng)的名字纸淮,可以輸入開頭的幾個(gè)字母平斩,然后敲 Tab 鍵看看有哪些匹配的:
$ git log --s
Git命令別名
取別名
例子:
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
現(xiàn)在,如果要輸入git commit只需鍵入 git ci 即可
比方說取消暫存文件時(shí)的輸入比較繁瑣咽块,可以自己設(shè)置一下:
$ git config --global alias.unstage 'reset HEAD --'
這樣一來绘面,下面的兩條命令完全等同:
$ git unstage fileA
$ git reset HEAD fileA
還經(jīng)常設(shè)置last命令:
$ git config --global alias.last 'log -1 HEAD'
看最后一次的提交信息,就變得簡單多了:
$ git last
我們希望運(yùn)行某個(gè)外部命令,而非Git的子命令揭璃,這個(gè)好辦晚凿,只需要在命令前加上 ! 就行。如果你自己寫了些處理 Git 倉庫信息的腳本的話瘦馍,就可以用這種技術(shù)包裝起來歼秽。作為演示,我們可以設(shè)置用 git visual 啟動(dòng) gitk:
$ git config --global alias.visual '!gitk'