天天看點

[網摘收藏]Ubuntu中版本控制Git的使用Git 使用規範安裝 Git配置 Git擷取幫助

使用git過程中,必須通過建立分支進行開發,堅決禁止在主幹分支上直接開發。review的同僚有責任檢查其他同僚是否遵循分支規範。

在git中,預設是不會送出空目錄的,如果想送出某個空目錄到版本庫中,需要在該目錄下建立一個 .gitignore 的空白檔案,就可以送出了

【代碼回溯注意】把外部檔案納入到自己的 git 分支來的時候一定要記得是先比對,确認所有修改都是自己修改的,然後再納入。不然,容易出現代碼回溯

【代碼回溯注意】多人協作時,不要各自在自己的 git 分支開發,然後發檔案合并。正确的方法應該是開一個遠端分支,然後一起在遠端分支裡協作。不然,容易出現代碼回溯(即别人的代碼被覆寫的情況)

【代碼回溯注意】每個人送出代碼是一定要 git diff 看送出的東西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代碼回溯

【代碼回溯注意】review 代碼的時候如果看到有被删除掉的代碼,一定要确實是否是寫代碼的同僚自己删除的。如果不是,很可能就是代碼回溯

格式:[分支名稱]+message

例如:[www2011072501]前台商品清單按價格排序需求實作。

比如有一個客戶留言功能,被我們拆成了很多子塊,那麼送出注釋如下:

git commit -m "[manage2011072501]完成客戶留言的添加、修改功能" git commit -m "[manage2011072501]完成客戶留言的删除及手動排序功能" git commit -m "[manage2011072501]完成客戶留言的回複功能" git commit -m "[manage2011072501]把舊客戶留言的功能删除"

分支合并及上線

步驟

git 操作

克隆代碼

git clone 遠端代碼

建立分支

git checkout -b branch_name

在分支中開發

review代碼

第一輪測試

添加代碼到分支的暫存區

git add somefile

送出代碼到分支

git commit -m "本次送出的注釋"

切換到主版本

git checkout master

擷取遠端最新代碼

git pull origin master

合并某分支到master分支

git merge branch_name

第二輪測試

準備上線文檔

推送master分支

git push origin master

通知上線

沒有問題了删除本地分支

git branch -d branch_name

三種狀态

對于任何一個檔案,在 git 内都隻有三種狀态

中文

英文

含義

已送出

committed

已送出表示該檔案已經被安全地儲存在本地資料庫中了

已修改

modified

已修改表示修改了某個檔案,但還沒有送出儲存

已暫存

staged

已暫存表示把已修改的檔案放在下次送出時要儲存的清單中

目錄     用法

git 目錄     它是 git 用來儲存中繼資料和對象資料庫的地方。該目錄非常重要,每次克隆鏡像倉庫的時候,實際拷貝的就是這個目錄裡面的資料。

工作目錄     從項目中取出某個版本的所有檔案和目錄,用以開始後續工作的叫做工作目錄。這些檔案實際上都是從 git 目錄中的壓縮對象資料庫中提取出來的,接下來就可以在工作目錄中對這些檔案進行編輯

暫存區域     所謂的暫存區域隻不過是個簡單的檔案,一般都放在 git 目錄中。有時候人們會把這個檔案叫做索引檔案,不過标準說法還是叫暫存區域。 

基本的 git 工作流程

1、在工作目錄中修改某些檔案。

2、對這些修改了的檔案作快照,并儲存到暫存區域。 

3、送出更新,将儲存在暫存區域的檔案快照轉儲到 git 目錄中。

以下指令安裝的為git 1.7.1

以下指令為配置 git 相關資訊,以下兩項必須要配置,會出現在每次送出的資訊裡。

讓 git 用 meld 比較檔案差異

執行

以下為使用示例

格式 git help <verb>

示例

取得項目的 git 倉庫

有兩種取得 git 項目倉庫的方法

在現存的目錄下,通過導入所有檔案來建立新的 git 倉庫 從已有的 git 倉庫克隆出一個新的鏡像倉庫來

一、從目前目錄初始化

要對現有的某個項目開始用 git 管理,隻需到此項目所在的目錄,執行

    cd 某個目錄 

    git init

初始化後,在目前目錄下會出現一個名為 .git 的目錄,所有 git 需要的資料和資源都存放在這個目錄中。

不過目前,僅僅是按照既有的結構架構初始化好了裡邊所有的檔案和目錄,但我們還沒有開始跟蹤管理項目中的任何一個檔案

指令

git add *.php

把所有的php檔案放入暫存區

git add readme.txt

把名為readme.txt的檔案放入暫存區

git add dir/

把名為dir的目錄裡的所有檔案放入暫存區

git add *

把目前目錄的所有檔案都放入暫存區

