Git 基础

在当前目录初始化,使用git init命令,初始化后当前目录下会出现一个名为.git的目录。

1
git init

从现有仓库进行克隆,需要git clone命令,克隆仓库的命令格式为git clone [url],如下克隆ruby的Git代码仓库。

1
git clone git://github.com/schacon/grit.git

执行完之后你会在当前目录下看到一个名为“grit”的目录。其中包含一个.git目录,也可以自定义要新建项目的名称。

1
git clone git://github.com/schacon/grit.git mygrit #将代码克隆到mygrit目录下

git文件生命周期如下:

git文件生命周期

检查当前文件状态:git status命令。

1
2
3
git status  #执行git status出现下面的输出,说明当前工作目录相当干净。
# On branch master
nothing to commit (working directory clean)

现在新创建个文件README,运行git status会显示如下:

1
2
3
4
5
6
7
8
chunxiao@chunxiao-VirtualBox:~/chunxiao/gittest/test1$ touch README
chunxiao@chunxiao-VirtualBox:~/chunxiao/gittest/test1$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# README
nothing added to commit but untracked files present (use "git add" to track)

输出中会看到该README文件出现在未跟踪文件列表中。

跟踪新文件,使用git add命令。所以,跟踪README文件,运行:

1
2
3
4
5
6
7
8
chunxiao@chunxiao-VirtualBox:~/chunxiao/gittest/test1$ git add README
chunxiao@chunxiao-VirtualBox:~/chunxiao/gittest/test1$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
#

可以看到当前的文件状态就是已暂存状态。如果现在进行提交,那么该文件此时此刻的版本会被保留在历史记录中。

修改已经跟踪的文件,然后在运行status命令,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
chunxiao@chunxiao-VirtualBox:~/chunxiao/gittest/test1$ vi file1 
chunxiao@chunxiao-VirtualBox:~/chunxiao/gittest/test1$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
#
# 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: file1
#

从输出可以看出,file1的内容已经发生了变化,但是还没有放到暂存区。如果要暂存这次更新,也需要使用git add命令(这个是个多功能命令,根据目标文件的状态不同,此命令的效果也是不同的:可以使用它来开始跟踪新文件,或者把已经跟踪的文件放到暂存区,还可以用于合并是把有冲突的文件标记为已解决状态)。下面运行git add,在查看状态如下:

1
2
3
4
5
6
7
8
9
chunxiao@chunxiao-VirtualBox:~/chunxiao/gittest/test1$ git add file1
chunxiao@chunxiao-VirtualBox:~/chunxiao/gittest/test1$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
# modified: file1
#

需要注意的是,git只是暂存了运行git add命令时候的版本。所以运行了git add之后又修订了文件,需要重新运行git add将最新版本暂存起来。

一般我们会有些文件无需纳入git的管理,我们可以使用.gitignore文件,来配置需要忽略的文件。文件.gitignore的格式规范如下:

  • 所有空格或者以注释符号#开头的行都会被git忽略。
  • 可以使用标准的glob匹配模式。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓glob模式是指所使用的简化的正则表达式。下面再看个例子:

1
2
3
4
5
6
# 此为注释– 将被Git 忽略
*.a # 忽略所有.a 结尾的文件
!lib.a # 但lib.a 除外
/TODO # 仅仅忽略项目根目录下的TODO 文件,不包括subdir/TODO
build/ # 忽略build/ 目录下的所有文件
doc/*.txt # 会忽略doc/notes.txt 但不包括doc/server/arch.txt

提交更新,git commit

1
2
3
4
chunxiao@chunxiao-VirtualBox:~/chunxiao/gittest/test1$ git commit -m 'first commit' #-m参数,代表提交的说明。
[master 1aa3400] commit
1 file changed, 1 insertion(+), 1 deletion(-)
create mode 100644 README

提交后,可以看到是哪个分支提交的,和本次提交完整SHA-1校验和是什么(1aa3400),以及本次提交中有多少文件修订过,多少行添加和修改过。
提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保存已修改状态。

尽管使用暂存区域的方式可以准备提交的细节,但有时候这么做很繁琐。git提供了一个跳过暂存区域的方式,只要在提交的时候添加-a参数,就会自动把所有已经跟踪过的文件暂存起来并且一并提交,如下:

1
git commit -a -m 'commit2'

—EOF—