Git常見使用

來源:互聯網
上載者:User

原文地址: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》

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.