標籤
Bare repository即是repository只有Git directory (.git),而working directory不會有其他檔案。Remote Repository就需要是一個bare repostiory。
制作bare repository:
$ git init $ git config --bool core.bare true
git config –bool core.bare true的作用是標示這是一個bare repository。
26 星期五 十一月 2010
Posted Git, Version Control
in≈ 發表留言
標籤
Bare repository即是repository只有Git directory (.git),而working directory不會有其他檔案。Remote Repository就需要是一個bare repostiory。
制作bare repository:
$ git init $ git config --bool core.bare true
git config –bool core.bare true的作用是標示這是一個bare repository。
24 星期六 七月 2010
Posted Git, Version Control
in≈ 發表留言
標籤
Distributed Workflows(分佈式流程)是DVCS其中一項比傳統VCS優勝的地方。Distributed Workflows最基本的概念是從remote repository clone project下來,修改並commit到local repository,最後再把修改push回remote repository。
最初local什麽也沒有,從remote repository clone 一個project下來吧。(剛剛學android program就clone一個android project下來好了)
$ git clone git://android.git.kernel.org/platform/packages/apps/Music.git
Git做了些什麽呢?Git其實是clone了remote repository到local的remote branches並建立了local branch(master)。來看看local的remote branches吧。
$ git branch -r origin/HEAD origin/master
這些以"origin/"為首的就是local的remote branches。Git就是用這些branches和remote reposity打交道。
如果人們修改了remote repository的檔案,要如何取得這些修改呢。就是把remote repository的修改fetch下來。
$ git fetch
這個fetch命令只是把remote repository下載到local的remote branches,但不會merge到local branch的。之後就要自己git merge到local branch了。
當然有一些方便的命令可以一次做fetch和merge,這就是push了。
$ git pull
拉(pull)下來的東西當然是要推(push)回去啦。
$ git push
Git是支援多過一個的remote repository的,所以fetch/pull/push的時候是需要加入參數去指定remote repository。
16 星期五 七月 2010
Posted Git, Version Control
in≈ 1 則迴響
標籤
建立分支
Git是可以管理多個分支的。 要建立分支可以用: (假設分支名是testing_branch)
$ git branch testing_branch
之後可以用command看看有什麼分支:
$ git branch * master testing_branch
你可以看到現在所有Git管理的分支,而有" * “的就是現在正在使用的分支。 要轉換到其他分支可以用:
$ git checkout testing_branch
之後就可以在這個branch上工作。
轉換當前分支
如果想建立分支並即時轉換到新分支可以使用:
$ git checkout -b testing_branch2
删除分支
要删除分支可以用git branch的-d參數:
$ git branch -d testing_branch2
這樣git會檢查要删除的分支是否己合併到當前的分支上。如果沒有,則不能删除分支。
如果真的要删除該分支,可以用-D參數去強行删除分支:
$ git branch -D testing_branch2
分支更名
要更改分支名可以用git branch的-m參數:
$ git branch -m old_name new_name
Merging主要分三種:straight merge, squashed commits,cherry-picking。請緊記合併之後的記錄如果沒有沖突是會立即提交的。
Straight merge是直接把分支合拼到當前的分支。這會把分支上所有的歷史記錄全部合併到當前的分支上。
如果想把testing_branch分支直接合併到當前的分支上可以使用:
$ git merge testing_branch
squashed commits是把分支上的所有的歷史記錄合成一個歷史記錄,再合併到當前的分支。
如果想把testing_branch分支壓合合併到現在正使用的分支上可以使用:
$ git merge --squash testing_branch
cherry-picking是把分支上的一個提交合併到當前的分支。要使用這種合併可能是因為分支上的一個功能需要合併到當前分支上。但是用戶要如何指定要合併的提交呢﹖答案就是每一個git的object model都有的SHA-1 hashcode。那40個位的hashcode實在很難記下或再鍵入,所以Git通常只是用hashcode的首7個位。
$ git commit -a -m "Please find the hashcode" Create commit 7654321: Please find the hashcode
7654321就是這個提交的id了。所以如果要用cherry-picking來合併這個提交可以用:
$ git cherry-pick 7654321
如果不想Git立即提交合併或想再揀選更多提交合併,那麽便要加上-n參數:
$ git cherry-pick -n 7654321
這様做git只是把提交合併到staging area,用戶可以再用cherry-pick去合併提交或者提交已合併的東西。
修改了檔案而未提交,但是又想放棄修改了的東西。那麽便要恢復到最近一次提交(HEAD)了:
$ git reset --hard HEAD
有些時候常指定一些特定的版本但是每次都要找那些hash code實在很煩人,所以Git就有一些提交代號:
最近一次提交: HEAD
HEAD之前的那個提交: HEAD^
HEAD之前早兩個的那個提交: HEAD^^
HEAD之前的那個提交: HEAD~1
HEAD之前前早兩個的那個提交: HEAD~2
11 星期日 七月 2010
Posted Git, Version Control
in≈ 發表留言
標籤
第一件要做的事,當然是向Git介紹自己:
$ git config --global user.name "My Name" $ git config --global user.email "my.name@abc.def"
這樣便設定了默認的用户名和email。 如果只想定義該project的用户名和email,可以在該Git project內輸入:
$ git config user.name "My Name In This Project" $ git config user.email "my.name@abc.def"
在希望被Git管理的目錄內輸入:
$ git init
Git會在該目錄加上.git的目錄,所有該project的git資訊都會加進在這個.git目錄下。
增加或更改了檔案後,把檔案加進staging area:
$ git add file1 file2 file3 file4
git diff可以用來查看未加進staging area檔案,加上–cached則可以查看已加進staging area檔案。
$ git diff --cached
這還未提交檔案的。如果要提交所有在staging area的檔案可以:
$ git commit
有一個command可以一次做這兩個steps的:
$ git commit -a
這個把所有已更改的檔案(但不包括新增)加進staging area並提交。 請緊記不論新增或是更改的檔案都必需首先加到staging area之後才可以提交的。這是因為Git追蹤的是內容而非檔案。
要忽略檔案,只要把檔案名字加進.gitignore文件中就可以了。之後提交這個文件就可以共用這個檔案忽略。如果只是想忽略在當前本地的repository的檔案,則可以把檔案名字加進.git/info/exclude就可以了。
13 星期二 四月 2010
Posted Git, Version Control
in≈ 2 則迴響
標籤
Git是一種分散式版本控制系統,但更貼切的是Git是一個用來尋找檔案內容的文件系統。
Git和其他VCS,例如: SVN, Mercurial,最大相異的地方是Git儲存的是快照(snapshot),而不是差異。如果要知道變更了什麼,Git會比較snapshot去計算出來。因為是管理檔案內容的snapshot,所以Git其實是不記錄檔案的名字更改,而是根據內容來决定檔案是否更改了名字。
Git最基本的概念在於Object Model。Object Model是一個用key-value來儲存數據,而每一個Object Model都有一個用SHA-1 來計算出來的ID。每一個Object Model共有的屬性是type﹑size和content。這是一個40位的hashcode,而為了方便用戶,Git通常只用首7個位。
Git中一共有四種types: blob﹑tree﹑commit﹑tag。
所有Git的Object Model都是儲存在Git目錄。每一個Git管理的Project都只會一個Git目錄,Git目錄會在Project的根目錄,默認是’.git’。Staging Area使用了Git Index,當commit的時候,Git會根據這個index可以找出所有可以commit的檔案,也可以知道檔案現在的狀態。檔案在不同的區域有不同的狀態:已提交(committed)即檔案內容已在git repository;已暫存(staged)即檔案內容已在暫存區(staging area);已修改(modified)即檔案改動內容仍在工作目錄(working directory)。
每一個project只會有一個Git Directory,亦即是project最上層目錄下的.git目錄。這個目錄會儲存所有的Object Model(包括所有的branches),暫存區,Git Index,歷史記錄,Git設定等等… 。因此工作目錄只是暫時checkout檔案來修改的地方。
11 星期日 四月 2010
Posted Git, Version Control
in≈ 發表留言
標籤
Git 是一個跨平台的分散式版本控制系統。
Git的官方網站: http://git-scm.com。
如果是使用WINDOWS的用家可以使用TortoiseGit http://code.google.com/p/tortoisegit/。
Git也有Eclipse plugin http://www.eclipse.org/egit/,update site 是http://download.eclipse.org/egit/updates。
Git的cmd是git。這裡只在很基本介紹以作參考。
在所在的目錄建立Git repository:
$ git init
复制Git repository:
$ git clone [from_repo] [local_location]
把檔案加進Git的staging area:
$ git add [file_name]
提交在staging area的檔案:
$ git commit
如果加上-a,則也會把在working directory的檔案加進staging areat行並提交。
檢視更改記錄:
$ git log
建立分支:
$ git branch [分支名]
如果不用[分支名] 參數,則列出所有分支名和現在使用的分支。
切換到分支:
git checkout [分支名]
合併分支到當前分支:
$ git merge [分支名]
回復變更:
$ git reset [file_name]
把檔從Git移除:
$ git rm [file_name]
把檔案從Git repository加進新分支:
$ git fetch[remote_repo]
把檔案從Git repository加進現在的分支:
$ git pull [remote_repo]
把提交了的檔案推到目標的Git repository:
$ git push [remote_repo]