Git版本控制管理学习笔记4-文件管理和索引

    可以认为使用Git时,我们会遇到3个空间:工作目录、索引、版本库。我们关心的,就是在新建、修改等操作时,这三者之间发生了怎样的变化。

    笼统的讲,就是在工作目录下编辑,在索引中积累修改,然后把索引中累计的修改作为一次性的变更提交给版本库。

    这就意味着,可以在最终提交前添加、删除、移动或者重复编辑文件,只有在提交后才会在版本库里实现累计的变更。

    本章将介绍如何管理索引和文件。

一、关于索引的一切:

Git的索引不包含任何文件内容,它仅仅追踪你想要提交的那些内容。这一点,我们可以在后面的图示中看到。当git commit时,会通过检查索引而不是工作目录来找到提交的内容。

在暂存的过程中,git diff将会是一个非常有用的命令。

git diff 显示仍留在工作目录中且为暂存的变更。

git diff –cached 显示已经暂存并且要在下一次提交的变更。

二、Git中的文件分类:

Git将所有的文件分为3类:已追踪的、被忽略的、未追踪的。

  • 已追踪的:指已经在版本库中的文件,或者是已暂存到索引中的文件。
  • 被忽略的:在版本库中被明确声明为不可见或被忽略的文件。
  • 未追踪的:除去上面两类文件。

这里通过创建一个全新的工作目录并处理一下文件来看一下这些不同类别的文件。

在工作目录中经常会产生一下临时文件,在版本库中这些文件通常是不应该被当做源文件追踪的。

为了让Git忽略这些文件,只需要将该文件名添加到一个特殊的文件.gitignore中就可以了

上图中的步骤中我们看到了这种变化。需要注意的是,虽然.gitignore对于Git是个特殊的文件,但是也需要手动的添加到索引中。

三、使用git add:

git add将暂存一个文件。看看例子就好了。

[[email protected] my_stuff]# git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#    .gitignore
#    data
nothing added to commit but untracked files present (use "git add" to track)
[[email protected] my_stuff]# git add data .gitignore
[[email protected] my_stuff]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#    new file:   .gitignore
#    new file:   data
#

[[email protected] my_stuff]# git ls-files --stage

上面的这个实验蛮有意思。当我们修改了data这个文件后,文件本身的SHA1散列码已经改变,但是git ls-files –stage没有发生变化。只有到使用git add命令后才发生变化。这是因为,索引之后指向已经存在于对象库中的blob对象。

四、使用git commit的一些注意事项:

git commit -a或者-all选项会导致执行提交前自动暂存所有未暂存的和未追踪的文件变化,包括从工作副本中删除已追踪的文件。

做个试验来验证一下。这里就不截图了。

试验的结果是:上面的说法感觉有歧义。所谓的自动暂存,是有前提的,前提是这些文件本身就已经在版本库中或者已经在索引中。(这是我测试的结果,不知是否真的正确)

五、使用git rm:

Git可以在索引中或者同时在索引和工作目录中删除一个文件,但是不能删除该文件在版本库中的历史记录。

git rm -f file1会从索引和工作目录中同时删除

git rm –cached file2  仅删除索引中的文件

下面验证一下:

