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 "you@gmail.com"

  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值