git基礎總結
在工作目錄中初始化新倉庫:$ git init
將文件添加到git:
格式:$ git add
舉例:
$ git add *.c
$ git add README
提交文件到git:
格式:$ git commit [-m '備注']
舉例:$ git commit -m 'initial project version'
設置自己喜歡的編輯軟件:默認會啟用 shell 的環境變量 $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
檢查當前文件狀態:$ git status
查看具體修改了什么地方:$ git diff
查看已經暫存起來的文件和上次提交時的快照之間的差異:$ git diff --cached
Git>=1.6.1還允許使用(效果是相同的):$ git diff --staged
git獲取幫助
格式:$ git help
舉例:要學習config命令可以怎么用,運行:$ git help config
格式:$ git?--help
舉例:$ git config --help
格式:$ man git-
舉例:$ man git-config
按q退出
忽略文件
忽略某些文件:創建.gitignore文件
內容舉例:
$ cat .gitignore
*.[oa] #告訴 Git 忽略所有以 .o 或 .a 結尾的文件
*~ #告訴 Git 忽略所有以波浪符(~)結尾的文件,許多文本編輯軟件(比如 Emacs)都用這樣的文件名保存副本
#此為注釋 – 將被 Git 忽略
#忽略所有 .a 結尾的文件
*.a
#但 lib.a 除外
!lib.a
#僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
/TODO
#忽略 build/ 目錄下的所有文件
build/
#會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
#忽略 doc/ 目錄下所有擴展名為 txt 的文件
doc/**/*.txt
**\通配符從 Git 版本 1.8.2 以上已經可以使用。
跳過使用暫存區域:$ git commit -a -m ''
移除文件
格式:git rm [] [--] ...
查看git rm具體參數,在命令行輸入:$ git rm
刪除文件:$ rm grit.gemspec
移除git上的文件的操作:$ git rm grit.gemspec
如果刪除之前修改過并且已經放到暫存區域的話,則必須要用強制刪除選項-f(譯注:即 force 的首字母),以防誤刪除文件后丟失修改的內容。
要移除跟蹤但不刪除文件:
$ git rm --cached readme.txt
也可以使用glob模式:
舉例:$ git rm log/\*.log
解釋:此命令刪除所有log/目錄下擴展名為 .log 的文件。
舉例:$ git rm \*~
解釋:會遞歸刪除當前目錄及其子目錄中所有~結尾的文件。
移動文件
在Git中對文件改名:
舉例:$ git mv file_from file_to
解釋:
其實,運行git mv就相當于運行了下面三條命令:
$ mv file_from file_to
$ git rm file_from
$ git add file_to
查看提交歷史
查看提交歷史命令:$ git log
常用命令:
舉例:$ git log -p -2
解釋:常用-p選項展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新
僅顯示簡要的增改行數統計:
$ git log --stat
常用命令:
舉例:$ git log --pretty=oneline
解釋:常用的--pretty選項,可以指定使用完全不同于默認格式的方式展示提交歷史。
--pretty的值有:oneline、short、full 、 fuller和format
oneline將每個提交放在一行顯示,這在提交數很大時非常有用。
format:可以定制要顯示的記錄格式,這樣的輸出便于后期編程提取分析。
舉例:$ 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 提交說明
其他3項展示的信息或多或少有些不同,請自己動手實踐一下看看效果如何。
用oneline或 format 時結合 --graph 選項,可以看到開頭多出一些 ASCII 字符串表示的簡單圖形,形象地展示了每個提交所在的分支及其分化衍合情況。在我們之前提到的 Grit 項目倉庫中可以看到:
$ 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其他常用的選項及其釋義:
-p 按補丁格式顯示每個更新之間的差異。
--word-diff 按word diff格式顯示差異。
--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(后跟指定格式)。
--oneline --pretty=oneline --abbrev-commit的簡化用法。
Git在輸出所有提交時會自動調用分頁程序(less),要看更早的更新只需翻到下頁即可。
另外還有按照時間作限制的選項,比如--since和 --until。下面的命令列出所有最近兩周內的提交:
舉例:$ git log --since=2.weeks
其他常用的類似選項:
-(n) 僅顯示最近的n條提交
--since, --after 僅顯示指定時間之后的提交。
--until, --before 僅顯示指定時間之前的提交。
--author 僅顯示指定作者相關的提交。
--committer 僅顯示指定提交者相關的提交。
請注意,如果要得到同時滿足這兩個選項搜索條件的提交,就必須用--all-match選項。否則,滿足任意一個條件的提交都會被匹配出來:
例子:
$ 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
上面的三條命令最終只是產生一個提交,第二個提交命令修正了第一個的提交內容。
不小心用git add .全加到了暫存區域,取消已經暫存的文件:git status 的命令輸出已經告訴了我們該怎么做:
取消暫存文件使用:git reset HEAD ...
$ git reset HEAD benchmarks.rb
取消對文件的修改,回到之前的狀態,git status同樣提示了具體的撤消方法
在第二個括號中,我們看到了拋棄文件修改的命令(至少在Git 1.6.1以及更高版本中會這樣提示,如果你還在用老版本,我們強烈建議你升級,以獲取最佳的用戶體驗),讓我們試試看:git checkout -- ...
$ git checkout -- benchmarks.rb
遠程倉庫的使用
查看當前的遠程庫
命令:$ git remote
實現:
克隆項目$ git clone git://github.com/schacon/ticgit.git
$ cd ticgit
$ git remote
顯示對應的克隆地址:
$ git remote -v
添加遠程倉庫
運行git remote add [shortname] [url]
$ git remote
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
現在可以用字符串pb指代對應的倉庫地址了。比如說,要抓取所有 Paul 有的,但本地倉庫沒有的信息,可以運行 git fetch pb:
$ git fetch pb
從遠程倉庫抓取數據
$ git fetch [remote-name]
注意:需要記住,fetch命令只是將遠端的數據拉到本地倉庫,并不自動合并到當前工作分支,只有當你確實準備好了,才能手工合并。
常用:
從原始克隆的遠端倉庫中抓取數據后,合并到工作目錄中的當前分支。
$ ?git pull
推送數據到遠程倉庫
命令:git push [remote-name] [branch-name]
例子:
$ git push origin master
或者
$ git push
查看遠程倉庫信息
命令: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
它告訴我們,運行git push時缺省推送的分支是什么(譯注:最后兩行)。它還顯示了有哪些遠端分支還沒有同步到本地(譯注:第六行的 caching 分支),哪些已同步到本地的遠端分支在遠端服務器上已被刪除(譯注:Stale tracking branches 下面的兩個分支),以及運行 git pull 時將自動合并哪些分支(譯注:前四行中列出的 issues 和 master 分支)。
遠程倉庫的刪除和重命名
修改遠程倉庫在本地的簡稱:
格式:git remote rename
例子(想把pb改成 paul):
$ git remote rename pb paul
$ git remote
注意,對遠程倉庫的重命名,也會使對應的分支名稱發生變化,原來的pb/master分支現在成了 paul/master。
刪除對應的遠端倉庫,可以運行git remote rm命令:
$ git remote rm paul
打標簽
列顯已有的標簽:
$ git tag
注意:顯示的標簽按字母順序排列,所以標簽的先后并不表示重要程度的輕重。
篩選標簽:
$ git tag -l 'v1.4.2.*'
新建標簽
一般我們都建議使用含附注型的標簽,以便保留相關信息;當然,如果只是臨時性加注標簽,或者不需要旁注額外信息,用輕量級標簽也沒問題。
輕量級的(lightweight)
創建標簽:
$ git tag v1.4-lw
$ git tag
查看標簽版本信息:$ git show v1.4-lw
含附注的(annotated)
創建標簽:用-a(譯注:取 annotated 的首字母)指定標簽名字即可:
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4
而-m選項則指定了對應的標簽說明,Git 會將此說明一同保存在標簽對象中。如果沒有給出該選項,Git 會啟動文本編輯軟件供你輸入標簽說明
查看相應標簽的版本信息,并連同顯示打標簽時的提交對象:
$ git show v1.4
簽署標簽
如果你有自己的私鑰,還可以用GPG來簽署標簽,只需要把之前的 -a 改為 -s (譯注: 取 signed 的首字母)即可:
$ git tag -s v1.5 -m 'my signed 1.5 tag'
查看標簽版本信息:$ git show v1.4
驗證標簽
使用git tag -v [tag-name](譯注:取 verify 的首字母)的方式驗證已經簽署的標簽。此命令會調用 GPG 來驗證簽名,所以你需要有簽署者的公鑰,存放在 keyring 中,才能驗證:
$ git tag -v v1.4.2.1
若是沒有簽署者的公鑰,會報告類似下面這樣的錯誤:
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'
后期加注標簽
你甚至可以在后期對早先的某次提交加注標簽。比如在下面展示的提交歷史中:
$ 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” 后為此項目打上版本號 v1.2
補標簽:$ git tag -a v1.2 9fceb02
列顯已有的標簽:$ git tag
查看相應標簽的版本信息,并連同顯示打標簽時的提交對象:$ git show v1.2
分享標簽
運行git push origin [tagname]
描述:
默認情況下,git push并不會把標簽傳送到遠端服務器上,只有通過顯式命令才能分享標簽到遠端倉庫。其命令格式如同推送分支,運行 git push origin [tagname] 即可:
$ git push origin v1.5
要一次推送所有本地新增的標簽上去:
$ git push origin --tags
技巧和竅門
自動補全
如果你用的是Bash shell,可以試試看 Git 提供的自動補全腳本。下載 Git 的源代碼,進入 contrib/completion 目錄,會看到一個 git-completion.bash 文件。將此文件復制到你自己的用戶主目錄中(譯注:按照下面的示例,還應改名加上點:cp git-completion.bash ~/.git-completion.bash),并把下面一行內容添加到你的 .bashrc 文件中:
source ~/.git-completion.bash
也可以為系統上所有用戶都設置默認使用此腳本。Mac上將此腳本復制到 /opt/local/etc/bash_completion.d 目錄中,Linux 上則復制到 /etc/bash_completion.d/ 目錄中。這兩處目錄中的腳本,都會在 Bash 啟動時自動加載。
如果在Windows上安裝了 msysGit,默認使用的 Git Bash 就已經配好了這個自動補全腳本,可以直接使用。
實例:
$ git co
commit config
此例中:
linux中鍵入 git co 然后連按兩次 Tab 鍵,會看到兩個相關的建議(命令) commit 和 config。繼而輸入 m 會自動完成 git commit 命令的輸入。
windows中鍵入 git co 然后連按兩次 Tab 鍵,會看到命令在變,選擇相應的命令即可。
實例:
比如運行git log的時候忘了相關選項的名字,可以輸入開頭的幾個字母,然后敲 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
現在,如果要輸入git commit只需鍵入 git ci 即可
比方說取消暫存文件時的輸入比較繁瑣,可以自己設置一下:
$ git config --global alias.unstage 'reset HEAD --'
這樣一來,下面的兩條命令完全等同:
$ git unstage fileA
$ git reset HEAD fileA
還經常設置last命令:
$ git config --global alias.last 'log -1 HEAD'
看最后一次的提交信息,就變得簡單多了:
$ git last
我們希望運行某個外部命令,而非Git的子命令,這個好辦,只需要在命令前加上 ! 就行。如果你自己寫了些處理 Git 倉庫信息的腳本的話,就可以用這種技術包裝起來。作為演示,我們可以設置用 git visual 啟動 gitk:
$ git config --global alias.visual '!gitk'