[[email protected] committest]# ls
newfile  notyet.txt  ready.txt
[[email protected] committest]# rm newfile
rm: remove regular file `newfile‘? y
[[email protected] committest]# ls
notyet.txt  ready.txt
[[email protected] committest]# echo "new file" > newfile
[[email protected] committest]# ls
newfile  notyet.txt  ready.txt
[[email protected] committest]# git add newfile
[[email protected] committest]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    new file:   newfile
#
[[email protected] committest]# git rm --cached newfile
rm ‘newfile‘
[[email protected] committest]# git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#    newfile
nothing added to commit but untracked files present (use "git add" to track)
[[email protected] committest]# ls
newfile  notyet.txt  ready.txt

上面的试验,使用了—cached参数,工作目录中的文件没有删除。

[[email protected] committest]# git add newfile
[[email protected] committest]# git rm -f newfile
rm ‘newfile‘
[[email protected] committest]# ls
notyet.txt  ready.txt

想要移除一个已经提交的文件,通过git rm和git commit的组合命令即可实现。

六、使用git mv:

这里仅用命令行说明一下吧 。

[[email protected] committest]# ls
notyet.txt  ready.txt
[[email protected] committest]# git mv ready.txt ready.txt.bak
[[email protected] committest]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    renamed:    ready.txt -> ready.txt.bak
#
[[email protected] committest]# git commit -m "new data ty"
[master 2a9b527] new data ty
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename ready.txt => ready.txt.bak (100%)
[[email protected] committest]# git log ready.txt.bak
commit 2a9b52785b94c45852276c4febb4e05d9e25de1f
Author: nextflowertest <[email protected]>
Date:   Wed Dec 2 22:16:59 2015 +0800

    new data ty
[[email protected] committest]# get log --follow ready.txt.bak
-bash: get: command not found
[[email protected] committest]# git log --follow ready.txt.bak
commit 2a9b52785b94c45852276c4febb4e05d9e25de1f
Author: nextflowertest <[email protected]>
Date:   Wed Dec 2 22:16:59 2015 +0800

    new data ty

commit 1e5f4c75d4b1c6055fe68392fe0a431d9039870a
Author: nextflowertest <[email protected]>
Date:   Wed Dec 2 22:01:09 2015 +0800

    yes
[[email protected] committest]# ls
notyet.txt  ready.txt.bak

七、追踪重命名注解:

    略。

八、.gitignore文件:

这个文件中的内容可以比较灵活,格式如下:

  • 空行会被忽略。以#开头的可以用于注释。
  • 一个简单的字面值文件名匹配任何目录中的同名文件。
  • 目录名由末尾的反斜杠/标记。
  • 支持shell通配符。
  • 起始的感叹号会对该行其余部分的模式进行取反。

当有多个层次的目录都有.gitignore文件时,优先级从高到低如下:

  • 在命令行上指定的模式
  • 从相同目录的.gitignore文件中读取的模式
  • 上层目录中的模式
  • 来自.git/info/exclude文件的模式
  • 来自配置变量vore.excludedfile指定的文件中的模式

九、Git对象模型和文件的详细视图:

这一节主要通过几张图来说明各种变化。

时间: 2024-10-22 12:28:55

Git版本控制管理学习笔记4-文件管理和索引的相关文章

Git版本控制管理学习笔记1-介绍

    几乎所有的版本控制工具都是出于同样的目的:开发以及维护开发出来的代码,方便读取代码的历史,记录所有的修改.这里,介绍的是当前在开源社区内非常流行的版本控制工具Git.它是由Linus Torvalds发明的,最初是为了方便管理linux内核的开发工作. Git的诞生: 通常来说,当工具跟不上项目需求时,开发人员就会开发一个新的工具来替代它.大部分工具在发明之前,都会已经存在一些类似的工具,新工具则是在原有工具的思想上进行了更加合理的修改.那么在Git之前,有哪些版本控制工具呢?它们都有哪

Git版本控制管理学习笔记5-提交

    这个标题其实有些让人费解,因为会想这个提交是动词还是名称?     提交动作是通过git commit命令来实现的,提交之后会在对象库中新增一个提交对象.提交过程中会发生哪些变化,在上一篇笔记里面已经介绍过,看下那几张过程图就可以了.     需要明确的是,在Git中,版本库的变更和提交是一一对应的关系,也就是说,提交是将变更引入到版本库的唯一方法.     Git在提交时,会记录索引的快照并把快照存放到对象库中.下一次提交前,就会将当前索引中的状态与上一次生成的快照进行对比,派生出一个

Git版本控制管理学习笔记2--起步

首先确保系统中已经安装了git,这里使用的linux系统. 一.命令行初步使用: 1.git命令: 列出它的选项和最常用的子命令.标准命令格式中,COMMAND代表的就是下面列出的子命令. [[email protected] ~]# git 2.显示版本号: [[email protected] ~]# git --version git version 1.7.1 3.裸双破折号--的作用:     它用来分离一系列参数.比如下面这个: [[email protected] ~]# git

Linux学习笔记之文件管理,用户管理

学而不用,总是忘记,今天又整理一下,记在这里,方便以后自己查看 常用操作命令 目录常用操作命令: pwd, cd, ls, mkdir, rmdir, tree. 文件常用操作命令: find,locate, whereis, which, touch, file, cp, rm,mv,ln,cat,tac,head,tail,more,less,grep,wc. 用户及用户组管理 Linux系统中用户分为3类:root用户,普通用户和虚拟用户.其中虚拟用户是不具备登录系统的能力,但却是系统运行

Git版本控制工具学习

Git代码管理工具学习 分布式管理工具:git 相比较svn它更加的方便,基本上我们的操作都是在本地进行的. Git文件的三种状态:已提交,已修改,以暂存. 已提交:表示文件已经被保存到本地数据库. 已修改:修改了某个文件. 以暂存:把修改的文件放到了下次提交保存的清单中. Git只关心文件系统的整体是否发生了变化,其它的版本控制工具更多的关心文件的内容是否发生变化. Git基本的工作流程 1:在工作目录中修改某些文件,2:对修改后的文件进行快照,然后保存到暂存区域.3:提交更新,将保存在暂存区

精通Git(第2版)+Git团队协作+GitHub入门与实践+Git版本控制管理(第2版)

资源链接:https://pan.baidu.com/s/1FElckzWH6sqyugNK5o8b7w搜集并整理了网上有关GitHub学习的9本书籍,如下:<精通Git (第2版)>中英文PDF<Git团队协作>中英文PDF<Git权威指南(第2版)>和第1版PDF<Git版本控制管理 (第2版)>中英文PDF<GitHub入门与实践>PDF,以及Git桌面Win64bit版最新安装包目录及截图如下: 原文地址:http://blog.51ct

Git权威指南学习笔记(一)Git初始化

1.在Git中配置用户名和邮件地址 $ git config --global user.name "Jymn_Chen" $ git config --global user.email "[email protected]" 注意把用户名和邮件地址替换成你自己的资料. 在这里的参数global表示配置的作用范围是当前用户,如果将参数改为system,那么配置的作用范围是系统中的所有用户. 2.创建版本库 新建一个目录并cd到目录中,执行以下命令: $ git i

Git权威指南学习笔记(二)Git暂存区

如下图所示: 左侧为工作区,是我们的工作目录. 右侧为版本库,其中: index标记的是暂存区(stage),所处目录为.git/index,记录了文件的状态和变更信息. master标记的是master分支所代表的目录树.HEAD指向master分支. objects标记的是Git的对象库,所处目录为.git/objects,文件索引建立了文件和对象库中对象实体之间的映射关系. 通过该图我们可以清晰地看出add,commit等命令的转化关系.下面通过git diff和git status两条命

C++内存管理学习笔记(6)

/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:[email protected] /*  转载请注明本文出处: *   http://blog.csdn.net/wdzxl198/article/details/9120635 /************************