• 【Git】.gitignore文件的理解和使用


    背景

    最近用git遇到了一个问题,从远程往本地pull代码时提示DS_Store文件被修改了,pull失败,
    在这里插入图片描述

    git status查看确实是该文件被修改了,
    在这里插入图片描述

    原因

    首先要知道pull与fetch的区别,pull可以理解为fetch+merge,fetch只会更新远程新的提交记录到本地库,但不会自动与本地记录merge,也就是不会改变本地工作目录中的文件;而pull既会更新远程新的提交记录到本地库,也会与本地记录合并,改变本地工作目录的文件。这一点,可以参考https://www.cnblogs.com/FengZeng666/p/15640934.html

    关于merge,可以参考Git中文文档《分支的新建与合并》部分,git的默认合并策略recursive,递归三路合并,可以参考http://www.javashuo.com/article/p-gisxwblx-ck.html

    当远程和本地对同一个文件进行了修改时,根据上面算法中的描述,两个需要合并的文件相对于共同祖先的文件都发生的修改,git不知道如何舍弃,也就是产生了冲突,上面出现这个问题就是因为这个原因。

    解决

    配置git的忽略文件.gitignore。如何配置可以参考文档中《记录每次更新到仓库》中的忽略文件部分,github上也提供了针对不同语言的模板,模板地址https://github.com/github/gitignore

    针对上面问题,在.gitignore文件里面加了下面两行配置信息,

    # 忽略所有项目文件夹中的.DS_Store文件
    /**/.DS_Store
    
    # 忽略所有目录下名为.idea的文件夹
    .idea/
    
    • 1
    • 2
    • 3
    • 4
    • 5

    设置完发现,还是没效果,百度了一下,说的是.gitignore文件只对未被纳入跟踪的文件生效,也就是没有被git add过的,哪些文件被纳入跟踪,可以通过git ls-files命令查看,因此需要在本地和远程都将需要被忽略的文件移除管理,可以先将远程仓库完整克隆下来一份,然后在本地移除管理之后再推送到远程。

    具体步骤:

    1. clone远端完整仓库
    2. 在clone到本地的仓库中修改.gitignore文件,配置忽略规则
    3. 依次执行下面命令

      git rm -r --cached . # 将所有被管理的文件移出管理
      git add . # 将目录下不符合.gitignore规则的所有文件纳入git管理
      git commit -m ‘update .gitignore’ # 提交到本地仓库

    4. push本地仓库到远程

    上面是对整个项目文件夹进行操作,因为有的项目子文件夹下也存在.DS_Store文件。如果只是忽略某个确定的具体文件的话,还是单文件操作比较好。

    Tips

    1.上面命令中的 . 参数什么意义,. 与 * 区别?

    . 表示所有正在或应该(经过gitignore文件过滤)被纳入管理的文件
    * 表示本地目录中的所有文件

    2.merge在什么情况下会发生冲突?

    只有当对同一个文件进行修改时才会conflict,对不同的文件修改不影响

    3.存在merge冲突时什么情况下会pull命令执行失败,什么情况下会成功执行并将冲突写入到所在文件以待处理?

    在远端和本地同一个文件都发生了修改时,如果本地的修改已经commit,那么pull的时候命令可以执行,并将冲突写入到该文件,手动处理后再次commit该文件即可。如果本地的修改还没有commit,那么pull命令就会直接执行失败。也很好理解,git的合并本质上是commit与commit的合并,如果一个文件发生了修改并未commit,那么意味着拿它修改之前的commit对应的文件内容去合并,这样就会导致现有修改信息的丢失,所以git会阻止这种情况的发生。

    4..gitignore文件在什么起作用?

    只对没有纳入git管理的文件生效,可通过git rm -r --cached xxx将指定文件移除管理

    5..gitignore文件的默认位置和作用范围?

    默认在项目的根目录下,对项目下的所有目录生效。如果子目录中也存在.gitignore文件配置的话,子目录优先使用自己的配置

    6.什么情况下push会删除远端的文件?

    通过git rm -r --cached xxx将指定文件移除管理后,commit到本地,再push到远程,远程就会删除这个文件

    7.通过clone方式下载和页面点击ZIP格式下载有什么不同?

    ZIP格式下载的是项目当前最新的源文件,仅是文件而已。
    clone方式下载是将远端仓库当前最新的源文件,及所有的历史记录全部下载下来了,包含.git文件夹

    8.在本地仓库新建文件和远端仓库新建文件有什么区别?

    本地创建的文件不会被git自动纳入管理,需要手动add才行。远程仓库上创建的文件会自动纳入管理

    emm…想到再说吧,上面是开始时我的一些疑问,前面所说的也都测试过,如果理解有误欢迎指正。

  • 相关阅读:
    使用Perf诊断PostgreSQL性能问题
    概念解析 | 心脏电活动和机械活动之间的关系
    利用pearcmd.php文件包含拿shell(LFI)
    【用户画像】应用场景
    二叉树浅见
    外卖项目01---软件开发整体介绍
    力扣每日一题 矩阵中移动的最大次数 DP
    Xcode编译流程
    “蔚来杯“2022牛客暑期多校训练营(加赛)
    Retrofit中解决网络请求中post请求中只传递一个String字符串而非Map<String,String>形式的办法
  • 原文地址:https://blog.csdn.net/atwdy/article/details/126537529