Git 是开发或学习的工具之一,这记录了我在使用过程中遇到的问题和解决的办法;(最好的办法就是不使用,哈哈)
常用命令
# 查看所有配置
git config --list
# 基本操作
git add xxxx # 添加文件
git reset XXXX # 取消添加文件
git rm xxxx # 删除文件
git commit -m"备注" # 提交版本 -m添加备注
git push origin master # 提交代码到远程分支master
# 仓库管理(xxx为仓库地址)
git clone xxx # 克隆远程仓库
git clone --depth=1 xxx # 克隆最新一次commit仓库
git remote -v # 查看远程仓库
git remote rm origin # 删除现有远程仓库
git remote add origin xxx # 添加新远程仓库
git remote set-url origin xxx # 修改远程仓库
git config --system --unset credential.helper #身份验证失败清除缓存
# 分支管控
git fetch # 拉去所有远程分支
git branch # 查看分支列表
git branch -a # 查看远程分支:需要先fetch
git branch -d dev # 删除分支dev
git branch -m oldName newName # 修改分支名称
git branch --set-upstream-to origin/develop develop # 关联远程分支
git checkout -b dev # 创建分支dev(-b切换)
git checkout -b dev origin/dev # 创建分支并关联远程分支::用这个
git checkout master # 切换分支
git push origin --delete xxx # 删除远程分支
git merge dev # 合并dev到当前分支
git reset --soft HEAD^ # 丢弃上一次未提交的commit
git checkout 07ed0f4a src/ios/ # 回滚部分文件到指定版本
# 文件管理
git clean -x -f # 删除未被当前分支跟踪的文件
git clean -df # 清除未跟踪的文件
# 版本控制
git log # 查看提交历史
git log --oneline # 仅仅查看简略信息
git log --graph # 使用SASCII查看分支合并情况
git reflog # 查看历史版本
git reset --hard xxx # 本地版本回退
git push -f # 远程版本回退(-f 强制推送)
# 模块更新后回退
git clean -df # 清除未跟踪的文件
git checkout # 未提交的返回原状
git checkout HEAD src/views/SecurityTokens/ # 清除提交的部分文件修改
# 中间的commit回退
git rebase -i HEAD~8 # 调整最近的8次commit的顺序或者删除。将需要回退的commit调整到最新。
git reset --hard xxx # 本地版本回退
git push -f # 远程版本回退(-f 强制推送)
# 快照工作区(暂存区)
git stash # 将修改进行快照
git stash list # 查看所有快照
git stash apply stash@{0} # 返回指定快照
git stash drop stash@{0} # 删除指定快照
git stash pop # 解冻并删除快照
# 标签(进行版本管理)
git tag # 查看所有标签
git tag v1.0 # 创建本地标签TAG(-a 标签名,-m说明,-d删除)
git tag v0.9 f5s51f # 创建指定提交TAG
git push origin v1.0 # 推送指定标签
git tag -d v1.0 # 删除本地tag
git push origin :refs/tags/v1.0 # 删除远程tag
# 跟踪文件(忽略文件即取消跟踪)
# 注意 后面一点
git rm -r --cached . # 不删除本地文件,对所有文件都取消跟踪
git rm -r --f . # 删除本地文件,对所有文件都取消跟踪
git rm --cached readme1.txt # 删除readme1.txt的跟踪,并保留在本地
git rm --f readme1.txt # 删除readme1.txt的跟踪,并且删除本地文件。
# 创建空分支
git checkout --orphan xxx
git rm -rf .
# 之后在随便上传一点东西,push到远程分支就好了
忽略文件规则
# 创建文件 .gitignore
# 添加忽略规则
# # 表示此为注释,将被Git忽略
*.a # 表示忽略所有 .a 结尾的文件
!lib.a # 表示但lib.a除外
/TODO # 表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 表示忽略 build/目录下的所有文件,过滤整个build文件夹;
doc/*.txt # 表示会忽略doc/notes.txt但不包括 doc/server/arch.txt
bin/: # 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: # 表示忽略根目录下的bin文件
/*.c: # 表示忽略cat.c,不忽略 build/cat.c
debug/*.obj: # 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo: # 表示忽略/foo,a/foo,a/b/foo等
a/**/b: # 表示忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh # 表示不忽略bin目录下的run.sh文件
*.log: # 表示忽略所有 .log 文件
config.php: # 表示忽略当前路径的 config.php 文件
/mtk/ # 表示过滤整个文件夹
*.zip # 表示过滤所有.zip文件
/mtk/do.c # 表示过滤某个具体文件
生成密钥流程
# 查看密钥目录:默认是C:\Users\用户名\.ssh
$ cd ~/.ssh
# 配置用户名:name改成你要的名字,别傻傻的写个name上去
$ git config --global user.name "name"
# 配置用户邮箱:88888@qq.com改成你的邮箱
$ git config --global user.email "88888@qq.com"
# 生成密钥命令:改成你的邮箱
$ ssh-keygen -t rsa -C "8888@qq.com"
集成Sh脚本示例
#!/usr/bin/env sh
# 确保脚本抛出遇到的错误
set -e
# 生成静态文件
# npm run docs:build 文档静态
# 进入生成的文件夹
# cd docs/.vuepress/dist
npm run build
cd build
# push
git init
git add -A
git commit -m 'deploy'
git push -f git@github.com:lixianbin1/imgZoom.git master:gh-pages
# 删除dist文件夹
# cd ../
# rm -rf build
# 退出
cd -
GitHub集成Action脚本示例
name: Update Database File Name
on:
workflow_dispatch: #可以手动执行
schedule:
- cron: '0 0 * * *' #每天早上8点运行
jobs:
rename:
runs-on: ubuntu-latest
steps:
- name: Set up Node.js #设置运行node版本20
uses: actions/setup-node@v2
with:
node-version: '20'
- name: Checkout repository
uses: actions/checkout@v2
- name: Install dependencies
run: sudo apt-get install -y rename
- name: Rename database file #匹配名称后修改
run: |
DATE_TODAY=$(date +"%m-%d")
FILE_YESTERDAY="数据库${DATE_YESTERDAY}.kdbx"
FILE_TODAY="数据库${DATE_TODAY}.kdbx"
rename "s/数据库*.*\.kdbx/$FILE_TODAY/" *.kdbx
- name: Commit and push if it changed #推送代码
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add -A
if [[ $(git diff --stat --staged) != '' ]]; then
git commit -m "Renamed database file"
git push
fi
问题
Git 撤销单个文件的修改
当不小心修改了某个文件,或者删除了某个文件的时候
// 先取消添加到工作区,之后退回
git reset HEAD XXXXXX
git checkout XXXXXX
Git 控制台中文名称显示乱码
当控制路径中的字符大于 0x80 的时候,转义路径字符,将编码显示设置为 false ,将不转义;
// 运行以下命令
git config --global core.quotepath false
文件名包含空格导致添加失败
当文件夹名称或者文件名称包含空格的时候,git add 会提示文件匹配不上,导致git add 命令失败
// 添加的时候,推荐用 '' 包裹路径
git add 'port/我的文件 名有 空格.avi'
git拉取代码,出现无意义的merge
当先commit的时候,git为了记录你本地的commit操作记录,会创建分叉来记录你的执行树,然后再和远程进行merge
可以每次执行git pull的时候,加入参数。git pull –rebase
// 运行以下命令
git config --global pull.rebase true
commit 备注编辑错误
当 commit 的时候,备注如果出现编辑错误,可以使用 git commit --amend
进入备注页面,在按 i
进入编辑模式,完成后按 Esc
退出编辑模式,最后输入 :wq
保存退出。
忽略文件失效
原因在于追踪文件已经记录了并且正在追踪
解决办法:
// 清楚追踪文件,不删除本地文件(注意:语句后面有一点)
git rm -r --cached .
// 添加所有文件,忽略文件除外
git add .
// commit
git commit -m 'update .gitignore'
进行某种操作后
当用户进行某项操作后,分支名称后出现了(master|REBASE 1/10)等类似的相关问题,这是因为出现了合并冲突
git rebase --abort // 取消合并
git rebase --continue // 继续执行
文件名大小写被忽略
GIt默认忽略文件名大小写,导致修改文件夹之类的大小的名称时候;会和远程不一致
//设置false来关闭大写忽略
git config core.ignorecase false
警告:warning: LF will be replaced by CRLF
Git 可以在你提交时自动地把回车(CR)和换行(LF)转换成换行(LF),而在检出代码时把换行(LF)转换成回车(CR)和换行(LF)
git config –global core.autocrlf true
// 不转换,直接提交
git config –global core.autocrlf false
请求 Github仓库的数据失败
当你 pull 或者 push 链接失败,报错:Connection reset by 192.30.253.112 port 22 fatal: Could not read from remote repository. 哦豁,怎么办?原因有多种;
- 没有权限拉取仓库的数据
没有权限的解决办法很简单,如果你是用 ssh 链接,那么叫仓库管理把你的key加上就好,如果用的是https 链接,在拉取的时候把仓库管理的账号密码填上就好。
- 22 端口被占用或堵塞
如果是设置过端口禁用的不想换端口就去防火墙设置一下入;GitHub 的的建议是 替换端口 443
// 运行以下命令
$ ssh -T -p 443 git@ssh.github.com
// 如果出现以下提示,代表可以用 443 替换默认的 22 端口
> Hi username! You've successfully authenticated, but GitHub does not
> provide shell access.
// 首先在 ~/.ssh/ 目录下找到 config 文件,如果没有可以新建,然后添加以下内容
Host github.com
User xianbin.me@qq.com
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443
参考链接:GitHub Help
请求 Github仓库的速度很慢
当你 pull 或者 push 的时候,你会发现,它的速度只有 100kb/s 甚至更慢,拉取一个稍微大一点的仓库,拉取了一两个小时都未必能拉取成功,造成这样的原因同样也有很多:
自身网络问题:自身网络过差,运营商限速,路由中毒等等
github.global.ssl.fastly.net域名被限制
// 打开 C:\Windows\System32\drivers\etc 里面的hosts 文件;然后添加以下内容
192.30.253.112 github.com
151.101.185.194 github.global-ssl.fastly.net
// 保存后,打开 命令控制台执行 ipconfig/flushdns 清除缓存即可
GitHub提交的commit未被统计
- 检查提交的用户和邮件是否为GitHub上的用户名和邮件
git config user.name
git config user.email
- 提交是否在默认分支 或 gh-page;