热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

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

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

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

一、关于索引的一切:

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

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

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

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

二、Git中的文件分类:

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

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

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

技术分享

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

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

技术分享

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

三、使用git add:

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

[root@flower1 my_stuff]# git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#    .gitignore
#    data
nothing added to commit but untracked files present (use "git add" to track)
[root@flower1 my_stuff]# git add data .gitignore 
[root@flower1 my_stuff]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached ..." to unstage)
#
#    new file:   .gitignore
#    new file:   data
#
技术分享
[root@flower1 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  仅删除索引中的文件

下面验证一下:

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

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

[root@flower1 committest]# git add newfile 
[root@flower1 committest]# git rm -f newfile 
rm newfile
[root@flower1 committest]# ls
notyet.txt  ready.txt

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

六、使用git mv:

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

[root@flower1 committest]# ls
notyet.txt  ready.txt
[root@flower1 committest]# git mv ready.txt ready.txt.bak
[root@flower1 committest]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#    renamed:    ready.txt -> ready.txt.bak
#
[root@flower1 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%)
[root@flower1 committest]# git log ready.txt.bak 
commit 2a9b52785b94c45852276c4febb4e05d9e25de1f
Author: nextflowertest 
Date:   Wed Dec 2 22:16:59 2015 +0800

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

    new data ty

commit 1e5f4c75d4b1c6055fe68392fe0a431d9039870a
Author: nextflowertest 
Date:   Wed Dec 2 22:01:09 2015 +0800

    yes
[root@flower1 committest]# ls
notyet.txt  ready.txt.bak
七、追踪重命名注解:

    略。

八、.gitignore文件:

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

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

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

  • 在命令行上指定的模式
  • 从相同目录的.gitignore文件中读取的模式
  • 上层目录中的模式
  • 来自.git/info/exclude文件的模式
  • 来自配置变量vore.excludedfile指定的文件中的模式
九、Git对象模型和文件的详细视图:

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

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


推荐阅读
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • 自动验证时页面显示问题的解决方法
    在使用自动验证功能时,页面未能正确显示错误信息。通过使用 `dump($info->getError())` 可以帮助诊断和解决问题。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • Spark中使用map或flatMap将DataSet[A]转换为DataSet[B]时Schema变为Binary的问题及解决方案
    本文探讨了在使用Spark的map或flatMap算子将一个数据集转换为另一个数据集时,遇到的Schema变为Binary的问题,并提供了详细的解决方案。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • ZooKeeper 入门指南
    本文将详细介绍ZooKeeper的工作机制、特点、数据结构以及常见的应用场景,包括统一命名服务、统一配置管理、统一集群管理、服务器动态上下线和软负载均衡。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文详细介绍了如何利用Duilib界面库开发窗体动画效果,包括基本思路和技术细节。这些方法不仅适用于Duilib,还可以扩展到其他类似的界面开发工具。 ... [详细]
  • 解决Parallels Desktop错误15265的方法
    本文详细介绍了在使用Parallels Desktop时遇到错误15265的多种解决方案,包括检查网络连接、关闭代理服务器和修改主机文件等步骤。 ... [详细]
  • 解决 Windows Server 2016 网络连接问题
    本文详细介绍了如何解决 Windows Server 2016 在使用无线网络 (WLAN) 和有线网络 (以太网) 时遇到的连接问题。包括添加必要的功能和安装正确的驱动程序。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 在使用Eclipse进行调试时,如果遇到未解析的断点(unresolved breakpoint)并显示“未加载符号表,请使用‘file’命令加载目标文件以进行调试”的错误提示,这通常是因为调试器未能正确加载符号表。解决此问题的方法是通过GDB的`file`命令手动加载目标文件,以便调试器能够识别和解析断点。具体操作为在GDB命令行中输入 `(gdb) file `。这一步骤确保了调试环境能够正确访问和解析程序中的符号信息,从而实现有效的调试。 ... [详细]
  • 系统数据实体验证异常:多个实体验证失败的错误处理与分析
    在使用MVC和EF框架进行数据保存时,遇到了 `System.Data.Entity.Validation.DbEntityValidationException` 错误,表明存在一个或多个实体验证失败的情况。本文详细分析了该错误的成因,并提出了有效的处理方法,包括检查实体属性的约束条件、调试日志的使用以及优化数据验证逻辑,以确保数据的一致性和完整性。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有