使用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 将這些檔案标為已修改。我們逐漸把這些修改過的檔案放到暫存區域,然後等最後一次性送出暫存區域的所有檔案更新,如此重複。如下圖

檢查目前檔案狀态
現在我們可以在指令行下回到剛才的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 微網誌:@念槐聚 聯系;