關于GIT ,作用就不怎麼介紹,網上搜尋有很多的
一:基本指令(針對個人文檔的管理)
1.建立一個版本庫 ---使用本地的版本庫
$ mkdir myDir
$ cd myDir
$ git-init-db
Initialized empty Git repository in .git/
建立工作目錄 myDir,進入工作目錄,并初始化版本庫。此時會在myDir/目錄下生成一個名為.git的目錄,裡邊有三個檔案,分别是存放指向項目目前分支索引資訊的HEAD檔案、包含項目所有對象的object子目錄、儲存指向對象索引的refs目錄
.git/
├─branches
├─hooks
├─info
├─objects
│ ├─info
│ └─pack
├─refs
│ ├─heads
│ └─tags
└─remotes
2. 在使用 Git 之前,你需要面對 Git 來一番自我介紹。 不喜歡Git不願透漏姓名的人,因為它要求每個人在向倉庫送出資料時,
都應當承擔一定的責要向 Git 進行自我介紹。說白了就是用git-log 時,能友善知道是誰修改的東西。
$ git-config user.name "yin kaizhong"
$ git-config user.email [email protected]
注意,這會在目前repository目錄下的.git/config中寫入配置資訊。 如果git-config加了--global
選項,配置資訊就會寫入到~/.gitconfig檔案中。 因為你可能用不同的身份參與不同的項目,而多個
項目都用git管理,是以建議不用--global配置。
2.植入内容跟蹤資訊
$ echo "new world" > newfile
$ git-add newfile
建立新檔案newfile,寫入"new world",并用git-add指令将此檔案加入到版本庫檔案索引當中。 ]
3.送出内容到版本庫
$ git-commit -m "add newfile" newfile
Created initial commit 5ce224d: add newfile
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 newfile
把前面的修改送出到版本庫中,前提是已經用git-add指令把此檔案加入到版本庫檔案索引當中。
也就是說必須先執行git-add , 在執行 git-commit
git-add 指令通常能夠判斷出目前目錄 (包括其子目錄) 下使用者所添加的新文,
git-commit 指令的 -a 選項可将所有被修改的文檔, 并将其資訊追加到索引中。
或者已删除的文檔的目前狀态送出倒倉庫中。
記住, 如果隻是修改或者删除了已被Git 管理的文檔,是沒必要使用 git-add 指令的。
如果目前修改的檔案太多,又不想一個個的執行git-add ,git-commit
可以這樣:git-add . //add所有的
git-commit -a -m "message" // -a:all 的意思
4.檢視目前的工作
git-status可檢視目前分支狀态,git-diff檢視目前分支更改情況
5.分支的使用
$git-branch mybranch
$ git-checkout mybranch
Switched to branch "mybranch"
$ git-branch -D mybranch
Deleted branch mybranch.
建立名為mybranch的分支,并把以後工作轉移到這個分支上開展。git-branch帶-D選項為删除指定的分支,不能删除使用者所在目前分支,必須用git-checkout切換到其他分支才行
6.檢視項目的發展變化和比較差異
git-show-branch用來列出目前版本庫中的所有分支,
git-whatchanged可以列出項目開發中的修改曆史。
git-dff mybranch是來比較目前分支與mybranch分支的差異的,
當然也可使用 git-diff mybranch anotherbranch對任意兩個分支做對比。
7.合并兩個分支
$ git-checkout master
$ git-merge "Merge work in mybranch" mybranch
切換到master分支,并把mybranch上的工作合并到master上來。此時有可能有沖突無法合并,會給出警告,使用者可根據提示手動合并一些檔案
8.逆轉與恢複
git-reset [--mixed | --soft | --hard] [<commit-ish>]
--mixed 隻撤銷掉index中的commit,卻保留那個commit對應的内容
--hard index和working dir全撤銷,也就是commit消失,并且其内容也消失
--soft index和working dir都不動,隻"require them to be in a good order" (
這是man git-reset中的話,什麼意思?) 。這會讓該commit修改的檔案變
成"dded but not yet committed"的狀态。
例子分析:
git-reset --soft HEAD^ 逆轉上次送出的版本進度
git-reset --hard 7182ae4912487692d4f91ded1e74d99e0fc12e49 強行逆轉到索引指定的版本,--hard選項要慎重使用,有事可能破壞正常檔案。
git-revert 也可撤銷上次對版本庫的送出,但這本身也會産生一個commit,用得多了會使log看起來不那麼幹淨
注意:1) git-reset和git-revert不同,後者是把更新檔作為另一個commit反向打入tree中,而reset是真正的撤銷;
2) 如果撤銷最近的n次commits,就用git-reset HEAD~<n>,例如HEAD~2
删除檔案:
$ git -rm aa.c
$ git -commit
恢複删除了的檔案:(撤消一次送出)
$ git -log //注意檢視上次 git -rm後的 git -commit ID
$ git -revert adb2f08089edac8bf1912a618a74485ab42f2b86 //指定導緻删除操作的commit ID,進行撤消
二:Git 協同工作
A:伺服器 ip: 192.168.4.200 且已有初始版本庫cq8401.git,目錄:/project/cq8401.git,有3個使用者A,B,C;一個組A; B,C 屬于組A,
且隻有A對/project/cq8401.git 可寫的權限
B:clone端 ip: 192.168.4.181
C:clone端 ip: 192.168.4.110
1.克隆遠端版本庫
指令:
$git-clone [email protected]:/project/cq8401.git [dir name]
[dir name]是你想讓這個倉庫叫什麼名字。 如果不指定,就會等同于目标倉庫的名字。
B: $git-clone [email protected]:/project/cq8401.git
//克隆遠端版本庫cq8401.git 到B機器的目前目錄,目錄名字為cq8401.git
C: $git-clone [email protected]:/project/cq8401.git C-cq8401
//克隆遠端版本庫cq8401.git 到C機器的目前目錄,目錄名字為C-cq8401
2.B,C 在下載下傳下來的本地版本庫中作改動(添加,删除,修改…………)
B: $echo "B first" > 1.txt
$git-add 1.txt
$git-commit 1.txt -m "add 1.txt by B"
C: $echo "C first" > 2.txt
$git-add 1.txt
$git-commit 2.txt -m "add 2.txt by C"
3.更新遠端伺服器A上的版本庫
方法一:
先接觸兩個指令:
$ git-push [email protected]:/srv/git/pigeons.git master:master
将同步本地版本庫中master分支同步到遠端伺服器上版本庫的master分支
$ git-pull [email protected]:/srv/git/pigeons.git master:master
将遠端伺服器上的版本庫中的master分支同步到本地版本庫的master分支
而且git-pull=git-fetch+git-merge
具體操作:$git-fetch origin //克隆上遊版本庫
$git-merge HEAD origin //合并分支
OK 現在對B,C操作
B:
$git-pull //push前先更新一下本地的版本庫,因為可能在B更新之前,C 或者其他的 使用者已經向伺服器A push 了代碼
$ git-push A@192.168.4.200:/project/cq8401.git master:master
//将同步本地版本庫中master分支同步到遠端伺服器A上版本庫的master分支
C: 操作同上
方法二:
還有一種方法,就是A 打上B,C傳過來的更新檔
在B,C上
$ git-fetch origin (1) 更新 origin 分支,防止 origin 分支不是最新的公共版本,産生錯誤的更新檔檔案;
$ git-rebase origin (2) 将你在 master 上送出的工作遷移到新的源版本庫的狀态的基礎上
$ git-format-patch origin (3)生成更新檔檔案
通過email或者其他方式傳給A (當然這種庫不适合空倉庫,即是用指令:git-init --bare --shared建立的庫)
在A 上
$ git-mailinfo msg patch < xxx.patch
分析郵件,把commit log寫到msg檔案,更新檔寫到patch檔案。 其他資訊列印到标準輸出
$ git-am xxx.patch
打上更新檔
4. A 作為管理者,有必要每隔一段時間對代碼量大小進行維護
為版本庫打包
$ git-repack
将對象打包,并儲存在 .git/objects/pack 目錄當中
$ git-prune-packed
清楚那些已經被打過包的原始的對象