git操作集锦

  |  

摘要: 本文整理 git 中常见的操作和小功能,持续更新

【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:潮汐朝夕
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


参考资料:沉浸式学git

git 思维导图


问题解决

命中系统保留文件名

在 windows 下 clone 一个在 Linux/Mac 开发的仓库,可能出现以下报错:

1
2
Resolving deltas: 100% (1166/1166), done.                                                
error: unable to create file oss/blog/backup-20211007/com2.jpg: No such file or directory

因为 com2 是 windows 系统保留文件名,无法创建该文件。解法是在 Linux 中把文件名改一下,再推送拉取。

Clone succeeded,but checkout failed

在 windows 下 clone 一个在 Linux/Mac 开发的仓库,可能出现以下报错:

1
2
3
4
5
Updating files: 100% (6613/6613), done.                                                  
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry with 'git restore --source=HEAD :/'

可能是文件名太长的问题,管理员权限执行以下命令:

1
git config --system core.longpaths true

然后再 checkout。

mode change 100755 => 100644

git显示文件有修改,但是实际上却没有修改(提示File mode changed from 100755 to 100644)。这是因为文件的权限被修改了,可以执行以下命令:

1
git config --global --add core.filemode false

此后就会忽略掉 filemode 的变更。

The following untracked working tree files would be overwritten by checkout

1
git clean -d -fx

其中 git clean 参数如下:

  • -n 显示将要删除的文件和目录;
  • -x 删除忽略文件已经对git来说不识别的文件
  • -d 删除未被添加到git的路径中的文件
  • -f 强制运行

fatal: The remote end hung up unexpectedly

git 推送或拉取时,出现以下报错

1
fatal: The remote end hung up unexpectedly

基本是文件太大的问题,要么是缓存不够,要么是网络不行,或者就是墙。

  • 解法1: 增加缓存
1
2
# 500M
git config --global http.postBuffer 524288000

或者在 .git/config 中增加以下内容

1
2
[http]
postBuffer = 524288000
  • 解法2: 降低最低速度&提高最低速度时间
1
2
3
git config --global http.lowSpeedLimit 0
# 单位是秒
git config --global http.lowSpeedTime 999999
  • 解法3: 改为通过 ssh 拉取或推送

如果走的是 http 且速度特别慢,可以尝试改为 ssh。将连接做如下修改即可。

1
2
3
https://github.com/user_name/project_name
改为
git@github.com:user_name/project_name.git

可能没效果,那就只有换网或者找镜像了。

不同系统间的换行处理问题

不同操作系统下,处理行尾结束符的方法是不同的:

  • Windows下:CRLF(表示句尾使用回车换行两个字符,即windows下的”\r\n”换行)
  • unix下:LF(表示句尾,只使用换行)
  • mac下:CR(表示只使用回车)

core.autocrlf 是 git中负责处理 line ending 的变量,可以设置3个值:true,false,input。

(1)设置为true

1
config --global core.autocrlf true

当设置成true时,这意味着你在任何时候添加(add)文件到git仓库时,git都会视为它是一个文本文件(text file)。将把crlf变成LF。

如果是在Windows系统上,把它设置成true,Git 可以在你提交时自动地把行结束符 CRLF 转换成 LF,而在签出代码时把 LF 转换成 CRLF。

(2)设置为false

1
config --global core.autocrlf false

当设置成 false 时,line endings 将不做转换操作。文本文件保持原来的样子。

如果你是Windows程序员,且正在开发仅运行在Windows上的项目,可以设置false取消此功能,把回车符记录在库中。

(3)设置为 input 时

1
config --global core.autocrlf input

把 core.autocrlf 设置成 input 来告诉 Git 在提交时把 CRLF 转换成 LF,签出时不转换。


查看分支树

1
git log --graph --decorate --oneline --simplify-by-decoration --all

从其它分支 merge 个别文件

git 里面的 merge 是全 merge ,没有单个文件 merge。

下面这个命令效果类似,但是覆盖的意思而不是 merge,是说把另一个分支的文件覆盖到当前的分支上。

1
git checkout branch_name filename

当然,这个功能还有一个作用,就是文件的回退,例如:

1
git checkout HEAD filename

可以建立一个临时的分支,然后,commit。再merge到master分支上,这样就实现了单个文件的merge。

去掉文本末尾的 ^M

1
git config --global core.whitespace cr-at-eol

两个分支有哪些文件不同

1
git diff branch1 branch2 --stat

恢复到某次 commit

加入 git push 之后,某个文件太大,github 不支持,那么可以恢复到无大文件的 commit,再推送即可。

首先 git log 找到目标 commit id。

1
git reset commit-id

解决 git status 中文乱码

1
git config --global core.quotepath false

Share