Git常见问题与总结

在实际开发中遇到的一些 Git 常现的问题与总结。

top

文章中的origingit remote add origin <url>添加远程仓库的别名。

1 操作仓库前的必要检查与配置

文件名大小写

1
2
3
4
5
6
# 查看是否忽略文件名大小写
$ git config --global -l
$ git config <--local> -l
# 配置成不能忽略文件名大小写(windows系统下,安装git时会默认配置core.ignorecase=true,因为windows的文件名本身不区分大小写)
$ git config --global core.ignorecase false
$ git config <--local> core.ignorecase false

文件名过长导致的错误

1
2
3
4
5
# 先查看默认的配置
$ git config --global -l
$ git config <--local> -l
# 如果没查到core.longpaths配置项或core.longpaths=false时,需要如下配置
$ git config --global core.longpaths true

2 怎么比较优雅的获取远程仓库

1
2
3
4
5
6
7
# clone 远程仓库的默认分支到本地
$ git clone <ssh:git url>
$ git checkout -b <branch a>
$ git pull origin <branch a>
# 上2行命令结果与下面一样
$ git fetch origin <branch a>:<branch a>
$ git checkout <branch a>

3 分支重命名

VSCode 中打开控制台,输入 git branch --help,弹出 branch相关网页,根据提示操作。

tops

安装 git 时,本地安装目录中会存在相关 git-doc 资料,路径如E:\Program Files\Git\mingw64\share\doc\git-doc
win 系列的系统,cmd 命令中输入 git branch --help也有效。

具体操作如下

1
2
3
4
5
6
7
8
# 本地分支重命名
$ git branch -m <old branch name> <new branch name>
# 删除远程需要重命名的分支
$ git push -d origin <old branch name>
# 推送新命名分分支
$ git push origin <new branch name>
# 修改本地分支与远程分支关联
$ git branch --set-upstream-to origin/<new branch name>

! 注意
当前本地分支与远程分支对应保持一致

4 分支删除

1
2
3
4
# 删除本地分支
$ git branch -d <branch name>
# 删除远程分支
$ git push -d origin <branch name>

5 打标签

记录项目的发版,常用附注标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 打附注标签
$ git tag -a <tag name> -m <"msg">
# 打附注标签(指定commit id)
$ git tag -a <tag name> -m <"msg"> <commit id>
# 推送本地仓库标签到远程仓库
$ git push origin <tag name>
# 列出所有标签
$ git tag -l
# 或者
$ git tag
# 列出标签(带匹配模式)
$ git tag -l 'v-*'
# 删除本地仓库标签
$ git tag -d <tag name>
# 再删除远程仓库标签
$ git push -d origin <tag name>

tag 与 release

tag 是 git 提供的功能,release 是如 github、gitee、gitlab 等代码托管平台基于 git tag 的锦上添花,对 git 的 tag 功能的增强。

6 git flow

一个成功的 Git 分支模型

GitLab 流程

7 回退代码到指定版本

1
2
3
4
5
6
7
8
9
10
# 确定需要回退的分支,如 master
$ git branch
# 查看所有的历史版本,获取你 git commit 的某个历史版本的 id
$ git log
# 回退本地仓库(恢复上一次提交,保留暂存区的改动)
$ git reset --soft <commit id>
# 如果想丢掉工作区的改动,则用 --hard
$ git reset --hard <commit id>
# 推送到远程仓库某个分支
$ git push -f origin master

8 常用的查看提交历史命令

1
2
3
4
# 显示分支图
$ git log --graph
$ git log --pretty=oneline
$ git log --pretty=format:"%h - %an, %ar : %s"

9 撤销指定的提交内容

1
2
3
4
git show <commit id>
git revert -m <number> <commit id>
# 如果需要回复之前撤销过的指定的提交内容,再次revert
git revert <commit id>

-m 选项接收的参数是一个数字,数字取值为 1 和 2,也就是 Merge 行里面列出来的第一个还是第二个,其含义用来保留某个分支。

git revert是用一次新的commit来回滚之前的commit。

10 代码临时保存

如果你正在写开发新分支的需求,别的分支线上突然有 bug 需要修复,你或许只能被迫先提交写的代码,这种情况可以用以下命令操作:

1
2
3
4
5
# 工作区的代码临时保存
$ git stash
$ git status
# 恢复临时保存的代码到工作区(当你在切回自己的分支时,用指令恢复之前的代码就OK)
$ git stash apply

如果有未跟踪的文件,需要先git add <file>,再git stash。因为git stash只临时保存已跟踪的文件。

记录指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 保存未commit的代码
$ git stash
# 保存未commit的代码并备注
$ git stash save
# 查看stash所有列表
$ git stash list
# 删除所有记录
$ git stash clear
# 查看并应用最后一次的记录
$ git stash apply
# 删除记录并恢复到工作区
$ git stash pop
# 删除最近一次记录
$ git stash drop
# 删除指定记录
$ git stash drop stash@{<number>}

详见git stash更多信息

11 设置默认分支

一般不推荐全局设置默认分支,可根据项目需要设置默认分支。如 hexo + github 搭建的静态博客,静态资源所在的分支名一般命名为gh-pages,设置其为默认分支。

1
git config --local init.defaultBranch gh-pages

12 取消暂存区的更改

更改的文件不会还原到未更改的状态,只是把已更改的文件从暂存区移到了工作区,这个移到,美其名曰撤销。

1
2
3
4
# 撤销暂存区的某个文件到工作区
$ git restore --staged <file>...
# 取消暂存所有更改
$ git restore --staged .

13 恢复误删分支

1
2
3
4
5
# 结合工具GitLens过滤出误删分支的Author,找到最近的一次commit id
# 基于这个commit id,新建分支
$ git checkout -b <new branch> <commit id>
# 推到远程仓库
$ git push origin <new branch>

不用担心是谁创建的恢复分支,因为你并没有 commit,只是依赖指定的 commit id 创建分支,不会有个人信息记录。

相关链接

[1] A successful Git branching model

[2] Introduction to GitLab Flow

[3] git 速查清单

[4] git reset

[5] git 备忘单

[6] git 中 tag 和 release 的区别

[7] Git 之 revert