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 global unset https.proxygit pull 獲取最新 git checkout master 切換到主分支 git merge feature branch 將功能開發分支的 合併到主分支 修正 衝突,如果存在 衝突的話 git d ...
git 使用技巧
1.working directory 工作目錄 2.git directory git庫目錄 3.git index git索引 git index 可以看作是工作目錄和git庫目錄之間的暫存區,和staging area是相同的意思。最簡單的檢視目前什麼內容在index中的方法是使用git st...
git 使用技巧
參考github官方文件 配置了https和ssh連線。略。可參見github官方文件 進入專案根目錄,輸入 git init 還是在專案根目錄中輸入 git add 還是在專案根目錄中輸入 git commit m 第一次提交,建立專案。在本地專案倉庫的根目錄中,輸入 git remote add...