英文原版:https://www.kernel.org/pub/software/scm/git/docs/gittutorial.html
一、将自己的相关信息告诉git:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git config --global user.name "shanl"
shanl@shanl-VirtualBox:~/Work/GitStudy$ git config --global user.email "****@qq.com"
二、导入一个git项目:
假设在项目所在的文件夹为:/home/shanl/Work/GitStudy,在该目录下有一个main.c文件,那么导入一个git项目的步骤如下:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git init
Initialized empty Git repository in /home/shanl/Work/GitStudy/.git/
shanl@shanl-VirtualBox:~/Work/GitStudy$ git add .
shanl@shanl-VirtualBox:~/Work/GitStudy$ git commit
[master (root-commit) 2ae27a3] This is my first git project time:2013.8.20
1 file changed, 7 insertions(+)
create mode 100644 main.c
git init命令用于初始化当前所在目录的这个项目,shell返回的提示表明已经建立了一个.git隐藏目录来保存这个项目目前的进展信息。我们可以用ls -a看到它。
git add .这个命令要求git给我目前的这个项目制作一个快照snapshot(快照只是登记留名,快照不等于记录在案,git管快照叫做索引index)。快照一般会暂时存储在一个临时存储区域中。
git commit用于将快照里登记的内容永久写入git仓库中,也就是开发者已经想好了要提交自己的开发成果了。
三、查看git仓库和工作目录之间的差异:
我们的工作目录有一个main.c文件,内容如下:
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
由于之前已经使用git commit命令,将工作目录中的索引文件(执行git add .后生成的文件)同步到git仓库中,所以git仓库中的main.c 内容和索引文件里的main.c是一样的。
下面将工作目录中的main.c修改如下:
#include <stdio.h>
int main()
{
printf("Shanl Study Git!\n");
printf("Hello world!\n");
return 0;
}
执行:shanl@shanl-VirtualBox:~/Work/GitStudy$
git diff --cached
发现没有任何输出,这是因为git diff 加上--cached参数目的是用来查看index file和仓库之间代码的区别的
如果不加--cahed,现象如下:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git diff
diff --git a/main.c b/main.c
index f170c55..6fe30f9 100644
--- a/main.c
+++ b/main.c
@@ -2,6 +2,7 @@
int main()
{
+ printf("Shanl Study Git!\n");
printf("Hello world!\n");
return 0;
}
这是因为:省略–cached选项的话,就是比较working tree和index file的区别,我们并没有执行git add . ,同时又修改了Working tree中的main.c,所以会出现差异信息
除了使用git diff可以查看文件中的差异,还可以使用git status查看整个项目的差异:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: main.c
#
如何将差异的合并到git仓库?
使用下面的方法:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git add main.c
shanl@shanl-VirtualBox:~/Work/GitStudy$ git commit
[master fa74600] This is My second GitVersion : 0.0.2
1 file changed, 1 insertion(+)
如何查看已经将差异合并到git仓库,使用git log命令进行查看:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git log
commit fa74600608a31d867ff9425645a37e6873940af9
Author: shanl <313905584@qq.com>
Date: Tue Aug 20 20:44:27 2013 +0800
This is My second GitVersion : 0.0.2
commit 2ae27a3cd380f94763b5177936cfeeb7da0440f7
Author: shanl <313905584@qq.com>
Date: Tue Aug 20 20:17:01 2013 +0800
This is my first git project
time:2013.8.20
This is My second GitVersion : 0.0.2 就是我合并差异后打印的信息。
再使用git diff命令就没有相关的信息输出了,如下所示:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git diff --cached
shanl@shanl-VirtualBox:~/Work/GitStudy$ git diff
shanl@shanl-VirtualBox:~/Work/GitStudy$
四、管理分支:
1、建立分支:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git branch experiment
2、查看分支:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git branch -a
experiment
* master
从上面可以看到,当前分支是在master分支上。
3、切换分支:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git checkout experiment
Switched to branch 'experiment'
在通过git branch查看,当前已经在experiment分支上了:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git branch
* experiment
master
在该分支下的main.c建立一个报时功能的程序,内容如下:
#include <stdio.h>
#include<time.h>
int main()
{
time_t mytime;
struct tm *mylocaltime;
mytime=time(NULL);
mylocaltime=localtime(&mytime);
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("Shanl Study Git!\n");
printf("Hello world!\n");
return 0;
}
下面的任务就是提交程序到分支项目:(注意虽然已经确认了分支的正确性,但还是不能着急报告给“主干道”,而还要先在分支上提交工作)
shanl@shanl-VirtualBox:~/Work/GitStudy$ git commit -a
[experiment 2fc1dcd] This is a timer function program
1 file changed, 12 insertions(+)
git commit -a 将git add . 和git commit 整合在了一起,简化了操作。
然后就可以切换到“主干道”了:
shanl@shanl-VirtualBox:~/Work/GitStudy$ git checkout master
Switched to branch 'master'
(走在主干道上的你,无论使用log或是status命令都无法看到刚才在experimental分支所进行的工作。)
为了让git处理分支的本领展现的淋漓尽致,我们现在在主干道上再做一些改进。我们希望程序在最开始执行的时候输出一行“Welcome to shanl's blog”。这行很简单,在主干道上完成后,main.c的内容如下:
#include <stdio.h>
int main()
{
printf("Welcome to shanl's Blog!\n");
printf("Shanl Study Git!\n");
printf("Hello world!\n");
return 0;
}
然后在主干道上使用git commit -a提交!
好!我们清理一下思路。在experiment分支上有一个增加了报时功能的main.c,而在主干道上有一个增加了welcome的main.c。它们都进行了git commit -a命令。
下面,我们就来合并“分支”和“主干道”(你猜会发生什么?):
使用:git merge experiment来合并分支到主干道
shanl@shanl-VirtualBox:~/Work/GitStudy$ git merge experiment
Auto-merging main.c
CONFLICT (content): Merge conflict in main.c
Automatic merge failed; fix conflicts and then commit the result.
发现合并出错。
再打开主干道的main.c文件看下,内容为:
#include <stdio.h>
#include<time.h>
int main()
{
<<<<<<< HEAD
printf("Welcome to shanl's Blog!\n");
=======
time_t mytime;
struct tm *mylocaltime;
mytime=time(NULL);
mylocaltime=localtime(&mytime);
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);
>>>>>>> experiment
printf("Shanl Study Git!\n");
printf("Hello world!\n");
return 0;
}
中间的加黑的
“=======”表示两端冲突代码的分隔。可以看出git迷惑之处在于它不知道是把
welcome这行放在前面还是把报时功能这段放在前面。
这样可以修改这个main.c文件设置为满意的位置,我修改的组中合并后的main.c内容如下;
#include <stdio.h>
#include<time.h>
int main()
{
printf("Welcome to shanl's Blog!\n");
time_t mytime;
struct tm *mylocaltime;
mytime=time(NULL);
mylocaltime=localtime(&mytime);
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("Shanl Study Git!\n");
printf("Hello world!\n");
return 0;
}
最后执行:git commit -a即可合并成功并导入到仓库中。
shanl@shanl-VirtualBox:~/Work/GitStudy$ git commit -a
[master 64b4d7e] This is the new branch Merge branch 'experiment'
使用gitk命令打开图形化界面: