第三课 Git 工做流程
与远程仓库同步,修改,载入(stage)和提交项目
如今你已经有一个git本地仓库,一切都配置完毕。而后该怎么办?
通常来讲,跟其余的源码控制系统的工做流程没什么两样,惟一一个区别就是载入(stage)的过程。整个工做流程大体是这样(流程1):
与远程仓库同步
修改文件
查看变动
载入变动
提交载入的变动
重复
上传
这是最复杂的状况,若是你不与别人合做开发的话,就不须要上传到仓库中去(流程2):
* 修改文件
* 提交变动
* 重复
简单吧。要记得,git是分布式的,因此若是不是合做项目的话,实际上不须要提交到一个公共的共享服务器上--你能够像使用RCS同样,只用来追踪本地文件变动。下面,让咱们先来看个简单的示例,紧接着再来看用git协做开发的实例。
若是你想跟着作这个例子,请克隆这个项目:
$ git clone git://github.com/schacon/simplegit
例子开始,按照流程2,咱们首先要修改README文件,将本身添加到项目做者中去。因此咱们修改这个文件。而后咱们但愿提交这个变动,因此咱们运行'git commit -a' 命令。 -a 的意思是告诉git先将变动了的文件先载入(stage),而后提交-咱们后面会经过'staging area'命令实现,可是如今运行 'git commit -a' 命令,效果跟在SVN中使用'commit'命令同样。
执行完以后,一个提交信息的提示会出如今编辑器中(这里$EDITOR环境变量或'core.editor'这两个git配置变量的默认值都是vim)相似下面这样的内容:
_
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch main
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README
#
~
~
".git/COMMIT_EDITMSG" 9L, 253C
输入一些提交的信息,譬如"added myself to the README as an author"而后退出。
vim操做提示:
按下I,o,a进入编辑模式,编辑完毕按Esc,输入:wq保存退出。
而后会看到这样的提示:
[master]: created 5896d4d: "added myself to the README as an author"
1 files changed, 2 insertions(+), 1 deletions(-)
显示咱们刚刚输入的提交信息,而且有一组关于此次提交项目中文件变动的统计数字。同时还给咱们一个提交的校验和,'5896d4d',这个校验和能够用来往后确切的查看此次提交的细节。
这就是简单用例。修改文件,'git commit -a',重复
如今,咱们来介绍一个复杂点的实例,此次咱们使用远程仓库,将项目上传上去,从而跟其余的开发者一块儿协同工做。同时,咱们会介绍staging area。
若是你会从远程仓库中克隆项目,那么与远程仓库项目同步也是至关简单的--只须要执行'git pull'.若是是远程仓库项目没有变化,也就是说其余的开发者没有对项目进行变动,会显示这样的信息:
Already up-to-date.
相反,执行这条命令以后会将你上次同步以后远程仓库中的变动同步到本地项目中,而且git会合并这些新的变动:
$ git pull
Updating c264051..b04dc3d
Fast forward
lib/simplegit.rb | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
例子开始,从新克隆远程仓库中的项目,修改README文件和lib/simplegit.rb文件(不要执行git commit -a)。如今你可使用'git status'命令来查看工做目录发生了什么变动:
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: README
# modified: lib/simplegit.rb
#
no changes added to commit (use "git add" and/or "git commit -a")
咱们看到,有两个文件是在"changed but not updated"段落中出现 ,这意味着这两个文件尚未载入(unstaged). 若是如今咱们提交,什么也不会发生。也就是说文件必须先载入(stage),而后才能提交。
因此,咱们先来载入(stage) 文件,git中使用'git add'命令不只能够开始追逐文件并且能够对他们载入stage变动。因此让咱们载入(stage) README文件的变动,而后再来查看一下状态。
$ git add README
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
#
modified: lib/simplegit.rb
如今'lib/simplegit.rb'文件仍是未载入(unstaged), 可是README文件如今已经到了'changes to be committed'段落中-它几经载入(stage)了。如今若是咱们运行提交命令(不要-a,这个会自动stage全部的东西),只有这个文件会被提交-而simplegit.rb依然是unstaged。这时,咱们使用-m选项来执行'git commit',这样后面跟上字符串表示此次提交的信息。
$ git commit -m 'updated the README'
[master]: created 14bb3c6: "updated the README"
1 files changed, 1 insertions(+), 2 deletions(-)
若是如今再执行'git status',咱们会看到stage以后的文件如今已经提交了,只剩下了unstaged的'simplegit.rb'文件。
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: lib/simplegit.rb
#
如今咱们能够stage而且提交这个文件:
$ git commit -a -m 'added a staging command to the library'
[master]: created bbaee85: "added a staging command to the library"
1 files changed, 4 insertions(+), 0 deletions(-)
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)
如今咱们已经将两次提交的变动都搞定了,并且加了提交信息,可让咱们的合做伙伴很容易理解咱们作的变动。通过最后一次提交,咱们看到'git status'执行以后显示咱们的工做目录clean了(同时提示咱们如今的分枝上有两个提交尚未上传)
因此,如今咱们将这些变动上传到服务器端与咱们的合做伙伴分享,前提是咱们有上传的权限,(若是没有上传的权限,咱们能够在网络上建立一个本身的git仓库,将其上传),而后让朋友下载。
运行'git push'会将咱们的变动上传到服务器。
$ git push
Counting objects: 11, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 744 bytes, done.
Total 7 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
b04dc3d..bbaee85 master -> master
到目前为止,咱们看到了新数据都已经上传完毕,服务器上的主分支也已经更新了。如今咱们能够复习一下这整个的过程,让咱们能够更加熟练的将git应用到咱们的项目中去。