一、Git 分支已经删除
问题描述:远程获取分支最新代码,下拉代码的时候,提示远程分支已经不存在:
➜ git pull
Your configuration specifies to merge with the ref 'refs/heads/ipo_user'
from the remote, but no such ref was fetched.
解决方案:该分支已经在远程仓库中被删除,因此需要切换到其它分支:
➜ git checkout dev
二、LFS 提交方式不对
问题描述:LFS 获取文件,查看仓库状态的时候,发现有文件已经被删除,但是 checkout 的时候,提示操作不当:
➜ git status
Changes not staged for commit:
( use "git add/rm <file>..." to update what will be committed)
( use "git checkout -- <file>..." to discard changes in working directory)
deleted: data/ model/ app1. zip
deleted: data/ model/ app2. zip
➜ git checkout - - data/ model/ app1. zip
Encountered 1 file ( s) that should have been pointers, but weren't:
data/ model/ app1. zip
➜ git rm - - cached - r .
➜ git reset - - hard
三、LFS 撤销历史提交
问题描述:在仓库修改 lfs 的 track 文件的时候,本应该会添加 “*.iso” 号结果修改成了错了 “.iso”,导致 push 上去发现参数文件没有使用 lfs 文件,现在需要将这一次关于 lfs 的提交 rewrite 掉:
$ git reset –hard ^ HEAD
$ git push origin master
解决方法:lfs 工具提供了 migrate 命令来处理这个问题:
$ git lfs migrate import - - include= "data/app_mold/*" - - everything
$ git push - - force
Locking support detected on remote "origin" . Consider enabling it with :
. . . . . .
! [ remote rejected] master - > master ( pre- receive hook declined)
error: failed to push some refs to 'git@xxx.xxx.com:xxx/app.git'
四、LFS 需要输入密码
Authentication failed for 'https://______.git'
$ cd ~ / . ssh
$ ssh- keygen - t rsa - C "xxxxxx@yy.com"
$ ssh - T git@github. com
$ git config - - global credential. helper 'cache --timeout=3600'
$ git config - - global credential. helper store
五、LFS 无法获取文件
问题描述:使用新版本的 LFS 工具的时候,某个环境发现如下报错,排除原因发现是对应仓库的 lfs 文件并没有从远程仓库拉下来,服务更新都是使用的 CI/CD 工具,但是其他服务器获取 lfs 文件并没有任何问题,而且登录服务器手动执行 git lfs pull 也是可以正常执行的。排除自动部署工具的默认参数和对应的 git 工具配置并没有发现任何有用的信息:
2020 - xx- xx xx: xx: xx: I tensorflow/ stream_executor/ platform/ default/ dso_loader. cc: 28 ]
Traceback ( most recent call last) :
File "/usr/lib/python3.6/runpy.py" , line 113 , in _run_module_as_main
"__main__" , mod_spec)
. . . . . .
File "/data/app_test/.../hhkc/.../network.py" , line 54 , in < module>
from transformers. modeling_hhkc import (
ImportError: cannot import name 'HhkcLayerNorm'
解决方案:这是因为 git-lfs 工具的版本太低导致其默认参数和新版的不一致,这才导致自动部署工具获取 lfs 文件异常。出问题的服务器,当时安装 lfs 工具都是使用 apt 来安装的,所以默认的仓库对应的软件版本号比较低,所以按照官方网站的更新方式部署更新之后,一切都变得正常:
$ git lfs env | grep "dTransfers"
DownloadTransfers= basic
UploadTransfers= basic
DownloadTransfers= basic, lfs- standalone- file
UploadTransfers= basic, lfs- standalone- file
为文件URL( 本地路径) 提供独立传输适配器
https: // github. com/ git- lfs/ git- lfs/ blob/ master/ docs/ man/ git- lfs- standalone- file .1 . ronn
$ curl - s https: // packagecloud. io/ install/ repositories/ github/ git- lfs/ script. deb. sh | sudo bash
$ sudo apt- get install git- lfs
$ git lfs install
六、Git 切换分支不存在
问题描述:在一个测试仓库上面需要临时切换分支,但是切换分支的时候提示如下错误,提示没有找到匹配的分支,但是登陆远程仓库,发现对应的分支是存在的。可能想到的原因是没有更新代码导致无法获取远程仓库的分支信息,随即执行这个 git fetch 命令,但是报错依旧,且通过 git branch -a 也看不到对应的分支信息:
$ git checkout bugfix_login_error
error: pathspec 'bugfix_login_error' did not match any file ( s) known to git.
解决方案: 后来,排查了一下 .git 目录文件夹里面的信息,随即发现了问题原因,即远程仓库的获取只是对标于 master 分支,所以通过执行 git fetch 命令之后也是无法获取远程仓库的分支信息的,按照如下修改即可解决:
$ cat . git/ config
[ remote "origin" ]
url = git@github. com/ EscapeLife/ app- demo. git
fetch = + refs/ heads/ master: refs/ remotes/ origin/ master
[ branch "master" ]
remote = origin
merge = refs/ heads/ master
[ remote "origin" ]
fetch = + refs/ heads/ * : refs/ remotes/ origin/ *
问题原因: 我们正常克隆仓库的时候,对应的 config 配置就是带 * 的样式,但是为什么这个环境的配置会修改了呢?这是因为环境是通过 CI 进行自动更新的,而 CI 配置只获取指定分支的代码,即拉去代码的时候就指定,这也就导致配置文件也就跟着变更:
$ git fetch origin master: refs/ remotes/ origin/ master
七、Git 显示中文乱码
问题描述:使用 git status 命令查看文档或者目录改动时,显示不出中文文件名和中文文件名称,非常不方便:
➜ git status
Changes not staged for commit:
( use "git add/rm <file>..." to update what will be committed)
( use "git restore <file>..." to discard changes in working directory)
deleted: 234 \123 \234 \654 \234 / 954 \236 \952 / . vscode/ settings. json
解决方案:在默认设置下,中文文件名在工作区状态输出,中文名不能正确显示,而是显示为八进制的字符编码。将 git 配置文件 core.quotepath(引用路径) 项设置为 false,即可显示中文。要注意的是,这样设置后,git bash 终端也要设置成中文和 utf-8 编码,才能正确显示中文。
➜ git config core. quotepath false
➜ git config - - global core. quotepath false
➜ vim / etc/ gitconfig
[ core]
quotepath = false
八、Git 恢复丢失数据
问题描述:使用 Git 工具管理仓库的时候,意外删除文档,重置仓库,如何快速恢复丢失的数据呢?重置数据,一般都是使用了 reset 命令导致的,因为其命令用于改变当前的仓库状态。如下所示,是常见的 Git 重置操作,一旦执行之后,如果那该怎么办呢?
$ git reset HEAD < file >
$ git reset [ commit]
$ git reset [ commit]
$ git reset - - soft [ commit]
$ git reset - - soft [ commit]
$ git reset - - hard [ commit]
$ git reset - - hard [ commit]
$ git reset - - keep [ commit]
$ git reset - - mixed [ commit]
解决方案:当操作进行版本回退,现在又需要回退之前的文件信息,此时分为三种情况:
之前的修改进行 commit 提交,即执行 git commit;
之前的修改未进行 commit 提交,即执行 git add;
之前的修改未进行 commit 提交,即也没有执行 git add;
$ git reflog
$ git reset - - hard [ hash ]
$ git fsck - - lost- found
因为根本就没有被Git接管,所以恢复就无从谈起
但是如果使用的是JB( jetbrains) 家的IDE工具,可以通过自带的文件历史功能成功恢复!= > 右键菜单本地历史功能
九、Git 忽略冗余文件
问题描述:使用过苹果电脑的话,肯定只有默认会给目录生成的 .DS_Store 文件。在 macOS 系统上面,我们会看到每个目录都会存在一个名为 .DS_Store 的隐藏文件,其作用就是以告诉 Finder 应该如何显示它,但是 99% 的时间我们都不关心它,尤其是在代码库中,我们更不愿意或者关注它。虽然,可以在代码库里面使用 .gitignore 文件进行忽略,但是每个项目都要来一遍,也挺麻烦的:
➜ ls - lh
- rw- r- - r- - @ 1 escape staff 22K Jan 16 15 : 39 . DS_Store
drwx- - - - - - 48 escape staff 1. 5K Jan 16 16 : 05 . Trash
解决方案:如果做到一次配置,全局忽略 .DS_Store,就是我们继续要解决的问题。Git 中可以通过设置 core.exclusudesfile 变量来指定全局的 gignore 文件。
* . log
. DS_Store
$ cat . gitignore_global
. DS_Store
. Spotlight- V100
. Trashes
Thumbs. db
$ ln - s / Users/ escape/ fuckcode/ dotfiles/ . gitignore_global / Users/ escape/ . gitignore
$ git config - - global core. excludesfile ~ / . gitignore
$ cat . gitconfig
excludesfile = ~ / . gitignore
十、Git 分支切换异常
问题描述:使用 clean 命令的时候需要谨慎,不然容易丢失数据。在代码仓库中切换分支,提示如下错误,导致无法正常切换:
➜ git checkout stable
error: The following untracked working tree files would be overwritten by checkout:
解决方案:通过错误提示可知,是由于一些 untracked working tree files 引起的问题,只要解决这些 untracked 的文件就能解决:
➜ git clean - n
➜ git clean - df
➜ git clean - d - fx