Git 2 (Basics)

Initialize a repository

Git的操作都需要在一个由Git管理的文件下进行,有两种方式使文件被git管理:

  • 在文件夹下面执行 git init
  • git clone一个现成的git文件夹然后在里面操作

如果要在server上面获取现有的项目,可以执行git clone.和SVN不同的是这里的关键词是clone,而SVN里面是checkout,这是因为git是clone整个项目,相当于把server上所以东西都搬下来,而git只是checkout最新的版本.

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

上面这段指令是从github上clone项目,并且把它放在本地,文件夹的名称叫做grit.

在一个由git管理的文件夹下面通常执行的操作包括:

  • git add
  • git commit

Recording changes

在一个由git管理的文件夹下面的文件有两种状态:tracked和untracked.可以使用git add让文件的状态从untracked变成tracked.git add是一个多用途指令,它既可以用来stage也可以用来track文件.

例如我现在新建一个文件夹,然后在里面执行git init,接着再在里面新建一个文件名为git.rtf,这个时候我执行git status:

然后我执行git add git.rtf再执行git status:

现在的状态是被track同时在stage里面,随时可以提交.在提交之前我再做一些改动,然后再执行git status:

我们发现git.rtf既在stage里面又在modified里面,这是因为在上一次modify之前我们stage了文件,然后再去做修改的时候git也会track,所以这时这个文件一部分在stage一部分在modified.这个时候如果再次执行git add git.rtf会把最新的改动加到stage里面:

git diff:比较在Working Directory和Stage area里面是否有不同.在上一次add之后我们执行这条命令发现什么都不会出现,因为文件没有再次改动,所以不会有什么不同,如果现在来到git.rtf里面做一些修改再来执行git diff:

所以git diff只会显示在modified状态下文件的改变,如果想要查看stage里面文件的状态可移执行git diff --cached或者git diff --staged.

git commit -m "some message":提交在stage里面的文件.

Removing & moving files

git rm file_name:这个命令是用来在被git管理的文件夹下面删除一个文件,使用这个命令删除的文件不仅会被git untrack而且还会被从项目里面彻底删除.在执行完这个指令后还不算完,需要git commit来更新.

git rm --cached file_name:这条指令的效果和上一条一样,只不过这一次这个文件只是不再被git track,而不会被从项目里面删除.

git mv file1 file2:重命名.把名叫file1的文件更名为file2.

View the commit history

之前我们介绍过git diff指令,不过它是用来比较modifiedstage里面的不同.我们知道当git clone一个项目的时候,连同这个项目之前的所有信息都获取下来了,这些信息里面就包含了这个项目的所有提交记录,我们可以使用git log来查看这些记录.

如果想看每一次提交的具体内容,可以使用git log -p:

如果只想看最近的5个提交,可以使用git log -p -2

pretty是一个非常有用的指令,它能让log信息按照一定的格式输出,而且git内置了很多log信息的格式,比如可以使用%a来输出作者名称,下面就是一个例子:

同时如果我想要让log信息在一行显示,可以输入git log pretty=oneline:

下面这张表列举了一些常用的输出格式:

如果想查看log信息中的branch情况,可以使用git log --graph

如果只想看某一特定时间内的log信息,可以使用--since或者--until.比如如果我想查看最近两天的提交可以使用git log --since=2.days,最近一个月的提交git log --since=1.month.如果想看在某个事件区间内的提交,可以使用git log --since='2014-5-5' --before='2014-5-8'.

gitk:它是git查看log的图形化界面,直接在命令行输入gitk就能打开.

Change last commit && Unstage

git commit --amend -m 'revised message here':这条指令用来修改上一次提交的提交信息.

git reset HEAD file_name:如果有2个文件你修改了,只想提交其中的一个,但是一不小心使用了git add .指令把两个一起加到stage里去了,这时可以使用这条指令来unstage其中的一个文件.

git checkout -- file_name:当在stage之前对一些文件做了修改,但是并不想保存它们,可以使用这条指令还原.

Working with remotes

git clone git://github.com/shacon/grit.git:把在server上的项目clone到本地,保存在名叫grit的文件夹下.

git remote:显示server方面相关的信息,一般会输出origin,这个名称是git给server上项目地址的一个别名.可以使用git remote -v来查看别名以及其对应的全地址.

git fetch xxx && git pull xxx:前者是从server上提取但是并不和本地的修改merge,后者会.

git push origin master:把master branch push到origin server上去.

git remote add sc git://github.com/shacon/grit.git:给server段的地址取个别名(sc),这样每次在操作的时候就不必输入全地址而只需输入sc即可.