12 Jun 2013
切换到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了。
$ git clone git://github.com/schacon/grit.git mygrit
mygrit为生成的文件夹名字,可以省略。这种方法也是平时从github上clone时经常能用到的。这里,git是使用clone命令,不用与SVN等的checkout。在git里,checkout用于切换branch。
在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
来查看。
$git add xxx
在git init
后,所有的文件都是untracked的状态,可以使用git add来track它们。
当一个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
。此文件支持通配符。
使用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
$git log
$git log -p -2 //可以查看相临snapshot的diff. -2只显示2项。
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
通过amend操作,不会产生新的commit,只是修改最近一次commit。
$ git reset HEAD benchmarks.rb
benchmarks.rb: locally modified
当git add一个文件后,再运行git status的时候,output已经提示了这个命令。
$ git checkout -- benchmarks.rb
当修改一个文件后,再运行git status的时候,output提示了这个命令。这个命令会把当前的修改丢弃。慎重使用。
我们使用Git来管理代码,肯定是希望也别人协同工作的。这时我们需要把我们的代码share到网上,或者需要从网络上(通常是github)clone代码,更改,再push我们的更新到remote repository。
使用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中获得数据,可以使用如下:
$ 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
$ git remote rename pb paul
$ git remote rm paul