原文地址:http://blog.csdn.net/ariesjzj/article/details/7747876
Git和SVN,CVS一樣,是一種原始程式碼控制系統。和後兩者不同的是,它不僅可以集中式管理,也可以以分布式的形式工作,即所有操作都在本地,速度快,且本地提交不會影響共用程式碼倉庫。Git功能很多,本文列了一些常見用法。
配置和建立代碼倉庫
設定提交時的編輯器(預設是nano):
$ export GIT_EDITOR=vim
或者
$ git config --global core.editor vim
設定檔案比較工具:
$ git config --global merge.tool vimdiff
$ git config --global diff.tool vimdiff
$ git config --global difftool.prompt No
忽略檔案許可權:
$ git config core.filemode false
配置個人資訊,即提交時顯示的作者資訊,如:
$ git config user.name "jzj"
$ git config user.email "jzj@domain"
這些git config命令其實是寫到~/.gitconfig這個設定檔中,直接寫這個檔案效果是一樣的,比如要使git命令的輸出有高亮,則在.gitconfig中加
[color]
ui = auto
建立一個新Git倉庫:
$ git init
查詢資訊(inquiry)
這部分和SVN中對應命令很像
查看配置資訊:
$ git config --list
查看倉庫的狀態資訊:
$ git status
查看兩個版本的差異
$ git diff
由於Git中引入了index的概念,因此和svn相比,git diff可分為加--cached和不加兩種:
$ git diff # 顯示本地改動但沒有stage的改動
$ git diff --cached # 顯示已經stage過的本地改動,也就是如果執行git commit會提交的改動
$ git diff master..test # 兩個branch間的差別
$ git diff --stat # 顯示統計資訊
曆史資訊
$ git log
$ git log -p # 顯示patch
$ git log --stat # 行數統計
$ git log --topo-order --graph # 用簡單圖形顯示commit間的拓撲關係
$ git log -n # 僅列出前n個
$ git show-branch --more=n # 前n個提交曆史資訊
查看更改內容
$ git show <sha> # 查看指定commit的改動
另外,對工作目錄中檔案操作有git ls-files,git grep等命令。
提交(commit)
和SVN不同的是,Git中的Checkin分兩步,即stage和commit。如:
$ git add a.c # stage改動,更改index(index是一個臨時動態檔案,描述了整個工程目錄,並記錄了作了哪些改動)。stage過的改動會在git diff --cached中顯示出來。
$ git commit -m "comments" # 提交改動
加-a參數可以將前面兩步合二為一:
$ git commit -a
但它僅限於tracked的檔案。比如建立一個檔案但沒有git add過,它還是untracked狀態,那加-a也沒用。
補丁(patch)
產生補丁
$ git format-patch -n master # 產生最近n次commit的patch
$ git format-patch master~4..master~2 # 產生master~4和master~2之間差異的patch
$ git format-patch -s <sha> # 產生指定commit的patch,加簽名
應用補丁
git am 用了git apply,用它打補丁會產生commit資訊。如果出現錯誤
previous rebase directory ../.git/rebase-apply still exists but mbox given
可以用
$ git am --abort
前面方法用於已經commit的更改,如果是用git diff產生的本地修改的patch,則可以用下面方法:
產生本地修改的patch:
$ git diff | tee diff.patch
應用patch時用:
$ git apply --ignore-space-change --ignore-whitespace diff.patch
或者
$ patc -p1 < diff.patch
當然這更像Svn中的習慣,在git裡反正是本地提交,提交的成本很低,所以可以先提交再產生patch。
branch之間打patch用:
$ git cherry-pick
撤消(undo)
和撤消相關的有三個命令:git checkout, git revert和git reset。
如取消本地沒有stage過的改動(即沒有通過git add等命令記錄到index中的改動):
$ git checkout . # index不變,工作目錄改變
再如
$ git checkout HEAD^ # 返檔到前一次commit的版本
$ git checkout <sha> # 返檔到指定commit版本
git reset 不僅作用於工作目錄,而且作用於index檔案。git reset有三種方式,分別為soft, hard和mixed方式。
$ git reset --soft <sha> # 既不影響index也不影響工作目錄,也就是說用git diff --cached還是可以看到撤消的改動
$ git reset --mixed <sha> # index改變,但工作目錄不變
$ git reset --hard <sha>,# 將index和工作目錄都恢複到指定版本。相當於svn revert -R *
撤消後,git log無法看到撤消的commit曆史,但可以用下面命令看到:
$ git reflog
git checkout和git reset --hard的區別在於:
git checkout . # 清除本地更改,但不清除index。舉例來說,之前git add但沒commit的作用還在。
git reset --hard HEAD # 清除本地更改,包括index。所以git add過的也清除了。
git revert 進行一次與指定版本相反的commit。如:
$ git revert <sha> # commit一次和<sha>指定commit相反的改動
$ git revert -n <sha> # 和前一命令一樣,但不提交
git revert可以把中間的commit作用消除,且git revert不會改變已有的記錄。當項目是基於已有Git倉庫時這很有用。
如果只是想修改commit時的提交資訊,可以用:
$ git commit --amend
分支(branch)
建立
$ git branch new_branch
或
$ git checkout -b new_branch
查看
$ git show-branch
提取
$ git checkout new_branch
刪除
$ git branch -d new_branch
歸併其它分支
$ git merge branchname
雜項:
某些檔案不需要讓Git去track,可以在.gitignore中設定忽略這些檔案。
指定特定檔案用--,如:
$ git checkout -- dir/main.c
Git有幾個內建的符號索引指標:
HEAD:永遠指向當前分支的最近一次commit
ORIG_HEAD:git reset或git merge後,原來的HEAD被存在這裡
FETCH_HEAD:git fetch後所有分支的頭索引指標
MERGE_HEAD:git merge時另一分支的頭索引指標
相對索引:HEAD^ HEAD^^ HEAD~2 HEAD@{2}等
如果手頭的工作做了一半,但有一個小的但緊急的bug要fix,可以用git stash。它像一個棧一樣將當前的工作上下文push到棧中,當bug fix完了再pop出來。
$ git stash "current work"
$ git commit -a -m "trivial bug fix"
$ git stash apply
gitk:圖形化的git diff
當碰到regression時,可以用git bisect和git blame。前者用來尋找問題從哪個版本開始出現,後者列出每行代碼的修改者和時間。
分布式管理
複製代碼倉庫
$ git clone /tmp/repo repo # 在目前的目錄下建立/tmp/repo的代碼倉庫拷貝
複製遠程代碼倉庫(如使用者名稱zjin,主機名稱zjin-machine)
$ git clone zjin@zjin-machine:/home/zjin/repo
向遠程代碼倉庫提交
$ git push /tmp/repo master # 將本地master分支中的改動提交到/tmp/repo中
從遠程代碼倉庫同步
$ git pull /tmp/repo master # 將/tmp/repo中的改動同步到本地的master分支中
該命令相當於git fetch 加 git merge
一些相關資料:
給SVN使用者的Git教程 http://git.or.cz/course/svn.html
Repo和Git http://source.android.com/source/version-control.html
活靈活現用Git-技巧篇 http://phoenixtoday.blogbus.com/logs/35149540.html
《Version Control with Git》
《Git Community Book》