git rm --cached dir/ -r

把名為dir的目錄裡的所有檔案取消暫存

git rm --cached readme.txt

把名為readme.txt的檔案取消暫存

git commit -m '初始化版本庫'

送出代碼到本地倉庫 “初始化版本庫”為本次送出的注釋資訊

這樣我們就建立了一個新的 git 倉庫

二、從現有倉庫克隆

這個适合我們在公司環境下用,我們可以先把某個項目的 git 倉庫複制一份出來,這就需要用到 git clone 指令。如果你熟悉其他的 vcs 比如 subversion,你可能已經注意到這裡使用的是 clone 而不是 checkout。

git 收取的是項目曆史的所有資料(每一個檔案的每一個版本),伺服器上有的資料克隆之後本地也都有了。實際上,即便伺服器的磁盤發生故障,用任何一個克隆出來的用戶端都可以重建伺服器上的倉庫,回到當初克隆時的狀态。

指令格式為: git clone [url] [projectname] 如下兩行均為克隆 ruby 語言的 git 代碼倉庫 grit。

    git clone git://github.com/schacon/grit.git # projectname 省略時以 grit 為預設目錄

這會在目前目錄下建立一個名為 “grit” 的目錄,其中内含一個 .git 的目錄,并從同步後的倉庫中拉出所有的資料,取出最新版本的檔案拷貝。如果進入這個建立的 grit 目錄,你會看到項目中的所有檔案已經在裡邊了,準備好後續的開發和使用。如果希望在克隆的時候,自己定義要建立的項目目錄名稱,可以在上面的指令最後指 定:

    git clone git://github.com/schacon/grit.git mygrit # 以 mygrit 為預設目錄

    cd mygrit 

    git gc

記錄每次更新到倉庫

工作目錄下面的所有檔案的這兩種狀态

已跟蹤 已跟蹤的檔案是指本來就被納入版本控制管理的檔案,在上次快照中有它們的記錄,工作一段時間後,它們的狀态可能是未更新,已修改或者已放入暫存區。初次克隆某個倉庫時,工作目錄中的所有檔案都屬于已跟蹤檔案,且狀态為未修改。 未跟蹤而所有其他檔案都屬于未跟蹤檔案。它們既沒有上次更新時的快照,也不在目前的暫存區域。比如:一個全新的檔案。

在編輯過某些檔案之後,git 将這些檔案标為已修改。我們逐漸把這些修改過的檔案放到暫存區域,然後等最後一次性送出暫存區域的所有檔案更新,如此重複。如下圖

[網摘收藏]Ubuntu中版本控制Git的使用Git 使用規範安裝 Git配置 Git擷取幫助

檢查目前檔案狀态

現在我們可以在指令行下回到剛才的git目錄。 要确定哪些檔案目前處于什麼狀态,可以用 git status 指令

git status 

# on branch master 

nothing to commit (working directory clean)

建立一個test.txt的檔案,再用git status來看

vi test.txt # 按i輸入内容然後 按esc 按shift+z+z儲存并退出 

# untracked files: 

#       (use "git add <file>..." to include in what will be committed) 

#             test.txt 

nothing added to commit but untracked files present (use "git add" to track)

跟蹤新檔案

使用指令 git add 開始跟蹤一個新檔案,如跟蹤剛才建立的test.txt檔案

git add test.txt

git status

# on branch master

# changes to be committed:

#   (use "git reset head <file>..." to unstage)

#

#    new file:   test.txt

隻要在 “changes to be committed” 這行下面的,就說明是已暫存狀态。

暫存已修改檔案

我們修改一下剛才grit目錄下已存在的檔案,如benchmarks.txt

vim benchmarks.txt # 按i輸入内容然後 按esc 按shift+z+z儲存并退出

# changed but not updated:

#   (use "git add <file>..." to update what will be committed)

#   (use "git checkout -- <file>..." to discard changes in working directory)

#    modified:   benchmarks.txt

文 件 benchmarks.txt 出現在 “changed but not updated” 這行下面,說明已跟蹤檔案的内容發生了變化,但還沒有放到暫存區。要暫存這次更新,需要運作 git add 指令,這是個多功能指令,根據目标檔案的狀态不同,此指令的效果也不同

    可以用它開始跟蹤新檔案

    把已跟蹤的檔案放到暫存區

    合并時把有沖突的檔案标記為已解決狀态 

git add benchmarks.txt

現在兩個檔案都已暫存,下次送出時就會一并記錄到倉庫。

假設此時,你想要在 benchmarks.txt 裡再加一行,重新編輯存盤後,準備好送出。不過稍等一下,再運作 git status 看看:

vim benchmarks.txt

