天天看點

git 學習1:針對個人文檔管理和協同開發

  關于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

      清楚那些已經被打過包的原始的對象