常见问题
一、设置BC为Diff工具
设置difftool为beyondCompare
1 | # git配置文件增加如下配置即可 |
二、认证失败
1)描述: 覆盖安装git-2.17.0-64-bit.exe后出现错误“fatal:Authentication failed for …”
2)Git环境
3)错误信息
4)原因:windows自动缓存了密码,在[控制面板] - [凭据管理器] - [Windows凭据]下,删除git凭据即可。
三、删除远程分支失败
1、操作
执行命令git push origin :branchA
,出现异常“unable to delete remote ref does not exist”。
2、原因
本地有远程分支的缓存,虽然远程已经不存在该分支,但本地执行git branch -r
仍能看到。
3、解决方案
执行命令git fetch --prune origin
,更新本地分支缓存。
四、切换分支时对工作去要求
git checkout otherbranch
若要成功切换分支,当前工作区状态需要满足以下要求:
1)clean状态;
2)非clean状态;
a.新增文件;
b.修改已跟踪文件,且该文件在两分支的仓库内容是一致的,即共用一个blob。
c.删除文件;
五、路径通配符
用于”git ls-files”, “git ls-tree”, “git add”, “git grep”, “git diff”, “git checkout”等命令中的路径参数都可以使用通配模式。
NOTE:在shell中执行git命令时,通配符需要被单引号或双引号括住
。否则通配符会由shell解析而无法传递到git程序,导致路径解析错误。
1 | git checkout '*.xml' |
参考
- https://git-scm.com/docs/gitglossary.html#def_pathspec
- https://man7.org/linux/man-pages/man3/fnmatch.3.html
- stackoverflow: Is there a way to use wildcards with git checkout?
六、合并时无法忽略文件
1、问题描述
在使用GitFlow工作流时,不同分支的pom.xml的版本是不同的。这在Git分支间同步代码时,总是把版本也同步过去了。
此场景下需要一个功能,合并时忽略某些特定文件,如pom.xml。
1、分析
1)Git提供了.gitattributes
可以指定符合pattern
的文件使用指定合并策略,例如ours。但这只在冲突时生效,不符合我们的需求。
2)反向思考下,Git之所以不提供此功能可能是因为合并有时候是双向的,如果两个分支都使用自己的文件,那么他们相互合并时(master merge to dev & dev merge to master),就会产生两个不同的提交。
结果就是,双向合并的提交不再是同一个结点,也无法fast-forwad。
参考
七、Mac/Windows不区分大小写带来的困惑
1、问题描述
今日, 使用MacOs的同事在更新项目的Git仓库时, 出现一个令人困惑的情况. 具体执行序列如下:
1 | 执行: |
2、解决路径
- 在我的Ubuntu环境下, 仓库处于clean状态, 且该目录下有两个文件”abc.xml”, “ABC.xml”.
- 发现是由于Windows, Mac操作系统的文件系统不区分大小写导致的.
3、解决方案
1)在Ubuntu下删除其中一个文件, 并提交.
2)Mac, Windows环境下执行命令,
1 | git pull # 更新仓库 |
4、延伸
同理Mac,Windows下的分支也是忽略大小写的。
八、撤销git commit –amend
git使用amend命令的频率很高,常用来修补上次提交的不足。但有时可能需要撤销amend操作,这时可以利用reflog来找到之前的revision。
九、Git merge策略
参考资料