【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/

设置完发现,还是没效果,百度了一下,说的是.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…想到再说吧,上面是开始时我的一些疑问,前面所说的也都测试过,如果理解有误欢迎指正。

猜你喜欢

转载自blog.csdn.net/atwdy/article/details/126537529