現在我們發現 benchmarks.txt 檔案出現了兩次!一次算未暫存,一次算已暫存,這怎麼可能呢?好吧,實際上 git 隻不過暫存了你運作 git add 指令時的版本,如果現在送出,那麼送出的是添加注釋前的版本,而非目前工作目錄中的版本。是以,運作了 git add 之後又作了修訂的檔案,需要重新運作 git add 把最新版本重新暫存起來:

忽略某些檔案

非重點 有興趣的同學可以參考 http://progit.org/book/zh/ch2-2.html

檢視已暫存和未暫存的更新

git diff --staged  # 已經暫存起來的檔案和上次送出時的快照之間的差異 也可以用 git diff --cached

git diff # 直接使用此指令是 工作目錄中目前檔案和暫存區域快照之間的差異

送出更新

現 在的暫存區域已經準備妥當可以送出了。在此之前,請一定要确認還有什麼修改過的或建立的檔案還沒有 git add 過,否則送出的時候不會記錄這些還沒暫存起來的變化。是以,每次準備送出前,先用 git status 看下,是不是都已暫存起來了,然後再運作送出指令 git commit:

git commit -m "送出備注" # 可以直接送出

這樣我們就完成了一次git送出

 跳過使用暫存區域

不 推薦 盡管使用暫存區域的方式可以精心準備要送出的細節,但有時候這麼做略顯繁瑣。git 提供了一個跳過使用暫存區域的方式,隻要在送出的時候,給 git commit 加上 -a 選項,git 就會自動把所有已經跟蹤過的檔案暫存起來一并送出,進而跳過 git add 步驟:

git commit -a -m "強制送出備注"

移除檔案

要從 git 中移除某個檔案,就必須要從已跟蹤檔案清單中移除(确切地說,是從暫存區域移除),然後送出。可以用 git rm 指令完成此項工作,并連帶從工作目錄中删除指定的檔案,這樣以後就不會出現在未跟蹤檔案清單中了。

git rm somefile #

如果删除之前修改過并且已經放到暫存區域的話,則必須要用強制删除選項 -f

git rm -f somefile

我們想把檔案從 git 倉庫中删除(亦即從暫存區域移除),但仍然希望保留在目前工作目錄中。換句話說,僅是從跟蹤清單中删除。

批量移除

git rm log/\*.log

移動檔案

要在 git 中對檔案改名,可以這麼做:

git mv file_from file_to

相當于執行以下的3個指令

mv file_from file_to

git rm file_from

git add file_to

示例如下

git mv test.txt testtest.txt

#    new file:   testtest.txt

檢視送出曆史

在送出了若幹更新之後,又或者克隆了某個項目,想回顧下送出曆史,可以使用 git log 指令。

git clone git://github.com/schacon/simplegit-progit.git

cd simplegit-progit/

然後在此項目中運作 git log,應該會看到下面的輸出:

git log

commit ca82a6dff817ec66f44342007202690a93763949

author: scott chacon <[email protected]>

date:   mon mar 17 21:52:11 2008 -0700

    changed the verison number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7

date:   sat mar 15 16:40:33 2008 -0700

    removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6

date:   sat mar 15 10:31:28 2008 -0700

    first commit

更多參數說明

參數     說明

-p     按更新檔格式顯示每個更新之間的差異。

--stat     顯示每次更新的檔案修改統計資訊。

--shortstat     隻顯示 --stat 中最後的行數修改添加移除統計。

--name-only     僅在送出資訊後顯示已修改的檔案清單。

--name-status     顯示新增、修改、删除的檔案清單。

--abbrev-commit     僅顯示 sha-1 的前幾個字元,而非所有的 40 個字元。

--relative-date     使用較短的相對時間顯示(比如,“2 weeks ago”)。

--grap     顯示 ascii 圖形表示的分支合并曆史。

--pretty     使用其他格式顯示曆史送出資訊。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式)。

-n     僅顯示最近的 n 條送出

--since, --after     僅顯示指定時間之後的送出。

--until, --before     僅顯示指定時間之前的送出。

--author     僅顯示指定作者相關的送出。

--committer     僅顯示指定送出者相關的送出。

git log --pretty=oneline

git log --pretty=format:"%h - %an, %ar : %s"

#如果要檢視 git 倉庫中,2008 年 10 月期間,junio hamano 送出的但未合并的測試腳本(位于項目的 t/ 目錄下的檔案)

git log --pretty="%h:%s" --author=gitster --since="2008-10-01" \

   --before="2008-11-01" --no-merges -- t/ 

選項     說明

%h    送出對象(commit)的完整哈希字串

%h    送出對象的簡短哈希字串

%t    樹對象(tree)的完整哈希字串

%t    樹對象的簡短哈希字串

%p    父對象(parent)的完整哈希字串

%p    父對象的簡短哈希字串

%an    作者(author)的名字

