2020-12-11 | 使用指南 | UNLOCK | 更新时间:2023-11-2 13:39

Git的命令集合及相关的问题

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脚本示例

deploy.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脚本示例

.github/workflows/update_file_name.yml
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;

GitHub的Action操作中push无权限

Git