初探Git2

12 Jun 2013

创建Git repository

从已经存在的project创建repository

切换到project的目录,然后:

	$git init
	$git add *.c
	$git commit -m "initial project version"

git init会在当前目录生成.git文件夹,这里面存了git的骨架。这时当前的Project文件还没有收Git管理。需要运行git add来让文件到staged状态。git add后面可以接通配符,也可以使用--all来指定所有的文件都到staged状态。再使用git commit来提交这次更改。至此,我们已经开始使用Git来管理这个project了。

克隆一个repository

	$ git clone git://github.com/schacon/grit.git mygrit

mygrit为生成的文件夹名字,可以省略。这种方法也是平时从github上clone时经常能用到的。这里,git是使用clone命令,不用与SVN等的checkout。在git里,checkout用于切换branch。

在repository中记录变更

在working directory中的文件可以分为untracked和tracked。没有在上一个snapshot中出现的文件都是untracked状态的。从某个branch中checkout出来的文件是tracked,刚刚checkout出来后,处于unmodified,更改后,变成modified,当运行git add xx后,改文件变成staged状态。

查看文件的状态

	$git status
	# On branch master
	nothing to commit (working directory clean)

git status会显示当前所在的branch,以及文件的状态。当新加一个文件README,README将处于untracked状态。可以用git status来查看。

tracking 新加入的文件

$git add xxx

git init后,所有的文件都是untracked的状态,可以使用git add来track它们。

staging 更改的文件

当一个tracked的文件被更改后,会处于modified的状态。这时可以使用git add xx来staging它们。如果在git add后,再次更改此文件,查看状态,将会得到如下状态:

	$ vim benchmarks.rb
	$ git status
	# On branch master
	# Changes to be committed:
	#   (use "git reset HEAD <file>..." to unstage)
	#
	#   new file:   README
	#   modified:   benchmarks.rb
	#
	# Changes not staged for commit:
	#   (use "git add <file>..." to update what will be committed)
	#
	#   modified:   benchmarks.rb
	#

有两个benchmarks.rb的状态,一个是staged、一个是modified。这说明下一次commit的时候,Git只会snapshot运行git add 那一刻的benchmarks.rb而忽略最后一次修改。如果想提交最后一次修改,需要在修改后再次运行git add。

忽略文件

有些文件我们并不像让Git来管理,比如logs,可以把它们加入到.gitignore。此文件支持通配符。

查看unstaged和staged文件

使用git diff可以查看一个文件staged和unstaged的区别。如果要查看staged和last snapshot的区别,需要使用git diff --staged

提交更改

git commit提交更改到Git。运行commit之后,在弹出的编辑文档中写上comment,即可。也可以直接git commit -m "initial"来提交带comment的更改。

使用git commit -a省略stage阶段。这时git会自动把所有tracked文件提交。当然如果新加了文件,就还是需要git add了。

删除文件和更改文件的名字

	$ git rm grit.gemspec
	git mv file_from file_to

查看commit log

	$git log
	$git log -p -2 //可以查看相临snapshot的diff. -2只显示2项。

Undo things

更改最近的commit

	$ git commit -m 'initial commit'
	$ git add forgotten_file
	$ git commit --amend

通过amend操作,不会产生新的commit,只是修改最近一次commit。

Unstaging a Staged File

	$ git reset HEAD benchmarks.rb
	benchmarks.rb: locally modified

当git add一个文件后,再运行git status的时候,output已经提示了这个命令。

Unmodifying a Modified File

	$ git checkout -- benchmarks.rb

当修改一个文件后,再运行git status的时候,output提示了这个命令。这个命令会把当前的修改丢弃。慎重使用。

Working with Remotes

我们使用Git来管理代码,肯定是希望也别人协同工作的。这时我们需要把我们的代码share到网上,或者需要从网络上(通常是github)clone代码,更改,再push我们的更新到remote repository。

Showing Your Remotes

使用git remote显示remote的信息。

	$ git remote -v
	origin  git://github.com/schacon/ticgit.git (fetch)
	origin  git://github.com/schacon/ticgit.git (push)

origin是我们clone一个项目时,自动生成的别名,指向原来的remote repository。也可以使用如下命令增加remote(可能很多人fork过这个project,如果想查看或更改他们,就可以加入其它的remote):

	$ git remote add pb git://github.com/paulboone/ticgit.git
	$ git remote -v
	origin  git://github.com/schacon/ticgit.git
	pb  git://github.com/paulboone/ticgit.git

从remote中获取数据

我们已经配置好了remote,如果希望从remote中获得数据,可以使用如下:

	$ git fetch [remote-name]

git fetch仅仅从网络上down下数据,不会自动merge到自己本地的branch中。如果使用git pull则自动merge数据。

###Pushing to Your Remotes

	$ git push origin master

把本地repo的数据推送到remote的branch中。如果有其他人已经更改了remote,则需要先pull down这个remote,合并到自己的代码里,然后再push。

###查看remote的具体信息

	$ git remote show origin
	* remote origin
	  URL: git@github.com:defunkt/github.git
	  Remote branch merged with 'git pull' while on branch issues
	    issues
	  Remote branch merged with 'git pull' while on branch master
	    master
	  New remote branches (next fetch will store in remotes/origin)
	    caching
	  Stale tracking branches (use 'git remote prune')
	    libwalker
	    walker2
	  Tracked remote branches
	    acl
	    apiv2
	    dashboard2
	    issues
	    master
	    postgres
	  Local branch pushed with 'git push'
	    master:master

Removing and Renaming Remotes

	$ git remote rename pb paul
	$ git remote rm paul

Skip tag first……看不进去了。。。


comments powered by Disqus