%ae    作者的電子郵件位址

%ad    作者修訂日期(可以用 -date= 選項定制格式)

%ar    作者修訂日期,按多久以前的方式顯示

%cn    送出者(committer)的名字

%ce    送出者的電子郵件位址

%cd    送出日期

%cr    送出日期,按多久以前的方式顯示

%s    送出說明

 撤消操作

修改最後一次送出

有時候我們送出完了才發現漏掉了幾個檔案沒有加,或者送出資訊寫錯了。想要撤消剛才的送出操作,可以使用 --amend 選項重新送出:

git commit -m 'first'

git commit --amend -m 'first too'

 取消已經暫存的檔案

git reset head filename

取消對檔案的修改

這裡指未git add到的暫存區的檔案

在用這條指令前,請務必确定真的不再需要保留剛才的修改。

git checkout -- filename

遠端倉庫的使用

同他人協作開發某個項目時,需要管理這些遠端倉庫,以便推送或拉取資料,分享各自的工作進展。管理遠端倉庫的工作,包括添加遠端庫,移除廢棄的遠端庫,管理各式遠端庫分支,定義是否跟蹤這些分支,等等。

檢視目前的遠端庫

使用git remote 檢視目前配置有哪些遠端倉庫,至少可以看到一個名為 origin 的遠端庫,git 預設使用這個名字來辨別你所克隆的原始倉庫:

git clone git://github.com/schacon/ticgit.git

cd ticgit

git remote # 列出每個遠端庫的簡短名字

  origin

git remote -v # 顯示對應的克隆位址

  origin    git://github.com/schacon/ticgit.git (fetch)

  origin    git://github.com/schacon/ticgit.git (push)

 添加遠端倉庫

要添加一個新的遠端倉庫,可以指定一個簡單的名字,以便将來引用格式:git remote add [shortname] [url]:

cd ticgit/

git remote -v

  origin    git://github.com/schacon/ticgit.git (pus

git remote add pb git://github.com/paulboone/ticgit.git

  pb    git://github.com/paulboone/ticgit.git (fetch)

  pb    git://github.com/paulboone/ticgit.git (push)

現在可以用字串 pb 指代對應的倉庫位址了

git fetch pb

  remote: counting objects: 58, done.

  remote: compressing objects: 100% (24/24), done.

  remote: total 44 (delta 23), reused 38 (delta 17)

  unpacking objects: 100% (44/44), done.

  from git://github.com/paulboone/ticgit

   * [new branch]      master     -> pb/master

   * [new branch]      ticgit     -> pb/ticgit

 從遠端倉庫抓取資料

指令 git pull [remote-name]

此指令會到遠端倉庫中拉取所有你本地倉庫中還沒有的資料。運作完成後,你就可以在本地通路該遠端倉庫中的所有分支,将其中某個分支合并到本地,或者隻是取出某個分支

如 果是克隆了一個倉庫,此指令會自動将遠端倉庫歸于 origin 名下。是以,git pull origin 會抓取從你上次克隆以來别人上傳到此遠端倉庫中的所有更新(或是上次 pull 以來别人送出的更新)。有一點很重要,需要記住,pull 指令隻是将遠端的資料拉到本地倉庫,并不自動合并到目前工作分支,隻有當你确實準備好了,才能手工合并。

推送資料到遠端倉庫

項 目進行到一個階段,要同别人分享目前的成果,可以将本地倉庫中的資料推送到遠端倉庫。實作這個任務的指令很簡單: git push [remote-name] [branch-name]。如果要把本地的 master 分支推送到 origin 伺服器上(再次說明下,克隆操作會自動使用預設的 master 和 origin 名字),可以運作下面的指令:

隻有在所克隆的伺服器上有寫權限,或者同一時刻沒有其他人在推資料,這條指令才會如期完成任務。如果在你推資料前,已經有其他人推送了若幹更新,那你的推送操作就會被駁回。你必須先把他們的更新抓取到本地,并到自己的項目中,然後才可以再次推送。

遠端倉庫的删除和重命名

在新版 git 中可以用 git remote rename 指令修改某個遠端倉庫的簡短名稱,比如想把 pb 改成 paul,可以這麼運作:

git remote rename pb paul

git remote

  paul

移除遠端倉庫

git remote rm paul

參考:http://hi.baidu.com/caowlong/blog/item/a07582f5b7a03738730eec02.html

轉載請注明出處:http://www.cnblogs.com/haochuang/ 8年it工作經驗,5年測試技術與管理,2年産品與項目管理,曾參與過雲計算\雲存儲\車聯網産品研發工作; 業餘自媒體人,有技術類垂直微信公衆号;如有招聘或求職方面需求,請mail to [email protected] ;或通過 qq:363573922 微網誌:@念槐聚 聯系;