Git
基本使用
代理
1 | # 配置代理 |
介绍
Git 是一个很强大的分布式版本管理工具,最初由 Linus Torvalds 编写,主要用于 Linux 内核开发的版本控制工具。
学习 Git 首先要明白 Git 的分层结构,下面一张图基本就说明各层之间的关系。
Git 的工作总共分四层,其中三层是在自己本地也就是前面说的 git 仓库,包括了工作目录,暂存区和本地仓库。
工作区 (Workspace) 就是我们执行命令 git init 时所在的地方,也就是我们执行一切文件操作的地方。随着修改,工作区文件在没有 add 到暂存区时候,工作区将和暂存区是不一致的。当执行 add 操作后,工作区和暂存区就是一致的了
暂存区 (Index) 就是文件暂时存放的地方,所有暂时存放在暂存区中的文件将随着一个 commit 一起提交到 Local Repository 此时 Local Repository 里面文件将完全被暂存区所取代。暂存区是 git 架构设计中非常重要和难理解的一部分。
本地仓库 (LocalRepository) 就是当前用户的更新代码后所存的地方,这点和其他版本控制系统不同,git 是分布式版本控制系统,是完全去中心化工作,你可以不用和中央服务器 (Remote Server) 进行通信,在本地即可进行全部离线操作,包括 log,history,commit,diff 等等。完成离线操作最核心是因为 git 有一个几乎和远程一样的本地仓库,所有本地离线操作都可以在本地完成,等需要的时候再和远程服务进行交互
远程仓库 (RemoteRepository) 也就是中心服务器,也就是我们做好工作之后推送到远程仓库,或者从远程仓库更新下来最新代码到我们的 git 仓库。
Git 所存储的都是一系列的文件快照,然后 git 来跟踪这些文件快照,发现哪个文件快照有变化它就会提示你需要添加到暂存区或是提交到本地仓库来保证你的工作目录是干净的。因此只要明白他们之间逻辑关系,然后学习基本命令,我相信你很快就会上手 Git。
基础设置
1 | # 配置显示中文 |
文件示例
1 | 修改这个文件("C:\Users\username\.gitconfig")中内容 |
Git 常用操作
- 修改远程仓库地址:
git remote set-url origin "https://github.com/ohmyzsh/ohmyzsh.git"
origin: 指向您自己的 Gitee 仓库。这是您的“家”,您拥有完全的读写权限,所有您自己的修改都推送到这里。upstream: 指向官方的 FreeRTOS 仓库。这是“官方图书馆”,您只有只读权限,专门用来拉取官方的最新更新。
add
- 添加单个文件:
git add <file> - 添加多个文件:
git add <file1> <file2> <file3> - 添加所有更改:
git add -A - 跟踪新文件:
git add ./ - 添加特定模式的文件:
git add *.txt - 从暂存区移除文件:
git add -u <file>; 如果你之前已经将文件添加到了暂存区,但现在又不想包括这个更改,可以使用-u选项将文件从暂存区移除 - 修复合并冲突:
git add <resolved-file>在解决合并冲突后,你需要使用git add将解决冲突的文件标记为已解决 - 添加修改并保留注释:
git add -f <file>; 如果你对文件进行了修改,并且这些修改包含了 Git 无法自动合并的更改(例如,文件模式的更改),你可以使用-f选项强制添加这些更改 - 交互式添加:
git add -i; 如果你想要交互式地选择哪些更改要添加到暂存区,可以使用-i或--interactive选项:
commit
- 全部提交:
git commit - 特定提交:
git commit <file1> <file2> - 添加提交信息:
git commit -m "Your commit message" - 重新提交:如果你想要撤销最近的一次提交(假设它还没有被推送到远程仓库),并且想要重新提交,可以使用
git reset命令与git commit命令结合使用
1 | git reset --soft HEAD^ |
- 签署提交:
git commit --signoff将会在提交信息之后添加你的姓名和电子邮件地址 - 追加提交:
git commit --amend如果你想要将新更改添加到最近的提交上,而不是创建一个新的提交,可以使用--amend选项,这通常用于快速修复上一次提交中的错误或者更新提交信息
push
- 推送并设置上游分支:
git push -u <remote-name> <branch-name>;可以使用 -u 或 --set-upstream,这将会创建一个新的上游分支跟踪关系,并推送本地分支的更改,下次推送时就可以直接使用git commit直接推送到上方设置的分支上了 - 指定远程的仓库和分支:
git push <remote-name> <branch-name><remote-name>是远程仓库的名称,例如origin。<branch-name>是你想要推送的本地分支的名称。
- 强制推送:
git push -f <remote-name> <branch-name>在某些情况下,你可能需要覆盖远程仓库中的分支历史。这可以通过-f或--force选项来实现,但需要谨慎使用,因为这会丢失远程分支上的更改 - 推送所有分支:
git push -a <remote-name>如果你想要推送所有本地分支的更新到远程仓库,可以使用-a或--all选项: - 推送标签: 当你在本地创建了一个标签,并且想要将其推送到远程仓库时,可以使用
git push命令加上标签名:git push <remote-name> <tag-name>,也可以使用git push <remote-name> --tags推送所有的标签 - 推送特定的提交:如果你想要推送从某个特定的提交开始的所有更改,可以使用
--follow-tags选项;git push <remote-name> <commit-hash>:<branch-name><commit-hash>是你想要推送的起始提交的哈希值<branch-name>是远程分支的名称。
pull
- 拉取并合并默认上游分支的更改:
git pull - 指定远程仓库和分支:
git pull <remote-name> <branch-name> - 拉取并自动解决冲突:
git pull --rebase <remote-name> <branch-name>这个命令会先拉取更改,然后尝试将本地更改重新应用在远程更改之上,从而创建一个干净的提交历史。 - 拉取特定标签:
git pull <remote-name> <tag-name>:<tag-name> - 拉取所有分支信息
git pull --all <remote-name>
status
- 查看当前状态:
git status它会显示以下信息:- 当前分支的名称
- 哪些文件被修改了但还没有暂存
- 哪些文件被暂存了但还没有提交
- 是否有未追踪的文件(即未添加到 Git 仓库中的新文件)
- 查看简短状态:
git status --short; 这将只显示哪些文件被修改了,而不会显示当前分支的信息或文件的具体更改内容 - 查看分支状态:
git status --branch; 使用--branch选项可以显示当前分支的信息,包括分支是否落后于远程分支 - 显示未追踪文件:
git status -uno; 使用-uno选项可以显示未追踪的文件,这些文件在工作目录中但不在 Git 仓库中。 - 显示忽略的文件:
git status -v; 默认情况下,git status不会显示那些在.gitignore文件中被忽略的文件。使用-v或--verbose选项可以显示这些文件。
clone
- 克隆完整的远程仓库: 这是最基本的用法,它会克隆完整的远程仓库到本地,包括所有的分支和标签
git clone <repository-url>
- 克隆指定分支: 如果你只对远程仓库的某个特定分支感兴趣,可以使用
-b选项来指定分支git clone -b <branch-name> <repository-url>
- 克隆并创建新分支: 如果你想要基于远程仓库的某个分支创建一个新的本地分支,可以在克隆后立即切换到该分支。
git clone <repository-url> -b <new-branch-name> origin/<existing-branch-name>
- 深度克隆(浅克隆): 如果你只对最近的提交感兴趣,并不需要完整的历史记录,可以使用
--depth选项进行浅克隆。git clone --depth=<depth> <repository-url>;<depth>是一个数字,表示你想要克隆的历史深度。例如,1表示只克隆最近的一次提交,50表示克隆最近的 50 次提交。
- 递归克隆: 如果你需要克隆一个仓库以及它的所有子模块(submodules),可以使用
--recurse-submodules选项。git clone --recurse-submodules <repository-url>这个命令会递归地克隆仓库和它的所有子模块。
- 克隆到特定目录: 如果你想要将仓库克隆到一个特定的目录,可以使用
--directory选项。git clone <repository-url> --directory=<directory-path>
- 禁用 SSL 验证: 在某些情况下,你可能需要克隆到一个自签名的 HTTPS 服务器,这时可以使用
-c选项来禁用 SSL 验证(不推荐,因为这会降低安全性)git clone -c http.sslVerify=false <repository-url>
merge
版本控制系统中用于合并两个分支的命令。它将一个分支的更改合并到另一个分支上。以下是 git merge 的一些基本用法和示例:
- 合并分支:假设你有两个分支:
main和feature-branch。你想要将feature-branch上的更改合并到main分支上,你可以切换到main分支并执行
1 | git checkout main |
- 合并远程分支: 如果你想要合并远程仓库中的一个分支到本地分支,你可以使用
1 | git checkout <local-branch> |
- 处理合并冲突:如果在合并过程中出现冲突,Git 会提示你解决这些冲突。你需要手动编辑冲突文件以解决冲突,然后使用以下命令将更改添加到暂存区:
1 | git add <file-with-conflict> # 添加到暂存区 |
- 重复合并:如果你想要重复之前已经合并过的更改,可以使用
--squash选项。这会将合并的提交压缩成一个单一的提交:
1 | git merge --squash <branch> # 将合并提交压缩 |
- 无冲突合并:如果你想要确保合并时不会出现冲突,可以使用
--no-ff选项。这会创建一个新的提交,即使快进合并(fast-forward merge)是可能的:git merge --no-ff <branch> - 撤销合并:如果你决定不合并某些更改,可以使用
--abort选项来撤销合并操作:git merge --abort将会把分支恢复到合并操作之前的状态 - 查看合并历史:如果你想要查看分支的合并历史,可以使用
git log命令:git log --graph --oneline --all这将会显示一个可视化的提交历史,包括合并提交。
log
- 查看所有提交:
git log默认情况下,git log会显示当前分支的所有提交历史,按时间顺序排列,最新的提交在最上面 - 设置显示提交的数量:
git log -n <number> - 查看特定分支的提交:
git log --branch <branch-name> - 查看特定文件的提交:
git log --follow <file-path> - 显示简洁的提交信息:
git log --oneline使用--oneline选项可以显示每个提交的简短信息,包括提交哈希和提交信息的首字母缩写 - 显示图形化的提交历史:
git log --graph - 搜索提交信息:
git log --grep <search-text>如果你想要搜索包含特定文本的提交,可以使用--grep选项: - 查看每次提交的详细信息:
git log --details使用--details选项可以显示每次提交的详细信息,包括文件更改、作者信息等 - 显示每次提交的差异:
git log -p使用-p选项可以显示每次提交的差异(即补丁),这对于查看具体更改非常有用 - 显示提交的统计信息:
git log --pretty=format:"%h - %an, %ar : %s"使用--pretty选项可以以不同的格式显示提交信息。例如,oneline格式可以显示简洁的提交信息,而format选项可以自定义输出格式:%h是缩短的提交哈希%an是作者的名字。%ar是作者的日期,相对格式。%s是提交信息。
- 查看所有分支的提交:
git log --all - 显示提交的祖先和后代关系:
git log --all --topo-order使用--topo-order选项可以按照拓扑排序显示提交,这有助于理解分支的顺序
reset
- 软回退:
git reset --soft <commit-hash>软回退(Soft Reset)会将当前分支的 HEAD 指针移动到指定的提交,但不会更改工作目录或暂存区,这个操作不会丢失任何更改,所有更改都会保留在暂存区中。 - 混合回退:
git reset <commit-hash>混合回退(Mixed Reset)是git reset的默认模式。它会将 HEAD 指针移动到指定的提交,并且会更新暂存区以匹配指定的提交,但不会更改工作目录: - 硬回退:
git reset --hard <commit-hash>硬回退(Hard Reset)会将 HEAD 指针移动到指定的提交,并且会更新暂存区和工作目录以匹配指定的提交。这意味着所有自指定提交以来的更改都会被丢弃,这个操作是不可逆的,它会永久删除所有未提交的更改。请谨慎使用 - 回退到上一次提交:如果你想要回退到上一次提交,可以省略
<commit-hash>:- 软回退
git reset --soft HEAD^ - 混合回退
git reset HEAD^ - 硬回退
git reset --hard HEAD^
- 软回退
- 撤销部分更改:
git reset <file>如果你已经暂存了一些更改,但想要撤销其中的某些更改,可以使用git reset命令将这些更改从暂存区中移除,但不会影响工作目录 - 使用主干策略:
git reset --main <commit-hash>如果你想要保持当前分支的提交历史,同时将更改移动到一个新的提交中,可以使用主干策略(Mainline),这个操作会将指定的提交作为新的主线起点。 - 交互式暂存: 如果你想要交互式地选择哪些更改要暂存或取消暂存,可以使用
git add -i命令,然后使用git reset来取消暂存:
1 | git add -i # 进入交互式添加模式 |
revert
summary: >
git revert命令在 Git 中用于创建一个新的提交**,这个提交会撤销指定提交所做的任何更改,这个命令在你想要撤回之前某个提交的更改,但又不想改变项目的提交历史时非常有用;**
- 撤销特定提交:
git revert <commit-hash>这个操作会创建一个新的提交,它包含了撤销之前提交更改所需的所有修改 - 撤销一系列提交:
git revert <start-commit-hash>..<end-commit-hash>,这个操作会逐个撤销在这个范围内的每个提交,并为每个撤销创建一个新的提交<start-commit-hash>是系列提交的起始哈希值。<end-commit-hash>是系列提交的结束哈希值。
- 撤销最新的提交:
git revert HEAD如果你想要撤销最新的提交(即 HEAD 指向的提交),可以省略提交哈希值,这个操作会撤销最近的更改,并创建一个新的提交来记录这个撤销。 - 撤销到某个特定状态:
git revert --no-commit <commit-hash>如果你想要将分支回退到某个特定的提交,可以使用--no-commit选项来预览将要进行的更改,然后手动提交这些更改,这个操作会展示从指定提交开始的所有更改,但不会自动创建一个新的提交。你可以在这个阶段进行审查和修改,然后使用git commit来完成撤销操作。 - 撤销提交并编辑信息:
git revert --edit <commit-hash>如果你想要撤销一个提交,并且想要在撤销时编辑提交信息,可以使用--edit选项,这个操作会创建一个新的提交来撤销指定的提交,并打开编辑器让你修改提交信息。 - 使用主干策略:
git revert --mainline <number-of-commits> <commit-hash>如果你想要撤销一个提交,并且希望这个撤销操作成为新的主线,可以使用--mainline选项,这个操作会将指定的提交作为新的主线起点,并撤销之前的提交<number-of-commits>是从系列提交的顶部开始计算的提交数量。<commit-hash>是你想要撤销的提交的哈希值。
tag
summary:
git tag命令在 Git 中用于创建、列出、删除和验证标签,这些标签用于标记特定的提交,通常用于版本发布或者重要的项目里程碑
- 创建标签:
git tag <tag-name>如果你想创建一个指向特定提交的标签,可以指定提交的哈希值:git tag <tag-name> <commit-hash> - 创建带有标签信息的标签:
git tag -a <tag-name> -m "Your message here"-a选项表示创建一个注释标签。-m选项后面跟着的是标签信息,可以是任何描述性的文本。
- 列出标签:
git tag -l-l选项用于查看标签的详细信息 - 检出标签:
git checkout <tag-name>如果你想查看或者工作在一个特定的标签上,可以使用checkout命令,这将会把代码库切换到标签所指向的提交。 - 删除标签:
git tag -d <tag-name>如果要删除远程仓库中的标签则可以使用git push <remote-name> :<tag-name> - 推送标签:单个标签:
git push <remote-name> <tag-name>;所有标签:git push <remote-name> --tags - 拉取标签:
git fetch --tags当你从一个远程仓库克隆或者拉取时,标签默认不会被拉取。使用上述命令拉取所有的标签。 - 验证标签:
git tag --verify <tag-name>使用--verify选项来验证一个标签是否由特定的密钥签名 - 搜索标签:
git tag --contains <text>如果你想搜索包含特定文本的标签,可以使用--contains选项。
branch
- 列出本地所有分支:
git branch - 列出所有远程分支:
git branch -r - 列出所有分支 (本地和远程):
git branch -a - 创建一个新分支:
git branch <new-branch-name> - 创建并切换分支:
git checkout -b <new-branch-name>或者git switch -c <new-branch-name> - 切换现有分支:
git checkout <branch-name> - 删除一个分支:
git branch -d <branch-name>如果分支未合并,Git 会拒绝删除。你可以使用-D选项强制删除分支 - 删除远程分支:
git push <remote-name> --delete <branch-name> - 重命名本地分支:
git branch -m <old-branch-name> <new-branch-name> - 设置跟踪分支:
git branch --set-upstream-to=<remote-name>/<branch-name>
checkout
- 检出文件:
git checkout <commit-hash> -- <file-path>查看或恢复工作目录中文件的历史版本<commit-hash>是你想要检出文件的历史版本的提交哈希值。<file-path>是文件的路径
- 用特定提交的文件覆盖工作目录:
git checkout <commit-hash> <file-path>将指定文件替换为指定提交时的版本 - 撤销工作目录中的更改:
git checkout -- <file-path>如果你对文件做了更改,但现在想要撤销这些更改,可以使用上述命令 - 切换到远程分支:如果你想切换到远程分支并创建一个本地跟踪分支,可以使用:
git checkout -b <local-branch-name> <remote-name>/<remote-branch-name> - 重置当前分支到某个提交: 如果你想将当前分支的 HEAD 指针重置到某个特定的提交,并更新工作目录,可以使用:
git checkout <commit-hash>,这会改变 HEAD 的位置,但不会自动创建一个新的分支 - 删除文件:
git checkout -- <file-path>这会删除指定的文件,并准备将其删除提交到仓库中。
stash
- 保存工作进度:
git stash这会创建一个新的储藏,并自动切换回主分支或其他默认分支。 - 保存工作进度并附加信息: 在保存工作进度时,您可以附加一条信息来帮助您以后识别这个储藏:
git stash save "Your descriptive message" - 列出所有储藏:
git stash list - 应用储藏: 应用指定的储藏,但不删除它:
git stash apply stash@{<index>}<index>是储藏的索引,可以通过git stash list命令查看。- 应用储藏后,您可以根据需要进行进一步的修改,然后提交更改。
- 应用并删除储藏:
git stash pop stash@{<index>} - 删除储藏:
- 删除指定储藏
git stash drop stash@{<index>} - 删除所有储藏
git stash clear
- 删除指定储藏
- 检出储藏: 检出指定储藏的内容到一个新的分支:
git stash branch <new-branch-name> stash@{<index>} - 展示储藏内容: 仅展示,不应用或删除:
git stash show stash@{<index>} - 从储藏中恢复文件:
git checkout stash@{<index>} -- <file-path>
clean
- 清理当前目录:
git clean默认情况下,这个命令不会删除.gitignore文件中指定的文件和目录 - 强制清理: 强制清理会删除所有未跟踪的文件和目录,包括
.gitignore中指定的文件,git clean -f它会删除所有未跟踪的文件,不会询问确认 - 清理特定文件或目录: 如果你只想清理特定的文件或目录,可以使用
-e选项排除一些文件或模式:git clean -e <pattern1> -e <pattern2>,<pattern1>和<pattern2>是你想要排除的文件或目录的模式。 - 干燥运行: 在实际执行清理之前,你可以运行
git clean -n来查看将要被删除的文件和目录,或者使用git clean --dry-run - 清理时排除特定文件: 使用
-e选项排除特定文件或目录,同时删除其他未跟踪的文件:git clean -f -e <pattern-to-exclude>其中<pattern-to-exclude>是你不想删除的文件或目录的模式 - 从暂存区中删除文件:如果你想要删除暂存区中的文件(不会删除工作目录中的文件),可以使用
git rm命令,而不是git clean:git rm --cached <file> - 清理所有分支的未跟踪文件:
git clean -b这个命令会删除所有分支的未跟踪文件,但不会删除.git目录下的文件。 - 清理所有未跟踪的文件和目录: 如果你想要删除所有未跟踪的文件和目录,包括隐藏文件和目录,可以使用
-x选项:git clean -f -x
submodule
- 初始化拉取代码:
git submodule update --init --recursive - 子模块更新后重新拉取:
git submodule update --remote - 添加子模块:
git submodule add url
使用技巧
取消跟踪
- 使用
.gitignore文件: 在项目的根目录下创建一个.gitignore文件,并将那些不希望 Git 跟踪的文件或文件夹添加到该文件中。这样,Git 将会忽略这些文件的更改,不会将它们包含在版本控制中,具体参考 .gitingonre。 - 使用
.gitattributes文件: 对于某些需要保留但又不希望进行版本控制的文件,可以使用.gitattributes文件来设置文件的属性。例如,可以设置文件为binary属性,这样 Git 将会将这些文件视为二进制文件,不会对其进行差异比较。 - 使用
submodule或subtree: 如果这些文件属于某个特定的模块或者子项目,可以考虑将它们作为子模块(submodule)或子树(subtree)加入到主项目中。这样,主项目可以引用这些文件,但它们的版本控制是独立的,不会与其他文件的更改混淆。 - 使用
git update-index命令: 对于已经被 Git 跟踪的文件,如果希望停止跟踪,但又不想从本地文件系统中删除它们,可以使用以下命令:git update-index --assume-unchanged <file>,这个命令会让 Git 假定文件没有发生改变,即使文件内容实际上已经变化了。这对于避免不必要的文件同步冲突很有帮助。
.gitingonre
在项目的根目录下创建一个 .gitignore 文件,并将那些不希望 Git 跟踪的文件或文件夹添加到该文件中。这样,Git 将会忽略这些文件的更改,不会将它们包含在版本控制中。
attention: >如果这些文件已经被跟踪(即之前已经被加入到 Git 仓库中),那么它们不会被自动从仓库中移除。对于这种情况,需要使用下面的命令将这些文件从 Git 仓库中删除跟踪:
git rm --cached <file>,上述命令将文件从当前分支的暂存区(staging area)中移除,但不会删除本地文件系统上的文件。
- 忽略特定文件:
*.log: 这会忽略所有扩展名为 .log 的文件。 - 忽略特定目录:
/build/: 这会忽略 build 目录及其所有子目录和文件。 - 忽略特定目录及其子目录的特定文件:
/build/*.log: 这会忽略 build 目录及其子目录中的所有 .log 文件,但不会忽略 build 目录本身。 - 忽略特定文件,但不排除子目录:
!keepme.txt如果你在一个目录的 .gitignore 文件中添加了*.txt来忽略所有 .txt 文件,但又想要包含一个特定的 .txt 文件,可以使用感叹号 ! 来覆盖前面的规则。 - 使用通配符:
*.tmp这会忽略所有扩展名为 .tmp 的文件。 - 忽略嵌套目录中的文件:
**/*.log这会忽略项目中任何地方的 .log 文件。 - 按模式忽略文件:
*.[Mm]ap: 这会忽略扩展名为 .map 或 .Map 的文件
.gitattributes
.gitattributes 文件是 Git 用来定义仓库中文件的属性的配置文件。通过这个文件,你可以设置文件的一系列属性,比如文本还是二进制、换行符的转换方式、合并策略等。以下是一些常见的使用场景和指令,指令一旦添加,这些设置会立即生效,无需重新添加或提交文件:
- 定义换行符转换:在不同的操作系统中,换行符是不同的。例如,Windows 使用
\r\n(回车 + 换行),而 Linux 和 macOS 使用\n(只有换行)。在跨平台的项目中,这可能会导致问题。你可以通过.gitattributes文件来设置统一的换行符:* text=autotext表示文本文件。auto表示 Git 会自动为每种文件类型选择正确的换行符转换方式。- 如果你想强制所有文件使用 LF 换行符,可以设置为
text=lf。
- 标记二进制文件:如果你有二进制文件,比如图片或可执行文件,你可能不希望 Git 尝试对它们进行差异比较。你可以通过
.gitattributes文件来标记这些文件为二进制:*.jpg binary*.png binary- 这里
*.jpg和*.png是模式匹配,表示所有扩展名为.jpg和.png的文件都会被标记为二进制文件。
- 忽略文件的空白差异: 在比较文件时,有时你可能想忽略空白字符的差异,这在代码格式化或文档排版时很常见:
*.txt diff=space- 这里
diff=space表示在比较.txt文件时忽略空白字符的差异。
- 这里
- 设置合并策略: 对于某些文件,你可能想使用特定的合并策略。例如,对于二进制文件,你可能不希望使用默认的合并工具:
*.jpg merge=keep-ours- 这里
merge=keep-ours表示在合并冲突时保留我们的版本。
- 这里
- 禁止文件被压缩:Git 默认会对存储在仓库中的文件进行压缩以节省空间。如果你有特殊的需求,不希望某些文件被压缩,可以这样设置:
*.iso compress=never- 这里
compress=never表示永不压缩.iso文件。
- 这里
- 指定文件的编码: 如果你在处理非英文字符的文本文件,可能需要指定文件的编码:
*.txt encoding=utf-8- 这里
encoding=utf-8表示所有.txt文件使用 UTF-8 编码。
- 这里
常见问题
10054
note: OpenSSL SSL_read: Connection was reset, errno 10054
首先出现这个问题,导致不能正常上传文件到 github 是很烦心的,网上找了下遇到类似情况的大家的处理方案,有的说是由于网络不稳定造成的,个人觉得有这方面的原因,因为 github 提交的时候这个错误不是一定会出来的,为了稳妥起见还是把 ssl 验证关了方便些:git config --global http.sslVerify "false"
-110
summary: GnuTLS recv error (-110) The TLS connection was non-properly terminated.
apt-get install gnutls-bin # 可能不成功,没事,继续执行下一步,不影响git config --global http.sslVerify falsegit config --global http.postBuffer 1048576000
index-pack
summary: index-pack failed
- 一般这种情况都是因为项目分支过多,导致你要下载的东西太多,从而引起这个问题。网上有一个流传比较多的修改方案:
git config --global core.compression -1,使用上述命令,来修改压缩模式,我尝试过了没有用。- 引起这个问题的根源是文件过多,所以我们可以分批次下载文件,先下载一部分,再下载剩下的。以下就是我的解决方案:
- 首先关闭 core.compression
git config --global core.compression 0- 然后使用 depth 这个指令来下载最近一次提交
git clone --depth 1 url- 然后获取完整库
git fetch --unshallow- 最后 pull 一下查看状态,问题解决
git pull --all
remote error
error: fatal: remote error:
- 具体问题:The unauthenticated git protocol on port 9418 is no longer supported. Please see Improving Git protocol security on GitHub - The GitHub Blogfor more information.
- 问题原因:
GitHub官方为了提高git协议的安全性,所以从 2022-03-15 以后将不再支持未加密的git协议(unencrypted Git protocol)。所以如果你还是使用老的git协议去更新Oh-My-Zsh就会出现这个错误,这个时候只需要将 仓库地址更新 为https协议即可。- 解决办法: 直接在终端执行以下命令
cd $ZSH:进入ZSH的目录。git remote set-url origin "https://github.com/ohmyzsh/ohmyzsh.git":修改远程仓库的地址,也就是将 git 协议的仓库地址修改为 https 即可
gnutls_handshake
ERROR: 🐞 gnutls_handshake() failed: The TLS connection was non-properly terminated.
原因是为 http 错误配置了 https 的代理,导致出错,正确代理应该参考上述代理配置
git submodule
ERROR: 🐞
- 问题复述: git submodule: neovim already exists in the index
- 问题原因: 原因是之前手动建过 neovim,删除之后,重新使用 submodule 的方式增加,本地缓存也还是存在,所以需要移除掉本地缓存的数据,才可以重新 submodule add
- 解决办法:
git rm -r --cached neovimgit submodule add https://gitee.com/wanxingge/neovim.git neovim
ERROR: 🐞 Permission denied
- 问题复述: 已生成并配置好密钥但是测试连接 github 失败
- 问题原因: 生成密钥时所用的用户名不对,验证不通过
- 解决办法:
- 需要修改 username 为 github 所对应的用户名重新生成密钥
- 确保 ssh-agent 已加载密钥:
eval "$(ssh-agent -s)";ssh-add ~/.ssh/id_rsa- 编辑
~/.ssh/config文件,指定对应网站使用指定密钥:
1
2
3
4 Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa






