在这一节,接着使用上一节的代码例子往下讲,http://blog.csdn.net/troy__/article/details/39806245。
添加文件到暂存区
添加新文件和修改版本库中的已有文件的内容是常用的操作,命令git add可以完成这两种操作,帮助暂存须要提交的变更。暂存的变更(stage change)就是工作目录树中那些你打算提交到版本库的变更。暂存操作将会更新Git的内部索引(index),大家常把该索引称为暂存区(staging
area)。
在很多情况下,使用暂存区确实很麻烦,我们后面会讲如何简化提交操作。但在这里,暂存区为我们提供了精心选择提交内容的机会,让我们看看如何使用暂存区精选选择提交内容。
给命令git add添加-i选项会启动交互命令提示符,在这种方式下可以交互暂存新文件,暂存对已有文件的修改,甚至只暂存部分修改。接下里修改index.html文件以便演示,如下把Biography链接改为About:
<li><a href="about.html">About</a></li>
现在运行git add -i,启动交互方式,Git给出如下提示:
现在有几个选项可以选择,输入1显示暂存区的状态,目前尚未变动,所以输出与上面相同。如果想要添加文件到暂存区,可以输入2:
这会显示一个可暂存文件列表。在本例中,只有一个文件须要添加,所以输入1。然后在该文件的名称前面出现了一个星号(*)标识,表示该文件将暂存。
如果想退出该模式,回车键即可。这时再次察看工作目录树的情况,可以看到一个已缓存的修改,而没有未暂存的修改了:
如果想要取消已暂存的修改,可以使用revert模式。revert模式的用法跟前面介绍的"update"模式用法相似。如果想要暂存还没有被Git跟踪的文件,可以使用第4个模式。它的用法跟其他的模式类似,在此就不再演示了。
"patch"模式是交互方式中最有用的模式,进入该模式的方法跟其他模式类似。进入到"patch"模式后,可以选择单个或者多个文件。选择后,Git会显示这些文件的当前内容与版本库中的差异,然后你可以据此决定是否添加这些修改到暂存区。运行情况如下:
可以根据需要决定是否添加该文本块(hunk)。文本块由文件中连续的修改结构构成,文件中不同的区域作为不同的文本块。
根据提示,输入y表示接受修改,输入n表示忽略修改,输入"a"或"d"分别表示添加或放弃剩余的修改。不用担心该如何记住所有这些选项,输入"?"将会显示所有选项的帮助信息。
现在输入n以放弃暂存该缓存块,然后输入选项7退出交互方式。
补丁模式是常用的,git add提供了一个参数-p直接进入补丁模式。例如,可以运行下面的命令直接启动补丁模式:
这次输入y选择文件块,然后该文件就处于暂存状态并准备提交了。
提交修改
提交是一个相对简单的过程,它将变更添加到版本库的历史记录中,并为它们分配一个提交名称。
注意,这里所说的提交并不是把修改发送到某个中央版本库中,而是提交到本地版本库。但其他人可以从你的本地版本库中拖入修改,或者你从本地版本库推入某个其他的版本库。
有多种使用命令git commit的方式,这些方式都须要输入一段提交留言。对于简短的留言,可以使用参数-m,在参数之后输入。留言内容可以是任意有效字符串。如果留言包含多段内容,可以给命令git commit传递多个-m。
对于比较复杂的提交留言,须要用编辑器来输入。如果输入不带-m参数的git commit命令,Git将启动编辑器来编辑提交留言。使用编辑器创建提交留言这种方式时,可以添加选项-v把要提交的内容与版本库中版本的比较结果添加到编辑器中。编辑器中显示的信息有很多以符号"#"开始的行,Git提取提交留言时会忽略这些行。
有三种提交方法:
1. 先对要提交的文件或修改调用命令git add来添加到暂存区,然后再调用git commit命令完成提交。该过程如下所示:
$ git add some-file
$ git commit -m "changes to some-file"
2. 另一种提交的方法是给命令git commit传递-a参数,Git会把工作目录树中当前所有的修改提交到版本库中。注意在这种情况下,命令git commit只会把已纳入Git版本控制的文件添加到版本库中,而不会添加尚未被跟踪的文件。该过程如下所示:
$ git commit -m "changes to some-file" -a
3. 最后一种提交的方法是指定要提交的文件或文件列表。具体做法是,把要提交的文件列在其他参数的后面。
$ git commit -m "changes to some-file" some-file
查看修改内容
使用Git的命令git status和git diff,可以找出工作目录树中做了哪些修改,以及是如何修改的。
查看当前状态
可以使用git status来查看工作目录树中所有的变动。该命令的输出结果是暂存区内要提交的内容,工作目录树中未纳入暂存区的改动,以及尚未纳入Git版本控制的新文件。
现在来看看前面已经暂存过的修改:
接下来,我们修改文件中的一处,在"About"链接后添加一条"Contact"链接:
<li><a href="contact.html">Contact</a></li>
完成后请保存修改,然后再执行git status:
输出结果把index.html文件显示了两遍。Changes to be commited(待提交变更)部分中的那个对应之前已经暂存过的修改:Changed but not updated(未更新到索引的变更)部分中的那个对应还未暂存的修改。
查看文件变动
使用命令git diff,Git可以显示出工作目录树、暂存区及版本库之间的差异。
直接调用不带参数的git diff,比较的是工作目录树与暂存区之间的区别。
如果想比较暂存区和版本库中的区别,可在git diff后添加参数--cached;
在命令git diff后面添加参数HEAD,可以比较工作目录树(包括暂存和未暂存的修改)与版本库中的差别:
接下来执行提交操作,以便Git记录和跟踪变更:
$ git commit -a -m "Change biography link and add contact link"
管理文件
文件重命名与移动
在Git中,可以通过命令git mv <原文件名称> <新文件名称>来移动文件。该命令告诉Git使用原文件的内容来创建新文件,新文件保留原文件的历史修改记录,并删除原文件。
假定我们要移动之前的index.html:
然后我们再利用commit命令提交这次修改即可。
忽略文件
忽略文件有两种形式:如果只是想在本地的版本库中忽略该文件,那么可以将该文件的名称添加到.git/info/exclude文件中。否则,如果想把这种忽略传播出去,那么可以在.git所在的同级目录下添加**.gitignore文件,将忽略的内容添加在这个文件之中,然后再在git中跟踪该gitignore文件即可。
在添加文件名称时,可以使用统配符的形式,例如:"*.swp"。