- 1. 安装git
- git:http://git-scm.com/
- OS版本:ubuntu12.10
- 安装git: $:sudo apt-get install git-core
-
- 2.介绍
- 维基百科:http://zh.wikipedia.org/wiki/Git
- git是一个版本控制系统;官方解释:版本控制是一种软件工程技巧,在开发过程中,确保不同人所编辑的统一文档都得到更新。
-
- 3.配置git系统,比如自己的姓名、email。
- git config --global user.name "Your name"
- git config --global user.email "you@gmail.com"
-
- 我照例执行:
- [root@wangxigang ~]# git config –global user.name “Linuxer”
- [root@wangxigang ~]# git config –global user.email “wangxigang2014@gmail.com”
- 4.下面学习导入一个新的git项目
- (假设只有一个main.c文件)该项目在gitfile目录下,则导入项目的步骤:
- wangxigang@wangxigang-ThinkPad-Edge:~$ cd gitfile/
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git init
- Initialized empty Git repository in /home/wangxigang/gitfile/.git/
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ ls -a
- . .. .git
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git add .
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit
- # On branch master #
- # Initial commit
- #
- nothing to commit (create/copy files and use "git add" to track)
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit
- # On branch master
- #
- # Initial commit
- #
- # Untracked files:
- # (use "git add <file>..." to include in what will be committed)
- #
- # main.c
- nothing added to commit but untracked files present (use "git add" to track)
-
- 解释:
- git init command 用于初始化当前所在目录的这个项目;
- git add . command 要求git给当前的项目制作一个快照snapshot(快照只登记留名,快照不等于记录在案)。暂时存储一个临时存储区;
- git commit 用于将快照登记的内容永久写入git仓库中。在输入git commit时回转到一个vi窗口,要求开发者输入这次提交的版本和开发信息。意思是这个项目的版本是多少,已完成了那些功能,还有那些功能没有完成等等信息。
-
- 5.我们main.c文件的内容是一个 hello world!
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ cat -n main.c
- 1 #include <stdio.h>
- 2
- 3 int main(){
- 4 printf("hello world!\n");
- 5 return 0;
- 6 }
-
- 这时候修改加一行:printf("version:0.0.1");
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ cat -n main.c
- 1 #include <stdio.h>
- 2
- 3 int main(){
- 4 printf ("version:0.0.1\n");
- 5 printf("hello world!\n");
- 6 return 0;
- 7 }
-
- 最后两道工序由开发者最后确认一下(自己的修改):
- [root@wangxigang]# git diff
- diff –git a/main.c b/main.c
- index 3a88d8c..e0fe92e 100644
- — a/main.c
- +++ b/main.c
- @@ -1,6 +1,7 @@
- #include<stdio.h>
- int main()
- {
- +printf(“Version: 0.01\n”);
- printf(“hello world!\n”);
- return 0;
- }
-
- 使用git diff了解不同之后,还可以使用git status命令获得整体的改动信息;
- [root@wangxigang]# git status
- # On branch master
- # Changed but not updated:
- # (use “git add <file>…” to update what will be committed)
- #
- # modified: main.c
- #
- no changes added to commit (use “git add” and/or “git commit -a”)
-
- 下面进入提交阶段:
- [wangxigang@wangxigang]# git add main.c
- 这句话告诉git, 我已经修改了main.c;
-
- 提交我的工作:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit
- [master (root-commit) dceb92b] this is senond project
- 1 file changed, 7 insertions(+)
- create mode 100644 main.c
-
- 查看开发日志:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git log
- commit dceb92b3ebf10e3c6437c1edc27d8af75ae0f89d
- Author: = <wangxigang2014@gmail.com>
- Date: Tue Apr 29 19:27:26 2014 +0800
-
- this is senond project
- 如果查看更详细的开发日志:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git log -p
- commit dceb92b3ebf10e3c6437c1edc27d8af75ae0f89d
- Author: = <wangxigang2014@gmail.com>
- Date: Tue Apr 29 19:27:26 2014 +0800
-
- this is senond project
-
- diff --git a/main.c b/main.c
- new file mode 100644
- index 0000000..7e96f29
- --- /dev/null
- +++ b/main.c
- @@ -0,0 +1,7 @@
- +#include <stdio.h>
- +
- +int main(){
- + printf("version:0.0.1\n");
- + printf("hello world!\n");
- + return 0;
- +}
-
-
- 5.如何管理分支:
- 还是接着我们之前的main.c的项目走。我想试着开发一个报时功能加入到main.c中,但我不保证这个功能一定能够实现。这个时候可以运行git branch命令来开启一个实验分支:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git branch experimental
-
- 好了,分支分支建立完毕;
- 我们查看一下:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git branch
- experimental
- * master
- 直接输入git branch,不加任何后续参数,就表示让git列出所有已存在的分支。前面带“星号”的分支表示当前所在的分支。
- 切换到experimental分支:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git checkout experimental
- Switched to branch 'experimental'
- 修改之后的main.c如下:
-
- [wangxigang@wangxigang]# cat -n main.c
- 1 #include<stdio.h>
- 2 #include<time.h>
- 3 int main()
- 4 {
- 5 time_t mytime;
- 6 struct tm *mylocaltime;
- 7 mytime=time(NULL);
- 8 mylocaltime=localtime(&mytime);
- 9 printf(“Year:%d\n”,mylocaltime->tm_year+1900);
- 10 printf(“Month:%d\n”,mylocaltime->tm_mon+1);
- 11 printf(“Day:%d\n”,mylocaltime->tm_mday);
- 12 printf(“Hour:%d\n”,mylocaltime->tm_hour);
- 13 printf(“Min:%d\n”,mylocaltime->tm_min);
- 14 printf(“Second:%d\n”,mylocaltime->tm_sec);
- 15 printf(“Version: 0.02\n”);
- 16 printf(“Hello world!\n”);
- 17 return 0;
- 18 }
- 黑体为新加的内容。好了,我的报时功能已经完成了。看来这个分支是可行的:)
-
- 运行此程序,运行结果如下:
-
- [wangxigang@wangxigang]# ./a.out
- Year:2008
- Month:9
- Day:21
- Hour:11
- Min:17
- Second:4
- Version: 0.02
- Hello
-
- 下面的任务就是提交程序到分支项目:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit -a
- [experimental f37403e] this is a third project
- 1 file changed, 19 insertions(+), 7 deletions(-)
- rewrite main.c (66%)
-
- 然后就可以切换到“主干道”了:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git checkout master
- Switched to branch 'master'
-
- 为了让git处理分支的本领展现的淋漓尽致,我们现在在主干道上再做一些改进:
- [wangxigang@wangxigang]# cat -n main.c
- 1 #include<stdio.h>
- 2 int main()
- 3 {
- 4 printf(“Welcome\n”);
- 5 printf(“Version: 0.02\n”);
- 6 printf(“Hello world!\n”);
- 7 return 0;
- 8 }
- 然后在主干道上使用git commit -a提交!
-
- 合并“分支”和“主干道”:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git merge experimental
- Auto-merging main.c
- CONFLICT (content): Merge conflict in main.c
- Automatic merge failed; fix conflicts and then commit the result.
-
- 报错了!因为我看到了conflict和failed这样的字眼。看来主干道上加入的welcome和分支干道产生了冲突。我们决定来修改主干道的welcome语句到文章的最后部位。主干道的main.c此时为:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ cat -n main.c
- 1 #include <stdio.h>
- 2 #include <time.h>
- 3
- 4 int main(){
- 5 <<<<<<< HEAD
- 6 printf("welcome");
- 7 printf("version:0.0.1\n");
- 8 printf("hello world!\n");
- 9 return 0;
- 10 =======
- 11 time_t mytime;
- 12 struct tm *mylocaltime;
- 13 mytime = time(NULL);
- 14 mylocaltime = localtime(&mytime);
- 15 printf(“Year:%d\n”,mylocaltime->tm_year+1900);
- 16 printf(“Year:%d\n”,mylocaltime->tm_year+1900);
- 17 printf(“Month:%d\n”,mylocaltime->tm_mon+1);
- 18 printf(“Day:%d\n”,mylocaltime->tm_mday);
- 19 printf(“Hour:%d\n”,mylocaltime->tm_hour);
- 20 printf(“Min:%d\n”,mylocaltime->tm_min);
- 21 printf(“Second:%d\n”,mylocaltime->tm_sec);
- 22 printf ("version:0.0.2\n");
- 23 printf("hello world!\n");
- 24 return 0;
- 25 >>>>>>> experimental
- 26 }
- 现在人工的修改main.c文件:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ vi main.c
- #include <stdio.h>
- #include <time.h>
-
- int main(){
- printf("welcome");
- time_t mytime;
- struct tm *mylocaltime;
- mytime = time(NULL);
- mylocaltime = localtime(&mytime);
- printf(“Year:%d\n”,mylocaltime->tm_year+1900);
- printf(“Year:%d\n”,mylocaltime->tm_year+1900);
- printf(“Month:%d\n”,mylocaltime->tm_mon+1);
- printf(“Day:%d\n”,mylocaltime->tm_mday);
- printf(“Hour:%d\n”,mylocaltime->tm_hour);
- printf(“Min:%d\n”,mylocaltime->tm_min);
- printf(“Second:%d\n”,mylocaltime->tm_sec);
- printf ("version:0.0.2\n");
- printf("hello world!\n");
- return 0;
- }
- 好,解决冲突后再次提交!
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git commit -a
-
- 分支的任务也就完成了,可以删除分支了:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git branch -d experimental
- Deleted branch experimental (was f37403e).
-
- 6.如何在git里进行多人合作:
- 目前我的项目放在/home/wangxigang/gitfile里面,其他人也希望贡献他的代码,可以这样做:
- $ git clone /home/wangxigang/gitfile myproject
- 这样其他就可以将我的成果克隆到他的家目录 myproject中。此时其他人可以git commit -a提交他的改进成果。
- 我将他人的改进合并我的项目中:
- cd /home/wangxigang/gitfile
- git pull /home/somepeople/myproject master
- 将其他人的工作master合并到我的当前分支上。
- pull 命令完成两个动作,首先从远端分支获取diff信息,第二个动作就是改变合并到本地分支中。
- 7.对像数据库
- 建立一个仓库:
- wangxigang@wangxigang-ThinkPad-Edge:~$ mkdir test-project
- wangxigang@wangxigang-ThinkPad-Edge:~$ cd test-project/
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git init
- Initialized empty Git repository in /home/wangxigang/test-project/.git/
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ echo 'Hi,wangxigang'>file.txt
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git add .
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git commit -a -m 'initial commit' //此处的-m选项表示“后面的参数是本次提交的历史记录”
- [master (root-commit) 7c135fc] initial commit
- 1 file changed, 1 insertion(+)
- create mode 100644 file.txt
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ echo 'Hi,wangxigang!'>file.txt
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git commit -a -m 'add emphasis' //此处的-m选项表示“后面的参数是本次提交的历史记录”
- [master d44d5c0] add emphasis
- 1 file changed, 1 insertion(+), 1 deletion(-)
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git log
- commit d44d5c0441ec0fbd12b5eaed21fbc5510993189b
- Author: = <wangxigang2014@gmail.com>
- Date: Mon May 5 18:48:15 2014 +0800
-
- add emphasis
-
- commit 7c135fc46f3ee072b5cae1165fd55ff2c9d3fb94
- Author: = <wangxigang2014@gmail.com>
- Date: Mon May 5 18:47:12 2014 +0800
-
- initial commit
-
- 这40位十六进制数是一个SHA1哈希数(Secure Hash Algorithm),它可以保证每次commit生成的名称都是唯一的且可以永远有效的。
- 执行下面命令:
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git cat-file -t 7c135
- commit
- //cat-file命令中-t选项表示列出相应ID的对象类型;241e是刚才commit后得出的SHA1码
- commit //可以看到此ID对应的对象类型为一次commit
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git cat-file commit 7c135
- tree 845633fd6c3063a134e11665aa05db923f21b91e
- author = <wangxigang2014@gmail.com> 1399286832 +0800
- committer = <wangxigang2014@gmail.com> 1399286832 +0800
-
- initial commit
-
- 你应该可以注意到命令输出结果中包含了tree,tree的ID表示了一个BLOB对象(二进制对象),此对象对应着一个文件或另一个tree。你可以使用ls-tree命令来查询关于这个tree的更详细信息:
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git ls -tree 845633
- git: 'ls' is not a git command. See 'git --help'.
-
- Did you mean this?
- log
- 在.git目录下的HEAD文件比较特殊,查看.git/HEAD文件:
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile/.git/objects$ cd ..
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile/.git$ cat HEAD
- ref: refs/heads/master
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile/.git$ cd ..
- wangxigang@wangxigang-ThinkPad-Edge:~/gitfile$ git branch
- * master
- 可以看到HEAD文件指示出当前所在的分支名称是master。
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ cat .git/refs/heads/master
- d44d5c0441ec0fbd12b5eaed21fbc5510993189b
- 这个文件的内容给出了一个对象ID,继续寻根溯源:
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git cat-file -t d44d
- commit
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git cat-file commit d44d
- tree d9adad2c9efaf055b1c084b01c25a4a26d2fa3c1
- parent 7c135fc46f3ee072b5cae1165fd55ff2c9d3fb94
- author = <wangxigang2014@gmail.com> 1399286895 +0800
- committer = <wangxigang2014@gmail.com> 1399286895 +0800
-
- add emphasis
- HEAD所指向的原来是最后一次commit的信息,而且经测试可知parent指的是上一次commit的信息。
-
-
- 8. 索引文件的作用
- 我们在提交工作时,使用最多的命令就是git commit -a了,但是这个将提交你所做的所有工作。其实,如果你了解commit的工作机制,你会知道我们可以自定义提交哪些部分到哪些工作树中,其实自由度很大的。
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ echo "hello world,again">file.txt
- 这次,我们不急着执行commit命令,而是先用git diff看看差别情况:
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git diff
- diff --git a/file.txt b/file.txt
- index 7fa347e..99a8556 100644
- --- a/file.txt
- +++ b/file.txt
- @@ -1 +1 @@
- -Hi,
- +hello world,again
- 好了,我们可以看到git报告了我们刚才所做的修改。下面我们来add一下,然后再git diff,看看diff有什么变化呢:
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git add .
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git diff
- 大家可以看到在add之后的git diff的输出竟然为空了,但是此时我们尚未执行commit阿。如果这个时候你执行git diff HEAD,你仍然会看到修改报告:
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project$ git diff HEAD
- diff --git a/file.txt b/file.txt
- index 7fa347e..99a8556 100644
- --- a/file.txt
- +++ b/file.txt
- @@ -1 +1 @@
- -Hi,
- +hello world,again
- 这就说明了一个问题:git diff不是在和HEAD比,而是和另外一个“神秘”内容在比,而这个“神秘”内容就是“索引文件”!
- 索引文件(index file)就是.git/index文件,它是二进制形式的文件。我们可以用ls-files来检查它的内容。
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project/.git$ git ls-files --stage
- 100644 99a8556676a8dd311153a871f1c5b464bfa5f3a2 0 file.txt
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project/.git$ git cat-file -t 99a85
- blob
- wangxigang@wangxigang-ThinkPad-Edge:~/test-project/.git$ git cat-file blob 99a85
- hello world,again
- 很明显,我们可以看到其内容已经是改进后的代码了,怪不得git-diff会输出空呢!
-
- 我们的结论就是git add的作用就是创建一个blob文件来记录最新的修改代码,并且在index file里添加一个到此blob的链接。
-
- 更清楚且通俗的解释就是:git维护的代码分成三部分,“当前工作目录”<->“index file”<->git仓库。git commit会将index file中的改变写到git仓库;git add会将“当前工作目录”的改变写到“index file”;“commit -a”则会直接将“当前工作目录”的改动同时写到“index file”和“git仓库”。
- 9.git日常工作命令(适合独立开发者):
- git -log:显示提交日志
- git -checkout 或者 git -branch:用于切换和创建分支
- git -add: 用于将修改内容加到index文件中
- git -diff 和git -status:用于显示开发者所做的修改
- git -commit:用于提交当前修改到git仓库
- git -reset 和git checkout:用于撤销某些修改
- git -merge:用于合并两个分支
- git -rebase:用于维护topic分支
- git -tag:用于标记标签
-
- 我们来举一个例子,模拟一下独立开发者使用git的情形。
-
- 首先使用一个tarball作为整个项目的初始点。
-
- $ tar -xzvf mypro.tat.gz
-
- $ cd mypro
-
- $ git-init
-
- $ git add .
-
- $ git commit -m “important of mypro source tree.”
-
- $ git tag v2.43 //给这个commit起了一个简单的名字v2.43
-
- 下面我们建立分支并继续开发:
-
- $ git checkout -b alsa-audio //-b用于建立一个新的分支,分支名称为alsa-audio,并且转移到此分支
-
- …(开发/编译/测试)
-
- $ git checkout — curses/ux_audio_oss.c //用于取消对curses/ux_audio_oss.c文件的修改
-
- $ git add curses/ux_audio_alsa.c //如果你在这一阶段的开发过程中增加了新文件,那么你应该用git-add告知git仓库,当然,如果你只是修改或删除,那么使用git-commit -a就可以让git查觉到了。
-
- …(开发/编译/测试)
-
- $ git diff HEAD //查看一下我们即将commit的内容
-
- $ git commit -a -s //提交
-
- …(开发/编译/测试)
-
- $ git reset –soft HEAD^ //回复到上一次commit的代码。–soft选项表示不改动index file和working tree中的内容
-
- …(开发/编译/测试)
-
- $ git diff ORIG_HEAD //look at the changes since the premature commit we took back(此句不太懂)
-
- $ git commit -a -c ORIG_HEAD //重新提交,-c ORIG_HEAD表示使用原有的提交信息
-
- $ git checkout master
-
- $ git merge alsa-audio
-
- $ git log –since=’3 days ago’
-
- $ git log v2.43.. curses/ //查看自从v2.43以来的curses目录下的代码变化信息
-
-
- 10.git 命令(适合多人合作):
- 作为项目开发者的一员,学会和队友交流是一件很重要的事情。因此,我们不仅要掌握独立开发者所掌握的命令,还要掌握用于沟通的git命令。
- git-clone:复制别人的git仓库到本地
-
- git-pull和git-fetch:保持和别人的git仓库的同步更新
-
- git-push:共享方式。等同于CVS方式下的共享。
-
- git-format-patch:利用邮件形式提交补丁。等同于内核开发方式。
-
-
- 情景模拟:
-
- $git clone git://git.kernel.org/pub/scm/…/torvalds/linux-2.6 my2.6
-
- $cd my2.6
-
- (开发…编译…测试…)
-
- $git commit -a -s //-s选项用于在commit信息后加上结束标志
-
- $git format-patch origin //从本地分支生成patch,用于email提交
-
- $git pull //从origin取出更新并合并到当前分支
-
- $git log -p ORIG_HEAD.. arch/i386 include/asm-i386
-
- $git pull git://git.kernel.org/pub/…/jgarzik/libata-dev.git ALL //从特定git仓库取出变更并合并。
-
- $git reset –hard ORIG_HEAD //恢复到上一次的内容
-
- $git gc //用垃圾回收机制清除由于reset而造成的垃圾代码
-
- $git fetch –tags //从origin取出tags并存储到.git/refs/tags
-
- 1
- commit和commit -a的区别
-
- commit -a相当于:
-
- 第一步:自动地add所有改动的代码,使得所有的开发代码都列于index file中
-
- 第二步:自动地删除那些在index file中但不在工作树中的文件
-
- 第三步:执行commit命令来提交
-
- 2
-
- log -p的中-p的作用
-
- git log:显示commit日志
-
- git log -p:不仅显示commit日志,而且同时显示每次commit的代码改变。
-
- 3
-
- merge的用法及参数用法
-
- git-merge主要用于将两个或两个以上的开发分支进行合并。
-
- git merge branchname 用于将branchname分支合并到当前分支中。(如果合并发生冲突,需要自己解决冲突)
-
- 当merge命令自身无法解决冲突的时候,它会将工作树置于一种特殊的状态,并且给用户提供冲突信息,以期用户可以自己解决这些问题。当然在这个时候,未发生冲突的代码已经被git merge登记在了index file里了。如果你这个时候使用git diff,显示出来的只是发生冲突的代码信息。
-
- 在你解决了冲突之前,发生冲突的文件会一直在index file中被标记出来。这个时候,如果你使用git commit提交的话,git会提示:filename.txt needs merge
-
- 在发生冲突的时候,如果你使用git status命令,那么会显示出发生冲突的具体信息。
-
- 在你解决了冲突之后,你可以使用如下步骤来提交:
-
- 第一步:git add filename.txt
-
- 第二步:git commit
-
- 如果你希望撤销一个分支到merge前的状态,那么使用如下命令:
-
- $ git reset –hard HEAD //–hard表示将working tree和index file都撤销到以前状态
-
- 在这先偷偷的告诉你,–soft表示只撤销commit,而保留working tree和index file的信息,–mixed会撤销commit和index file,只保留working tree的信息。OK,如果你能记住–hard、–mixed和–soft的区别,那最好,如果记不住,也不用自责啦,以后还会讲到。
-
- 4
-
- fetch的用法
-
- git-fetch用于从另一个reposoitory下载objects和refs。
-
- 命令格式为:git fetch <options> <repository> <refspec>…
-
- 其中<repository>表示远端的仓库路径。
-
- 其中<refspec>的标准格式应该为<src>:<dst>,<src>表示源的分支,如果<dst>不为空,则表示本地的分支;如果为空,则使用当前分支。
-
- git fetch /home/bob/myrepo master:bobworks :用于从bob的工作目录的master分支下载objects和refs到本地的bobworks分支中。
-
- 5
-
- pull的用法
-
- git-pull的作用就是从一个repository取出内容并合并到另一个repository中。
-
- git pull是git fetch和git merge命令的一个组合。
-
- git pull /home/bob/myrepo 这个命令的意思是从此目录中取出内容并合并到当前分支中。
-
- git pull .就相当于git merge。
-
- 6
-
- commit信息详解
-
- 你使用git log可以看到每一次commit的信息,大约如下格式:
-
- $ git log
- commit 5b888402aadd3cd41b3fe8c84a8658da07893b20
- Author: rocrocket <wupengchong@gmail.com>
- Date: Wed Sep 24 13:16:46 2008 +0800
-
- after pull from rocrocket
-
-
-
- 可以看到黑体部分为本次commit的ID号,你可以根据这个号码,使用git show来显示这次commit的更详细的信息,包括了提交时间、修改内容、git diff信息等等。
-
- 7
-
- 常量的使用方法
-
- HEAD:表示最近一次的commit。
-
- MERGE_HEAD:如果是merge产生的commit,那么它表示除HEAD之外的另一个父母分支。
-
- FETCH_HEAD:使用git-fetch获得的object和ref的信息都存储在这里,这些信息是为日后git-merge准备的。
-
- HEAD^:表示HEAD父母的信息
-
- HEAD^^:表示HEAD父母的父母的信息
-
- HEAD~4:表示HEAD上溯四代的信息
-
- HEAD^1:表示HEAD的第一个父母的信息
-
- HEAD^2:表示HEAD的第二个父母的信息
-
- COMMIT_EDITMSG:最后一次commit时的提交信息。
-
- 8
-
- tag的用法
-
- 主要作用是给某次commit起一个好记的名字:
-
- $ git tag V3 5b888 //以后可以用V3来代替复杂的名称(5b888…)
- $ git show V3
- 6.如何在git里进行多人合作:
git学习
最新推荐文章于 2024-08-10 09:47:10 发布