git學習

  1. 1. 安裝git
  2.    git:http://git-scm.com/
  3.    OS版本:ubuntu12.10
  4.    安裝git: $:sudo apt-get install git-core

  5. 2.介紹
  6.     維基百科:http://zh.wikipedia.org/wiki/Git
  7.     git是一個版本控制系統;官方解釋:版本控制是一種軟件工程技巧,在開發過程中,確保不同人所編輯的統一文檔都得到更新。

  8. 3.配置git系統,比如自己的姓名、email。
  9.     git config --global user.name "Your name"
  10.     git config --global user.email "[email protected]"

  11. 我照例執行:
  12.     [root@wangxigang ~]# git config –global user.name “Linuxer”
  13.     [root@wangxigang ~]# git config –global user.email “wangxigang2014@gmail.com”
  14. 4.下面學習導入一個新的git項目
  15.     (假設只有一個main.c文件)該項目在gitfile目錄下,則導入項目的步驟:
  16.     wangxigang@wangxigang-ThinkPad-Edge:~$ cd gitfile/
  17.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git init
  18.     Initialized empty Git repository in /home/wangxigang/gitfile/.git/
  19.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ ls -a
  20.     . .. .git
  21.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git add .
  22.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit
  23.     # On branch master    #
  24.     # Initial commit
  25.     #
  26.     nothing to commit (create/copy files and use "git add" to track)
  27.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit
  28.     # On branch master
  29.     #
  30.     # Initial commit
  31.     #
  32.     # Untracked files:
  33.     # (use "git add <file>..." to include in what will be committed)
  34.     #
  35.     #    main.c
  36.     nothing added to commit but untracked files present (use "git add" to track)

  37.     解釋:
  38.     git init command 用於初始化當前所在目錄的這個項目;
  39.     git add . command 要求git給當前的項目製作一個快照snapshot(快照只登記留名,快照不等於記錄在案)。暫時存儲一個臨時存儲區;
  40.     git commit 用於將快照登記的內容永久寫入git倉庫中。在輸入git commit時迴轉到一個vi窗口,要求開發者輸入這次提交的版本和開發信息。意思是這個項目的版本是多少,已完成了那些功能,還有那些功能沒有完成等等信息。

  41. 5.我們main.c文件的內容是一個 hello world!
  42.       wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ cat -n main.c
  43.      1    #include <stdio.h>
  44.      2    
  45.      3    int main(){
  46.      4     printf("hello world!\n");
  47.      5     return 0;
  48.      6    }

  49.      這時候修改加一行:printf("version:0.0.1");
  50.      wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ cat -n main.c
  51.      1    #include <stdio.h>
  52.      2    
  53.      3    int main(){
  54.      4     printf ("version:0.0.1\n");
  55.      5     printf("hello world!\n");
  56.      6     return 0;
  57.      7    }

  58.      最後兩道工序由開發者最後確認一下(自己的修改):
  59.      [root@wangxigang]# git diff
  60.      diff –git a/main.c b/main.c
  61.      index 3a88d8c..e0fe92e 100644
  62.      — a/main.c
  63.      +++ b/main.c
  64.      @@ -1,+1,7 @@
  65.      #include<stdio.h>
  66.      int main()
  67.      {
  68.      +printf(“Version: 0.01\n”);
  69.      printf(“hello world!\n”);
  70.      return 0;
  71.      }
  72.      
  73.      使用git diff瞭解不同之後,還可以使用git status命令獲得整體的改動信息;
  74.      [root@wangxigang]# git status
  75.      # On branch master
  76.      # Changed but not updated:
  77.      # (use “git add <file>…” to update what will be committed)
  78.      #
  79.      # modified: main.c
  80.      #
  81.      no changes added to commit (use “git add” and/or “git commit -a”)

  82.      下面進入提交階段:
  83.      [wangxigang@wangxigang]# git add main.
  84.      這句話告訴git, 我已經修改了main.c;

  85.      提交我的工作:
  86.       wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit 
  87.       [master (root-commit) dceb92b] this is senond project
  88.       1 file changed, 7 insertions(+)
  89.       create mode 100644 main.c
  90.  
  91.        查看開發日誌:
  92.        wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git log
  93.        commit dceb92b3ebf10e3c6437c1edc27d8af75ae0f89d
  94.        Author: = <wangxigang2014@gmail.com>
  95.        Date: Tue Apr 29 19:27:26 2014 +0800

  96.            this is senond project
  97.        如果查看更詳細的開發日誌:
  98.        wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git log -p
  99.        commit dceb92b3ebf10e3c6437c1edc27d8af75ae0f89d
  100.        Author: = <wangxigang2014@gmail.com>
  101.        Date: Tue Apr 29 19:27:26 2014 +0800

  102.            this is senond project

  103.      diff --git a/main.c b/main.c
  104.      new file mode 100644
  105.      index 0000000..7e96f29
  106.      --- /dev/null
  107.      +++ b/main.c
  108.      @@ -0,+1,7 @@
  109.      +#include <stdio.h>
  110.      +
  111.      +int main(){
  112.      + printf("version:0.0.1\n");
  113.      + printf("hello world!\n");
  114.      + return 0;
  115.      +}

  116.      
  117. 5.如何管理分支:
  118.     還是接着我們之前的main.c的項目走。我想試着開發一個報時功能加入到main.c中,但我不保證這個功能一定能夠實現。這個時候可以運行git branch命令來開啓一個實驗分支:
  119.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git branch experimental

  120.      好了,分支分支建立完畢;
  121.      我們查看一下:
  122.      wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git branch 
  123.      experimental
  124.      * master
  125.      直接輸入git branch,不加任何後續參數,就表示讓git列出所有已存在的分支。前面帶“星號”的分支表示當前所在的分支。
  126.      切換到experimental分支:
  127.      wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git checkout experimental 
  128.      Switched to branch 'experimental'
  129.      修改之後的main.c如下:

  130.      [wangxigang@wangxigang]# cat -n main.c
  131.      1 #include<stdio.h>
  132.      2 #include<time.h>
  133.      3 int main()
  134.      4 {
  135.      5 time_t mytime;
  136.      6 struct tm *mylocaltime;
  137.      7 mytime=time(NULL);
  138.      8 mylocaltime=localtime(&mytime);
  139.      9 printf(“Year:%d\n”,mylocaltime->tm_year+1900);
  140.      10 printf(“Month:%d\n”,mylocaltime->tm_mon+1);
  141.      11 printf(“Day:%d\n”,mylocaltime->tm_mday);
  142.      12 printf(“Hour:%d\n”,mylocaltime->tm_hour);
  143.      13 printf(“Min:%d\n”,mylocaltime->tm_min);
  144.      14 printf(“Second:%d\n”,mylocaltime->tm_sec);
  145.      15 printf(“Version: 0.02\n”);
  146.      16 printf(“Hello world!\n”);
  147.      17 return 0;
  148.      18 }
  149.      黑體爲新加的內容。好了,我的報時功能已經完成了。看來這個分支是可行的:)

  150.      運行此程序,運行結果如下:

  151.      [wangxigang@wangxigang]# ./a.out
  152.      Year:2008
  153.      Month:9
  154.      Day:21
  155.      Hour:11
  156.      Min:17
  157.      Second:4
  158.      Version: 0.02
  159.      Hello 

  160.      下面的任務就是提交程序到分支項目:
  161.      wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit -a
  162.      [experimental f37403e] this is a third project
  163.      1 file changed, 19 insertions(+), 7 deletions(-)
  164.      rewrite main.(66%)
  165.      
  166.      然後就可以切換到“主幹道”了:
  167.      wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git checkout master 
  168.      Switched to branch 'master'

  169.      爲了讓git處理分支的本領展現的淋漓盡致,我們現在在主幹道上再做一些改進:
  170.      [wangxigang@wangxigang]# cat -n main.c
  171.      1 #include<stdio.h>
  172.      2 int main()
  173.      3 {
  174.      4 printf(“Welcome\n”);
  175.      5 printf(“Version: 0.02\n”);
  176.      6 printf(“Hello world!\n”);
  177.      7 return 0;
  178.      8 }
  179.      然後在主幹道上使用git commit -a提交!

  180.      合併“分支”和“主幹道”:
  181.      wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git merge experimental 
  182.      Auto-merging main.c
  183.      CONFLICT (content): Merge conflict in main.c
  184.      Automatic merge failed; fix conflicts and then commit the result.
  185.      
  186.      報錯了!因爲我看到了conflict和failed這樣的字眼。看來主幹道上加入的welcome和分支幹道產生了衝突。我們決定來修改主幹道的welcome語句到文章的最後部位。主幹道的main.c此時爲:
  187.      wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ cat -n main.c
  188.      1    #include <stdio.h>
  189.      2    #include <time.h>
  190.      3    
  191.      4    int main(){
  192.      5    <<<<<<< HEAD
  193.      6        printf("welcome");
  194.      7        printf("version:0.0.1\n");
  195.      8        printf("hello world!\n");
  196.      9        return 0;
  197.     10    =======
  198.     11     time_t mytime;
  199.     12     struct tm *mylocaltime;
  200.     13     mytime = time(NULL);
  201.     14     mylocaltime = localtime(&mytime);
  202.     15     printf(“Year:%d\n”,mylocaltime->tm_year+1900);
  203.     16     printf(“Year:%d\n”,mylocaltime->tm_year+1900);
  204.     17     printf(“Month:%d\n”,mylocaltime->tm_mon+1);
  205.     18     printf(“Day:%d\n”,mylocaltime->tm_mday);
  206.     19     printf(“Hour:%d\n”,mylocaltime->tm_hour);
  207.     20     printf(“Min:%d\n”,mylocaltime->tm_min);
  208.     21     printf(“Second:%d\n”,mylocaltime->tm_sec);
  209.     22     printf ("version:0.0.2\n");
  210.     23     printf("hello world!\n");
  211.     24     return 0;
  212.     25    >>>>>>> experimental
  213.     26    }
  214.     現在人工的修改main.c文件:
  215.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ vi main.c
  216.   #include <stdio.h>
  217.   #include <time.h>

  218.    int main(){
  219.     printf("welcome");
  220.     time_t mytime;
  221.     struct tm *mylocaltime;
  222.     mytime = time(NULL);
  223.     mylocaltime = localtime(&mytime);
  224.     printf(“Year:%d\n”,mylocaltime->tm_year+1900);
  225.     printf(“Year:%d\n”,mylocaltime->tm_year+1900);
  226.     printf(“Month:%d\n”,mylocaltime->tm_mon+1);
  227.     printf(“Day:%d\n”,mylocaltime->tm_mday);
  228.     printf(“Hour:%d\n”,mylocaltime->tm_hour);
  229.     printf(“Min:%d\n”,mylocaltime->tm_min);
  230.     printf(“Second:%d\n”,mylocaltime->tm_sec);
  231.     printf ("version:0.0.2\n");
  232.     printf("hello world!\n");
  233.      return 0; 
  234. }
  235.     好,解決衝突後再次提交!
  236.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit -a

  237.     分支的任務也就完成了,可以刪除分支了:
  238.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git branch -d experimental 
  239.     Deleted branch experimental (was f37403e).
    1. 6.如何在git裏進行多人合作:
    2.     目前我的項目放在/home/wangxigang/gitfile裏面,其他人也希望貢獻他的代碼,可以這樣做:
    3.     $ git clone /home/wangxigang/gitfile myproject
    4. 這樣其他就可以將我的成果克隆到他的家目錄 myproject中。此時其他人可以git commit -a提交他的改進成果。
    5.     我將他人的改進合併我的項目中:
    6.     cd /home/wangxigang/gitfile
    7.     git pull /home/somepeople/myproject master
    8.     將其他人的工作master合併到我的當前分支上。
    9.     pull 命令完成兩個動作,首先從遠端分支獲取diff信息,第二個動作就是改變合併到本地分支中。
    10. 7.對像數據庫
    11.     建立一個倉庫:
    12.     wangxigang@wangxigang-ThinkPad-Edge:~$ mkdir test-project
    13.     wangxigang@wangxigang-ThinkPad-Edge:~$ cd test-project/
    14.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git init
    15.     Initialized empty Git repository in /home/wangxigang/test-project/.git/
    16.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ echo 'Hi,wangxigang'>file.txt
    17.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git add .
    18.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git commit --'initial commit' //此處的-m選項表示“後面的參數是本次提交的歷史記錄”
    19.     [master (root-commit) 7c135fc] initial commit
    20.      1 file changed, 1 insertion(+)
    21.      create mode 100644 file.txt
    22.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ echo 'Hi,wangxigang!'>file.txt
    23.         wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git commit --'add emphasis' //此處的-m選項表示“後面的參數是本次提交的歷史記錄”
    24.      [master d44d5c0] add emphasis
    25.      1 file changed, 1 insertion(+), 1 deletion(-)
    26.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git log
    27.      commit d44d5c0441ec0fbd12b5eaed21fbc5510993189b
    28.      Author: = <wangxigang2014@gmail.com>
    29.      Date: Mon May 5 18:48:15 2014 +0800

    30.      add emphasis

    31.      commit 7c135fc46f3ee072b5cae1165fd55ff2c9d3fb94
    32.      Author: = <wangxigang2014@gmail.com>
    33.      Date: Mon May 5 18:47:12 2014 +0800

    34.      initial commit

    35.     這40位十六進制數是一個SHA1哈希數(Secure Hash Algorithm),它可以保證每次commit生成的名稱都是唯一的且可以永遠有效的。
    36.     執行下面命令:
    37.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git cat-file -t 7c135
    38.     commit
    39.      //cat-file命令中-t選項表示列出相應ID的對象類型;241e是剛纔commit後得出的SHA1碼
    40. commit //可以看到此ID對應的對象類型爲一次commit
    41.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git cat-file commit 7c135
    42.     tree 845633fd6c3063a134e11665aa05db923f21b91e
    43.     author = <wangxigang2014@gmail.com> 1399286832 +0800
    44.     committer = <wangxigang2014@gmail.com> 1399286832 +0800

    45.     initial commit
    46.     
    47.     你應該可以注意到命令輸出結果中包含了tree,tree的ID表示了一個BLOB對象(二進制對象),此對象對應着一個文件或另一個tree。你可以使用ls-tree命令來查詢關於這個tree的更詳細信息:
    48.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git ls -tree 845633
    49.     git: 'ls' is not a git command. See 'git --help'.

    50.     Did you mean this?
    51.         log
    52.     在.git目錄下的HEAD文件比較特殊,查看.git/HEAD文件:
    53.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile/.git/objects$ cd ..
    54.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile/.git$ cat HEAD
    55.     ref: refs/heads/master
    56.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile/.git$ cd ..
    57.     wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git branch 
    58.     * master
    59.     可以看到HEAD文件指示出當前所在的分支名稱是master。
    60.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ cat .git/refs/heads/master 
    61.     d44d5c0441ec0fbd12b5eaed21fbc5510993189b
    62.     這個文件的內容給出了一個對象ID,繼續尋根溯源:
    63.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git cat-file -t d44d
    64.     commit
    65.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git cat-file commit d44d
    66.     tree d9adad2c9efaf055b1c084b01c25a4a26d2fa3c1
    67.     parent 7c135fc46f3ee072b5cae1165fd55ff2c9d3fb94
    68.     author = <wangxigang2014@gmail.com> 1399286895 +0800
    69.     committer = <wangxigang2014@gmail.com> 1399286895 +0800

    70.     add emphasis
    71.     HEAD所指向的原來是最後一次commit的信息,而且經測試可知parent指的是上一次commit的信息。
    72.     

    73. 8. 索引文件的作用
    74.     我們在提交工作時,使用最多的命令就是git commit -a了,但是這個將提交你所做的所有工作。其實,如果你瞭解commit的工作機制,你會知道我們可以自定義提交哪些部分到哪些工作樹中,其實自由度很大的。
    75.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ echo "hello world,again">file.txt
    76.     這次,我們不急着執行commit命令,而是先用git diff看看差別情況:
    77.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git diff
    78.     diff --git a/file.txt b/file.txt
    79.     index 7fa347e..99a8556 100644
    80.     --- a/file.txt
    81.     +++ b/file.txt
    82.     @@ -+1 @@
    83.     -Hi,
    84.     +hello world,again
    85.     好了,我們可以看到git報告了我們剛纔所做的修改。下面我們來add一下,然後再git diff,看看diff有什麼變化呢:
    86.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git add .
    87.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git diff
    88.     大家可以看到在add之後的git diff的輸出竟然爲空了,但是此時我們尚未執行commit阿。如果這個時候你執行git diff HEAD,你仍然會看到修改報告:
    89.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git diff HEAD
    90.     diff --git a/file.txt b/file.txt
    91.     index 7fa347e..99a8556 100644
    92.     --- a/file.txt
    93.     +++ b/file.txt
    94.     @@ -+1 @@
    95.     -Hi,
    96.     +hello world,again
    97.     這就說明了一個問題:git diff不是在和HEAD比,而是和另外一個“神祕”內容在比,而這個“神祕”內容就是“索引文件”!
    98.     索引文件(index file)就是.git/index文件,它是二進制形式的文件。我們可以用ls-files來檢查它的內容。
    99.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project/.git$ git ls-files --stage
    100.     100644 99a8556676a8dd311153a871f1c5b464bfa5f3a2 0    file.txt
    101.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project/.git$ git cat-file -t 99a85
    102. blob
    103.     wangxigang@wangxigang-ThinkPad-Edge:~/test-project/.git$ git cat-file blob 99a85
    104.     hello world,again
    105.     很明顯,我們可以看到其內容已經是改進後的代碼了,怪不得git-diff會輸出空呢!

    106.     我們的結論就是git add的作用就是創建一個blob文件來記錄最新的修改代碼,並且在index file裏添加一個到此blob的鏈接。

    107.     更清楚且通俗的解釋就是:git維護的代碼分成三部分,“當前工作目錄”<->“index file”<->git倉庫。git commit會將index file中的改變寫到git倉庫;git add會將“當前工作目錄”的改變寫到“index file”;“commit -a”則會直接將“當前工作目錄”的改動同時寫到“index file”和“git倉庫”。
    1. 9.git日常工作命令(適合獨立開發者):
    2.     git -log:顯示提交日誌
    3.     git -checkout 或者 git -branch:用於切換和創建分支
    4.     git -add: 用於將修改內容加到index文件中
    5.     git -diff 和git -status:用於顯示開發者所做的修改
    6.     git -commit:用於提交當前修改到git倉庫
    7.     git -reset 和git checkout:用於撤銷某些修改
    8.     git -merge:用於合併兩個分支
    9.     git -rebase:用於維護topic分支
    10.     git -tag:用於標記標籤
    11.     
    12.     我們來舉一個例子,模擬一下獨立開發者使用git的情形。

    13.     首先使用一個tarball作爲整個項目的初始點。

    14.     $ tar -xzvf mypro.tat.gz

    15.     $ cd mypro

    16.     $ git-init

    17.     $ git add .

    18.     $ git commit -m “important of mypro source tree.

    19.     $ git tag v2.43 //給這個commit起了一個簡單的名字v2.43

    20.     下面我們建立分支並繼續開發:

    21.     $ git checkout -b alsa-audio //-b用於建立一個新的分支,分支名稱爲alsa-audio,並且轉移到此分支

    22.     …(開發/編譯/測試)

    23.     $ git checkout — curses/ux_audio_oss.c //用於取消對curses/ux_audio_oss.c文件的修改

    24.     $ git add curses/ux_audio_alsa.c //如果你在這一階段的開發過程中增加了新文件,那麼你應該用git-add告知git倉庫,當然,如果你只是修改或刪除,那麼使用git-commit -a就可以讓git查覺到了。

    25.     …(開發/編譯/測試)

    26.     $ git diff HEAD //查看一下我們即將commit的內容

    27.     $ git commit --s //提交

    28.     …(開發/編譯/測試)

    29.     $ git reset –soft HEAD^ //回覆到上一次commit的代碼。–soft選項表示不改動index file和working tree中的內容

    30.     …(開發/編譯/測試)

    31.     $ git diff ORIG_HEAD //look at the changes since the premature commit we took back(此句不太懂)

    32.     $ git commit --c ORIG_HEAD //重新提交,-c ORIG_HEAD表示使用原有的提交信息

    33.     $ git checkout master

    34.     $ git merge alsa-audio

    35.     $ git log –since=’3 days ago’

    36.     $ git log v2.43.. curses/ //查看自從v2.43以來的curses目錄下的代碼變化信息


    37. 10.git 命令(適合多人合作):
    38.        作爲項目開發者的一員,學會和隊友交流是一件很重要的事情。因此,我們不僅要掌握獨立開發者所掌握的命令,還要掌握用於溝通的git命令。
    39.        git-clone:複製別人的git倉庫到本地

    40.        git-pull和git-fetch:保持和別人的git倉庫的同步更新

    41.        git-push:共享方式。等同於CVS方式下的共享。

    42.        git-format-patch:利用郵件形式提交補丁。等同於內核開發方式。

    43.        
    44.        情景模擬:

    45.        $git clone git://git.kernel.org/pub/scm/…/torvalds/linux-2.6 my2.6

    46.        $cd my2.6

    47.        (開發…編譯…測試…)

    48.        $git commit --s //-s選項用於在commit信息後加上結束標誌

    49.        $git format-patch origin //從本地分支生成patch,用於email提交

    50.        $git pull //從origin取出更新併合併到當前分支

    51.        $git log -p ORIG_HEAD.. arch/i386 include/asm-i386

    52.        $git pull git://git.kernel.org/pub/…/jgarzik/libata-dev.git ALL //從特定git倉庫取出變更併合並。

    53.        $git reset –hard ORIG_HEAD //恢復到上一次的內容

    54.        $git gc //用垃圾回收機制清除由於reset而造成的垃圾代碼

    55.        $git fetch –tags //從origin取出tags並存儲到.git/refs/tags
    56.                             
    57.       1
    58.        commit和commit -a的區別

    59.        commit -a相當於:

    60.       第一步:自動地add所有改動的代碼,使得所有的開發代碼都列於index file中

    61.       第二步:自動地刪除那些在index file中但不在工作樹中的文件

    62.       第三步:執行commit命令來提交

    63.       2

    64.       log -p的中-p的作用

    65.       git log:顯示commit日誌

    66.       git log -p:不僅顯示commit日誌,而且同時顯示每次commit的代碼改變。

    67.       3

    68.       merge的用法及參數用法

    69.       git-merge主要用於將兩個或兩個以上的開發分支進行合併。

    70.       git merge branchname 用於將branchname分支合併到當前分支中。(如果合併發生衝突,需要自己解決衝突)

    71.       當merge命令自身無法解決衝突的時候,它會將工作樹置於一種特殊的狀態,並且給用戶提供衝突信息,以期用戶可以自己解決這些問題。當然在這個時候,未發生衝突的代碼已經被git merge登記在了index file裏了。如果你這個時候使用git diff,顯示出來的只是發生衝突的代碼信息。

    72.       在你解決了衝突之前,發生衝突的文件會一直在index file中被標記出來。這個時候,如果你使用git commit提交的話,git會提示:filename.txt needs merge

    73.       在發生衝突的時候,如果你使用git status命令,那麼會顯示出發生衝突的具體信息。

    74.       在你解決了衝突之後,你可以使用如下步驟來提交:

    75.       第一步:git add filename.txt

    76.       第二步:git commit

    77.       如果你希望撤銷一個分支到merge前的狀態,那麼使用如下命令:

    78.       $ git reset –hard HEAD //–hard表示將working tree和index file都撤銷到以前狀態

    79.       在這先偷偷的告訴你,–soft表示只撤銷commit,而保留working tree和index file的信息,–mixed會撤銷commit和index file,只保留working tree的信息。OK,如果你能記住–hard、–mixed和–soft的區別,那最好,如果記不住,也不用自責啦,以後還會講到。

    80.       4

    81.       fetch的用法

    82.       git-fetch用於從另一個reposoitory下載objects和refs。

    83.       命令格式爲:git fetch <options> <repository> <refspec>

    84.       其中<repository>表示遠端的倉庫路徑。

    85.       其中<refspec>的標準格式應該爲<src>:<dst><src>表示源的分支,如果<dst>不爲空,則表示本地的分支;如果爲空,則使用當前分支。

    86.       git fetch /home/bob/myrepo master:bobworks :用於從bob的工作目錄的master分支下載objects和refs到本地的bobworks分支中。

    87.       5

    88.       pull的用法

    89.       git-pull的作用就是從一個repository取出內容併合併到另一個repository中。

    90.       git pull是git fetch和git merge命令的一個組合。

    91.       git pull /home/bob/myrepo 這個命令的意思是從此目錄中取出內容併合併到當前分支中。

    92.       git pull .就相當於git merge。

    93.       6

    94.       commit信息詳解

    95.       你使用git log可以看到每一次commit的信息,大約如下格式:

    96.       $ git log
    97.       commit 5b888402aadd3cd41b3fe8c84a8658da07893b20
    98.       Author: rocrocket <wupengchong@gmail.com>
    99.       Date: Wed Sep 24 13:16:46 2008 +0800

    100.       after pull from rocrocket

    101.       

    102.       可以看到黑體部分爲本次commit的ID號,你可以根據這個號碼,使用git show來顯示這次commit的更詳細的信息,包括了提交時間、修改內容、git diff信息等等。

    103.       7

    104.       常量的使用方法

    105.       HEAD:表示最近一次的commit。

    106.       MERGE_HEAD:如果是merge產生的commit,那麼它表示除HEAD之外的另一個父母分支。

    107.       FETCH_HEAD:使用git-fetch獲得的object和ref的信息都存儲在這裏,這些信息是爲日後git-merge準備的。

    108.       HEAD^:表示HEAD父母的信息

    109.       HEAD^^:表示HEAD父母的父母的信息

    110.       HEAD~4:表示HEAD上溯四代的信息

    111.       HEAD^1:表示HEAD的第一個父母的信息

    112.       HEAD^2:表示HEAD的第二個父母的信息

    113.       COMMIT_EDITMSG:最後一次commit時的提交信息。

    114.       8

    115.       tag的用法

    116.       主要作用是給某次commit起一個好記的名字:

    117.       $ git tag V3 5b888 //以後可以用V3來代替複雜的名稱(5b888…)
    118.       $ git show V3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章