Git是何方神聖?
Git是用C語言開發的分布版本控制系統。版本控制系統可以保留一個文件集合的歷史記錄,並能回滾文件集合到另一個狀態(歷史記錄狀態)。另一個狀態可以是不同的文件,也可以是不同的文件內容。舉個例子,你可以將文件集合轉換到兩天之前的狀態,或者你可以在生產代碼和實驗性質的代碼之間進行切換。文件集合往往被稱作是“源代碼”。在一個分布版本控制系統中,每個人都有一份完整的源代碼(包括源代碼所有的歷史記錄信息),而且可以對這個本地的數據進行操作。分布版本控制系統不需要一個集中式的代碼倉庫。
當你對本地的源代碼進行了修改,你可以標注他們跟下一個版本相關(將他們加到index中),然后提交到倉庫中來(commit)。Git保存了所有的版本信息,所以你可以轉換你的源代碼到任何的歷史版本。你可以對本地的倉庫進行代碼的提交,然后與其他的倉庫進行同步。你可以使用Git來進行倉庫的克隆(clone)操作,完整的復制一個已有的倉庫。倉庫的所有者可以通過push操作(推送變更到別處的倉庫)或者Pull操作(從別處的倉庫拉取變更)來同步變更。
Git支持分支功能(branch)。如果你想開發一個新的產品功能,你可以建立一個分支,對這個分支的進行修改,而不至於會影響到主支上的代碼。
Git提供了命令行工具;這個教程會使用命令行。你也可以找到圖形工具,譬如與Eclipse配套的EGit工具,但是這些都不會在這個教程中進行描述。
Git運行環境
系統:windows
軟件:Git-1.8.4-preview20130916.exe
Windows安裝git很簡單,打開安裝文件exe,按提示下一步安裝到底OK。
github是一個git項目托管網站
注冊地址:https://github.com/signup/free
系統:liunx
軟件:git-1.8.4.2.tar.gz
Mac OS X安裝
由於mac git的地址http://code.google.com/p/git-osx-installer/被牆,被迫使用源碼安裝,源碼可以從http://kernel.org/pub/software/scm/git/下載,編譯源碼需要先安裝xcode,參考http://developer.apple.com。
編譯安裝
1、解壓
tar xjvf git-1.7.4.1.tar.tar.bz2
2. 編譯
cd git-1.7.4.1
./configure --prefix=/usr/local
make
3.安裝
sudo make install
等安裝完成后輸入
$ which git //查看安裝目錄
$ git –version //查看版本
檢查安裝是否成功,如果看到如圖的輸出,安裝就成功了。
Git安裝git
tar zxvf git-1.8.4.2.tar.gz
cd git-{date} 我這里是git-1.8.4.2的版本,所以我的命令是cd git-1.8.4.2/
autoconf
./configure
make
make install
make和make install在這里最好分開執行,免得有錯不知道.
git --version
git version 1.7.10
首先注冊一個github賬號
打開git bash進入命令窗口
$ cd ~/.ssh//檢查計算機ssh密鑰
如果沒有提示:No such file or directory 說明你不是第一次使用git,執行下面的操作,清理原有ssh密鑰
$ ls//查看目錄下是否存在ssh密鑰
生成ssh密鑰
$ ssh-keygen -t rsa -C ‘xxx@xxx.xxx’//填寫email地址,然后一直“回車”ok
$ cat id_rsa.pub //查看生成ssh密鑰內容復制
用申請的github賬號登陸github系統。點擊右上角的 Account Settings--->SSH Public keys ---> add another public keys,把復制的ssh密鑰填寫進去,點擊 add key 就ok了。
接着打開git ,測試連接是否成功
$ ssh -T git@github.com
如果提示:Hi defnngj You've successfully authenticated, but GitHub does not provide shell access. 說明你連接成功了。
設置用戶信息
$ git config --global user.name "HavenShen"//給自己起個用戶名
$ git config --global user.email "havenshen@gmail.com"//填寫自己的郵箱
回到github首頁,點擊頁面右下角“New Repository”。
填寫項目信息:
project name: hello world
description : my first project
點擊“Create Repository” ; 現在完成了一個項目在github上的創建。
克隆項目
我們需要使用git在本地克隆一個相同的項目。
打開git bash進入命令窗口
$ git clone git@github.com:HavenShen/hello-world.git
使用git clone git@github.com:HavenShen/hello-world.git就把git遠程倉庫的項目克隆到本地了。
初始化項目
$ cd hello-world//進入項目目錄
$ git init//命令主要用於創建一個空的git倉庫或者重新初始化一個已存在的倉庫。
測試上傳一個文件
基本操作
$ touch hello-world.txt//創建一個txt文件
$ git add hello-world.txt//執行add添加操作
$ git commit -m 'first commit'//提交更新,並注釋信息“first commit”
$ git push -u origin master //將本地項目更新到github項目上去
進入github網站查看遠程倉庫里就多了一個 hello-world.txt文件。
分支
查看分支
$ git branch//查看分支
以上master是默認主干*表示當前工作目錄在master主干操作
創建新的分枝
$ git branch experiment//創建新分支
$ git branch//查看分支
可以看到現在多了一個experiment分支。
切換分支
$ git checkout experiment//切換到experiment分支
以上命令就切換到experiment分支目錄下可以進行操作了。
$ touch branch.txt//創建一個txt文件
$ git add branch.txt//執行add添加操作
$ git commit -m 'branch commit'//提交更新,並注釋信息“branch commit”
$ git push -u origin experiment//更新到github experiment分支項目上去
打開github官網查看hello-world遠程倉庫
Master倉庫
Experiment倉庫
可以看出experiment倉庫比master倉庫多了一個branch.txt文件也就是我們剛在experiment倉庫中創建、更新、提交、發布到遠程倉庫的branch.txt
合並和移除無用分枝
$ git checkout master//切換到master倉庫
$ git merge experiment//把experiment倉庫合並到master倉庫
$ git push -u origin master//發布遠程倉庫master上
上圖可以看到master多了一個從experiment分支中合並過來的一個branch.txt文件。
刪除分支
$ git branch –d experiment//刪除分支
$ git branch//查看分支
上圖可以看到experiment分支已經刪除了。
以上操作基本上可以滿足日常操作。
附:
標簽
標簽可以針對某一時間點的版本做標記,常用於版本發布。
列出標簽
$ git tag # 在控制台打印出當前倉庫的所有標簽
$ git tag -l 'v0.1.*' # 搜索符合模式的標簽
打標簽
git標簽分為兩種類型:輕量標簽和附注標簽。輕量標簽是指向提交對象的引用,附注標簽則是倉庫中的一個獨立對象。建議使用附注標簽。
# 創建輕量標簽
$ git tag v0.1.2-light
# 創建附注標簽
$ git tag -a v0.1.2 -m "發布0.1.2版本"
創建輕量標簽不需要傳遞參數,直接指定標簽名稱即可。
創建附注標簽時,參數a即annotated的縮寫,指定標簽類型,后附標簽名。參數m指定標簽說明,說明信息會保存在標簽對象中。
切換到標簽
與切換分支命令相同,用git checkout [tagname]
查看標簽信息
用git show命令可以查看標簽的版本信息:
$ git show v0.1.2
刪除標簽
誤打或需要修改標簽時,需要先將標簽刪除,再打新標簽。
$ git tag -d v0.1.2 # 刪除標簽
參數d即delete的縮寫,意為刪除其后指定的標簽。
補打標簽
打標簽不必要在head之上,也可在之前的版本上打,這需要你知道某個提交對象的校驗和(通過git log獲取)。
# 補打標簽
$ git tag -a v0.1.1 9fbc3d0
標簽發布
通常的git push不會將標簽對象提交到git服務器,我們需要進行顯式的操作:
$ git push origin v0.1.2 # 將v0.1.2標簽提交到git服務器
$ git push origin --tags # 將本地所有標簽一次性提交到git服務器
日志
git log 查看 當前分支的 提交歷史
在提交了若干更新之后,想回顧下提交歷史,可以使用 git log 命令查看
默認不用任何參數的話,git log 會按提交時間列出所有的更新,最近的更新排在最上面。看到了嗎,每次更新都有一個 SHA-1 校驗和、作者的名字 和 電子郵件地址、提交時間,最后縮進一個段落顯示提交說明。
git log 有許多選項可以幫助你搜尋感興趣的提交,接下來我們介紹些最常用的。
我們常用 -p 選項 展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新:
$ git log -p -2
此外,還有許多摘要選項可以用,比如 --stat,僅簡要的顯示 文件 增改行數統計,每個提交都列出了修改過的文件,以及其中添加和移除的行數,並在最后列出所有增減行數小計。
$ git log --stat
--author 僅顯示指定作者相關的提交。
$ git log --author=haiwang
查找 haiwang 提交的 版本;
差異
git diff
可以用來比較:
1.staging area和working area的文件 (無其他參數時)
[plain] view plaincopyprint?
git diff
2.master分支和working area的文件 (用master參數)
[plain] view plaincopyprint?
git diff master
3.HEAD指向的內容和working area的文件
[plain] view plaincopyprint?
git diff HEAD
4.用遠程master分支比較當前工作區
[plain] view plaincopyprint?
git diff refs/remotes/origin/master
5.經常還要用到master分支的某個文件的歷史版本和working area的該文件的比較
[plain] view plaincopyprint?
git diff 0c5ee16a6a4c849d0ae0448caa8ff174399c7c3c ./socket_helper.cpp
上面的命令中, diff后面的參數指的是commit id, ./socket_helper.cpp是要比較的文件路徑。
diff的命令輸出格式注意:
[plain] view plaincopyprint?
---代表源文件
+++代表目標文件
通常working area的文件都是被當作目標文件來看待。
-開頭的行,是只出現在源文件中的行
+開頭的行,是只出現在目標文件中的行
空格開頭的行,是源文件和目標文件中都出現的行
差異按照差異小結進行組織,每個差異小結的第一行都是定位語句,由@@開頭,@@結尾。
1.某個提交記錄0c5ee代表的socket_helper.cpp文件是源文件,當前working area的socket_helper文件是目標文件。
2.在源文件第4行開始的6行和目標文件第4行開始的7行構成一個差異小結
3.這個差異小結中,目標文件添加了一行#include "helper/time_measure.h"
4.其他空格開頭的行表明沒有差異。
Git fetch和git pull
Git中從遠程的分支獲取最新的版本到本地有這樣2個命令:
1. git fetch:相當於是從遠程獲取最新版本到本地,不會自動merge
git fetch origin master
git log -p master..origin/master
git merge origin/master
以上命令的含義:
首先從遠程的origin的master主分支下載最新的版本到origin/master分支上
然后比較本地的master分支和origin/master分支的差別
最后進行合並
上述過程其實可以用以下更清晰的方式來進行:
git fetch origin master:tmp
git diff tmp
git merge tmp
從遠程獲取最新的版本到本地的test分支上之后再進行比較合並
2. git pull:相當於是從遠程獲取最新版本並merge到本地
git pull origin master
上述命令其實相當於git fetch 和 git merge
在實際使用中,git fetch更安全一些
因為在merge前,我們可以查看更新情況,然后再決定是否合並
結束
遠程倉庫相關命令
檢出倉庫:$ git clone git://github.com/jquery/jquery.git
查看遠程倉庫:$ git remote –v
添加遠程倉庫:$ git remote add [name] [url]
刪除遠程倉庫:$ git remote rm [name]
拉取遠程倉庫:$ git pull [remoteName] [localBranchName]
推送遠程倉庫:$ git push [remoteName] [localBranchName]
分支(branch)操作相關命令查看本地分支:$ git branch
查看遠程分支:$ git branch –r
創建本地分支:$ git branch [name] ----注意新分支創建后不會自動切換為當前分支
切換分支:$ git checkout [name]
創建新分支並立即切換到新分支:$ git checkout -b [name]
刪除分支:$ git branch -d [name] ---- -d選項只能刪除已經參與了合並的分支,對於未有合並的分支是無法刪除的。如果想強制刪除一個分支,可以使用-D選項
合並分支:$ git merge [name] ----將名稱為[name]的分支與當前分支合並創建遠程分支
(本地分支push到遠程):$ git push origin [name]
刪除遠程分支:$ git push origin :heads/[name]
版本(tag)操作相關命令查看版本:$ git tag
創建版本:$ git tag [name]
刪除版本:$ git tag -d [name]
查看遠程版本:$ git tag –r
創建遠程版本(本地版本push到遠程):$ git push origin [name]
刪除遠程版本:$ git push origin :refs/tags/[name]
子模塊(submodule)相關操作命令添加子模塊:$ git submodule add [url] [path]
初始化子模塊:$ git submodule init ----只在首次檢出倉庫時運行一次就行
更新子模塊:$ git submodule update ----每次更新或切換分支后都需要運行一下
刪除子模塊:$ git rm --cached [path]
忽略一些文件、文件夾不提交在倉庫根目錄下創建名稱為“.gitignore”的文件,寫入不需要的文件夾名或文件,每個元素占一行即可,如targetbin*.db
閱讀資料
http://www.cnblogs.com/zhangjing230/archive/2012/05/09/2489745.html#git