git入门一(一次commit)

网上git的资料已经很多了,可git这个东西一开始还是比较难理解,以至于我周围的朋友都说这东西太难用了。我自己也玩了两年的linux,但是接触git这个东西一开始还是挺难理解的。其实主要是不像其他工具那样,git还是得静下心来好好看看的。自己对git也不是特别熟悉,所以不能深入解释里面的工作细节,只解释一些常用到的。
在一个项目下面初始化一个git仓库,主要会分成三个部分。一部分是你的工作目录(working),说白了就是你的项目代码。一部分是索引文件(staged file),这里就是你项目的tmp文件。还有一部分是仓库(History),这里才是git真正的数据库,存放你的项目记录的地方。举个例子,我们通用的vim编辑一个文件,一旦开始编辑,目录下就会产生一个.swp文件,然后你编辑完成后按下wq退出,才会真正存到编辑的文件里面。

git1
图片from http://blog.jobbole.com/tag/git/page/2/

git的工作流程也是这样,你初始化一个git仓库后,git监控要指定的文件,你修改了文件之后会暂时存到staged里面去,也就是tmp的部分。当你commit的时候就会真正把tmp里面的文件提交到git仓库里面,这才是真正的一次操作。

下面是一个例子:

$ mkdir gittest
$ echo "This is git test" > hello.txt
$ git init
Initialized empty Git repository in /private/var/root/gittest/.git/

$ git add hello.txt

看上面的命令
git init代表是初始化一个git仓库,这时候会在本地目录下建立一个.git文件夹,所有的信息都会记录在里面。
git add hello.txt 这里的意思我要跟踪hello.txt,这时候其实git已经把hello.txt的快照存到了index里面,也就是staged部分。但是还没有存到数据库,git add .代表跟踪下面所有的文件。一旦设立了跟踪信息,你对文件代码所有的改变都会被git跟踪到,会标记到modified。
如果你新建了一个代码文件,也要进行git add new_file,要建立跟踪。

接下来是提交到仓库里,这一步才是真正的存储信息。

$ git commit -m "This is first commit"
*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'root@localhost.(none)')

咦,报错了。对,git其实在使用之前是需要配置帐号和邮箱的,不然没发git commit。其实也不麻烦,就两条命令,配置好了之后就可以一直commit了。配置好之后,再 git commit -m "This is first commit",-m的后面的字符串内容很明显,就是注释。对这次代码提交的内容说明。一个项目,每次修改了哪些地方,commit的时候都应该加内容。

下面说说git status

$ git status
# On branch master
nothing to commit, working directory clean
==>> 显示当前没什么更新

$ echo "git status test" > hello2.txt
$ git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	hello2.txt
nothing added to commit but untracked files present (use "git add" to track)
==>> 提示的很明显了Untracked files,这时候hello2.txt还是在working区域,还没到staged呢。必须要到staged才能更新,所以下面是要add文件。

$ git add hello2.txt
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	new file:   hello2.txt
#
==>> 状态变成了Changes to be committed。也可以git reset HEAD hello2.txt把文件退回到working状态。

$ git commit hello2.txt -m "add hello2.txt"
[master c469797] add hello2.txt
 1 file changed, 1 insertion(+)
 create mode 100644 hello2.txt
==>> 终于提交成功了。

git log日志查看

$git log
firefoxbug@localhost ~$ sudo -i
commit c469797a6729e801042fa6f1d85b8d2ae766acf8
Author: firefoxbug 
Date:   Fri Dec 13 14:54:54 2013 +0800

    add hello2.txt

commit 9aab40c436dbac64df51d18ae59dba5d57fda1ca
Author: firefoxbug 
Date:   Fri Dec 13 14:39:42 2013 +0800

    This is first commit 

上面的每次commit都对应的是一个HASH,这个HASH有点指针的味道,其实每次都是一个快照。

标签:none

评论已关闭