Git基础(二)

    本章内容将介绍第二部分:本地仓储操作。为了加深对每个命令操作的理解,我们可以事先获取一个仓储边学边操作。这里首先 你要明白一个概念,所有本地工作目录下的文件状态无不在乎两种,已跟踪和未跟踪。已跟踪文件表明在上一次 它就以及被纳入版本控制了,在暂存区已经留有它的快照,工作一段时间之后,它的状态可能处于已修改,未更新或者已放入暂存区,而其它所有文件都处于未跟踪状态,它们既没上一次更新时的快照也没有存在当前的暂存区。接下来我将依次列举出本地仓储常用的操作命令。

 

1.检查当前文件状态

  每每工作一段时间之后,有时处理的文件过多,为了防止提交时有所遗漏,我们可以使用 git status 命令,用来查看当前工作目录下文件的状态,反馈的信息中会依次罗列出  1>.Untracked files:那些文件还未跟踪  2>.Changes to be committed:那些已经被记录在暂存区需要提交到本地仓储了  3>.Changed but not updated:那些之前已经被纳入版本控制的文件修改后需要从新纳入暂存区留下快照记录,当前的分支等等信息。

 2.跟踪新文件和暂存已修改的文件

  对于后期工作新添加的文件 我们需要对它进行控制,这时候我们就可以用 git add 文件名 或者 git add . 命令,前者表示纳入指定文件到版本控制,后者表示纳入当前目录下所有需要新增的文件。纳入之后,我们再使用 git status 命令,就会发现此时候这些文件的状态都处于 Changes to be committed -已暂存(待提交)。这时候如果我们接着对已暂存的某个文件操作后,再查看文件状态的时候,会发现该文件的状态变成了Changed but not updated-待更新到暂存区。那么这时候,git add 命令 又再派上用场了,需要用它来将该文件添加到暂存区。所以说文件处在不同的状态下使用 git add 命令,效果是不一样的

3.忽略某些文件

  在工作过程中,我们会经常使用各种编辑器操作文件或者引入一些其它的临时资源,使用之后会经常产出一些垃圾文件,我们并不希望它们被纳入版本管理,我们希望告诉git每次我们提交的过程中需要忽略掉这些文件,那么这时我们就可以创建一个 .gitignore 文件,里面列举出我们需要忽略的文件格式。对于这个文件,我们一开始在创建版本库的时候 官方 会提示建议我们 创建该文件,细心的你或许已经发现了。至于该文件中列举的忽略文件的模式,我们可以看一个例子:

1

$ cat .gitignore *.[oa] *~

第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。第二行告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。此外,你可能还需要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。

文件 .gitignore 的格式规范如下:

● 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。

● 可以使用标准的 glob 模式匹配。 * 匹配模式最后跟反斜杠(/)说明要忽略的是目录。 * 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9] 表示匹配所有 0 到 9 的数字)。

我们再看一个 .gitignore 文件的例子:

1

2

3

4

5

6

# 此为注释 – 将被 Git 忽略

*.a       # 忽略所有 .a 结尾的文件

!lib.a    # 但 lib.a 除外

/TODO     # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO

build/    # 忽略 build/ 目录下的所有文件

doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

 

4.查看已暂存和未暂存未更新信息

   在工作一段时间之后,有时你需要回头查看下历史操作记录来进行相关的后续开发操作。这时候你就需要使用到 git diff 或者 git diff --cached 命令了。当我们对一个已暂存的文件修改之后还没提交,这个文件所处的状态我们已经知道了,这时候 我们使用 git diff 命令,我们发现反馈的信息列举出文件所修改的内容,当我们提交了这个文件之后,再使用git diff 会发现没有任何信息 ,而使用 git diff --cached 命令却又有信息反馈了,这是为什么呢。原因就是因为 git diff 这个命令 是将 该文件在未修改之前也就是处在暂存区状态下的内容和现修改之后 变动的内容。而git diff --cached 这个命令 是将 该文件 当前的最新的在暂存区的存储 版本和之前上一次的存储版本 内容进行比较。

 

5.提交更新

   伴随着工作的进展,我们已经确保了所有需要的文件都已经提交了(都处在已暂存状态),那么这时候 就需要使用 git commit 命令 将这些文件全部提交到本地仓储了,近而推送到远程仓储(后续详细)。工作中 有时你会发现提交一个文件的 操作 步骤还是蛮多的,能不能简化些呢,很开心的告诉你 git早已经给你准备好啦,git commit -a 命令就直接跳过的add名,直接将需要添加的内容一次性的全给提交到本地仓储了,是不是感觉很爽,告诉你更嗨皮的 后面还有更爽的呢。

 

6.撤销操作、移除和修改文件

   工作中难免会碰到 提交遗漏或者提交错误 等等不开心的事,很后悔 很希望能重新来过,怎么办呢? 别担心。既然你选择了git ,git就一定不会让你失望滴,无尽的后悔药,让你放心大胆的去操作。当我们需要修改最近的依次提交时,我们可以使用 git commit --amend 命令。此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交。如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交: $ git add forgotten_file    $ git commit --amend。上面的两条命令最终只是产生一个提交,第一个提交命令修正了第一个的提交内容。

   有时候我们希望对某些文件分批次提交,但不小心全给添加到暂存区了,这时候就很需要撤销不该添加的文件,很着急的赶脚。别当心,git同样考虑到了,这是我们就可以使用 git reset HEAD [文件名]的方式取消暂存啦。如果你突然感觉这个文件修改的有问题 不想要了,想撤回到期原本的状态,咱办呢?没关系 git一样可以解决, 使用 git checkout [文件名]就可以还原到文件修改前的状态啦,是不是赶脚很酷。总有那么个时候,我们不想要某个文件了,要将他彻底的删除,那么这种情况下就要注意两点了,如果你使用 rm [文件名] 命令,这只能在本地工作目录下删除该文件,可它依旧留在暂存区哦,这是你查看文件状态,你就会发现给文件状态变成已修改待更新了哦。所以 你要想彻底的删除,那接着使用 git  rm [文件名]命令,这再将文件从暂存区彻底的删除了,接着提交本地仓储,也接着将更新推送到远程仓储,这样一样在本地仓储和远程仓储都将失去了这个文件了。另外的一点就是 当我们需要修改某个文件比如重命名,可以使用 git mv [旧名字][新名字]搞定啦。

 

7.查看提交历史

   一个优秀的项目必然有着详细的版本管理,后期的扩张 这些详细历史记录 可是灰常有用哦。所以这种情况下 我们 经常需要 查询版本的详细的记录,以及在协同开发工作中 组员每次的提交修改更新记录,git 因此提供了一个很有必要的工具gitk。使用命令 git gitk 接着就会弹出一个操作界面-gitk。里面罗列出该项目的所有分支及其发展变化以及对应的操作记录。同时git还提供的 git log 命令一样的用来查看之前的操作记录,罗列顺序由晚及早。若果你觉得反馈的日志太复杂太多了 你也可以定制化 log的输出数量以及格式,这里就不多说了,以后有时间会整理出来。

 

  看到这里呢,那么整片内容也就产不多讲完啦,相信你也能够 开始上手Git了。嘎嘎!另外呢,还是那句话,有看到哪里说的不正确的后遗留还望大家及时提出哈!共同进步!

 

    

posted @ 2015-02-05 15:30  SpencerWang  阅读(173)  评论(0编辑  收藏  举报