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 # 檢視指定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也沒用。
$ 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 # 返檔到指定commit版本
git reset 不僅作用於工作目錄,而且作用於index檔案。git reset有三種方式,分別為soft, hard和mixed方式。
$ git reset --soft # 既不影響index也不影響工作目錄,也就是說用git diff --cached還是可以看到撤消的改動
$ git reset --mixed # index改變,但工作目錄不變
$ git reset --hard ,# 將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 # commit一次和指定commit相反的改動
$ git revert -n # 和前一命令一樣,但不提交
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@等
當碰到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教程
repo和git
活靈活現用git-技巧篇
《version control with git》
《git community book》
常用命令 Git 常用命令大全
安裝教程可參照 廖雪峰老師的安裝教程。git config 在git中,使用git config 命令來配置 git 的配置檔案,git配置級別主要有3類 1 倉庫級別 local 本地 git 倉庫級別配置檔案,作用於當前倉庫。優先順序最高 2 使用者級別 global,全域性配置檔案,作用於所有...
git 常用命令
檢視是否存在檔案需要上傳 git status git add git commit m 建立遠端倉庫 git remote add origin 116.255.146.153 ruby cd work daily project.git 更新git fetch 116.255.146.153 r...
git常用命令
詳細 1,git log p 命令來顯示每一次提交與其父節點提交內容之間快照的差異。2,為了檢視載入 staged 而並未提交 not committed 的內容差異,可以使用 git diff stage 命令 在git 1.6之前的版本中,使用 cached 適應情形 在執行git commit...