Git 问题汇总及解决方案

推送和拉取时总需要输入用户名密码的解决方案

$ git config --global credential.helper store

src refspec xxx does not match any.

出现以下报错:

error: src refspec xxx does not match any.

可使用以下命令解决:

$ git branch -mv master test

这句话的意思是将 master 分支移动到 test 分支

参考:

error: cannot lock ref xxx

git pull 的时候提示:

error: cannot lock ref 'refs/remotes/origin/master': is at 81f6687b32e95881592b5f6e9a279681f679a8fe but expected 65182895c90f3613a67e8be1a86f3993cdc82213
From https://gitee.com/quanzaiyu/quanzaiyu
 ! 65182895..81f6687b  master     -> origin/master  (unable to update local ref)

解决方案:

  1. 删除有问题的refs,可以直接在.git/refs下面根据错误提示删除对应的refs文件,比如这个就是需要删除 refs/remotes/origin/master 文件(嫌麻烦直接删除整个refs目录也行)
  2. 使用git命令删除相应refs文件,git update-ref -d refs/remotes/origin/master
  3. 简单粗暴强行 git pull,执行 git pull -p

Git 取消文件跟踪

遇到那么一个问题,在项目还未同步到远程服务器的时候,初次创建 .gitignore 文件,列表中包含的文件都会被忽略。但是,在项目开发中,在 .gitignore 中新增加的文件(夹)却不会生效,文件依然处于跟踪状态,提交到服务器时此文件依然会一起提交。

看了一些文章,几乎都是以下做法:

$ git rm -r --cached .
$ git add .
$ git commit -m ".gitignore is now working"

但是,这样的话,移除的文件仍然是处于被跟踪的状态,同步到服务器,服务器同名文件仍然会被删除。

我希望的是,第一次提交,将一些服务器配置传上去,之后的提交,本地文件改为本地配置,不影响服务器端的同名文件。

最后百度搜索“git取消文件跟踪”,终于找到了解决方案:

$ git update-index --assume-unchanged filePath # git 不再追踪文件改动
$ git update-index --no-assume-unchanged filePath # git 恢复追踪文件改动
$ git rm --cached filePath # git 删除被管理的文件
$ git rm -r -f --cached filePath # git 删除被管理的文件夹

使用 git update-index --assume-unchanged 即可取消对文件的跟踪,再次提交,未跟踪的文件不会被提交,服务器端的文件不受影响。记得在 .gitignore 加入相关忽略配置,以免其他开发者down下来的代码中包含此文件并错误提交。

参考:

Git 默认对文件名大小写不敏感

git 默认不区分文件名大小写。

比如,当你创建一个文件后,叫 readme.md 写入内容后提交到线上代码仓库。

然后你在本地修改文件名为 Readme.md 接着你去提交,发现代码没有变化。

其实 git 默认对于文件名大小写是不敏感的,所以上面你修改了首字母大写,但是 git 并没有发现代码任何改动。

让 git 识别文件名大小写变化有两种方式。

一、配置 git 使其对文件名大小写敏感

$ git config core.ignorecase false

二、从 git 本地仓库删除此文件,然后添加再提交

(1) 删除

$ git rm readme.md

(2) 重新添加

$ git add Readme.md

(3) 提交

$ git commit -m 'Readme.md'

参考:

Git 提交空目录

git 本身是会忽略空目录的,要解决这个问题,需要在空目录下新建 .gitkeep 文件:

$ find $PATH_TO_REPOSITORY -type d ! -path "*.git*" -empty -exec touch '{}'/.gitkeep \;

其中 $PATH_TO_REPOSITORY 是当前创库根目录。

参考:

git pull 时遇到 error: cannot lock ref xxx

原因是你这个git工程的.git/refs目录下跟踪的某些git分支,在git pull的时候,与远端的对应分支的refs对比发现不同,所以导致git pull报错。

通常产生这个问题的原因是(以分支git/yousa/feature_01为例):

  • 有人操作git/yousa/feature_01这个分支,在git push的时候使用了git push –force,(当然这个人的git push是push不上去),导致远端分支被覆盖,你本地的refs与远端无法一致,导致问题
  • git分支是不区分大小写的,如果有人删除掉这个远端分支又重新新建了一个这个分支也会出现同样的问题。

解决方法:

直接执行 git pull -p

git push 首次提交失败问题解决

如果首次提交失败,提示:

By default, updating the current branch in a non-bare repository is denied, because it will make the index and work tree inconsistent with what you pushed, and will require 'git reset --hard' to match the work tree to HEAD.

可以在远程仓库设置 git config receive.denyCurrentBranch ignore 忽略之

$ git push origin master
Counting objects: 8, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (8/8), 737 bytes | 0 bytes/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To /root/git-test/
   f168f34..cd317f4  master -> master

origin 为绑定的远程仓库名称,master 为需要推送到的分支。

参考:

TortoiseGit状态图标不能正常显示的解决办法

打开 regedit, 找到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers, 将带 tortoise 的项重命名, 使其排序靠前, 重启资源管理器即可

参考:

git bash 中文显示乱码问题

解决方案1:

在git bash下,右键 出现下图,选择 options > Text, 将Character set设置为 UTF-8

解决方案2:

  1. 编辑 ~\.gitconfig 文件,在文件末尾增加以下内容:
[gui]
    encoding = utf-8  #代码库统一使用utf-8
[i18n]
    commitencoding = utf-8  #log编码
[svn]
    pathnameencoding = utf-8  #支持中文路径
  1. 编辑 Git安装目录\mingw64\share\git\completion\git-completion.bash 文件, 在文件末尾增加以下内容:
alias ls='ls --show-control-chars --color=auto'  #ls能够正常显示中文
  1. 编辑 Git安装目录\etc\inputrc 文件,修改output-meta和convert-meta属性值:
set output-meta on  #bash可以正常输入中文
set convert-meta off
  1. 编辑 Git安装目录\etc\profile 文件,在文件末尾添加如下内容:
export LESSHARESET=utf-8

参考:

GITHUB PUSH REUSED 0 (DELTA 0)卡住解决办法

$ git config http.postBuffer 123456789

123456789 不是固定的,可以更具需要设置更大

不用命令行,也可以直接打开项目目录的.git目录,找到config文件用记事本打开,加入

[http]
postBuffer = 123456789

重新提交push,还是会卡住,但不用担心,这个时间会很久,请耐心等待!

远程仓库修改密码后重置本地密码

当修改远程仓库密码后,本地保存的密码不能登录到远程仓库,此时需要更新本地密码

提示:

remote: HTTP Basic: Access denied
fatal: Authentication failed for ...

使用以下命令

  1. 如果账号密码有变动 用这个命令 git config --system --unset credential.helper 重新输入账号密码 应该就能解决了
  2. 如果用了第一个命令 还不能解决问题那么 用这个命令: git config --global http.emptyAuth true

修改远程仓库地址

方法有三种:

  1. 修改命令
$ git remote origin set-url [url]
  1. 先删后加
$ git remote rm origin
$ git remote add origin [url]
  1. 直接修改config文件

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress