最近用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
命令查看,因此需要在本地和远程都将需要被忽略的文件移除管理,可以先将远程仓库完整克隆下来一份,然后在本地移除管理之后再推送到远程。
具体步骤:
git rm -r --cached . # 将所有被管理的文件移出管理
git add . # 将目录下不符合.gitignore规则的所有文件纳入git管理
git commit -m ‘update .gitignore’ # 提交到本地仓库
上面是对整个项目文件夹进行操作,因为有的项目子文件夹下也存在.DS_Store文件。如果只是忽略某个确定的具体文件的话,还是单文件操作比较好。
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…想到再说吧,上面是开始时我的一些疑问,前面所说的也都测试过,如果理解有误欢迎指正。