Table of Contents

Git

E:\Dev>git --version
git version 2.36.1.windows.1

TODO:有很多内容待整理,趁现在熟悉及时整理了

VS Code侧边栏自带git(可视化操作)功能,也支持查看diff,已经很足够用了,推荐

  1. 十分钟学会正确的github工作流,和开源作者们使用同一套流程(码农高天) https://www.youtube.com/watch?v=uj8hjLyEBmU

Github是一个存放 Git Repo 的网站


子命令

命令 作用
Clone 复制
Init 初始化
Remote 远程
Add 添加
Revert 恢复
Reset 重置
Restore
Clean 清理
Rm 删除
Commit 打包
Fetch 拉取
Pull 更新
Push 推送
Merge 合并
Diff 显示修改
Branch 分支
Tag 标签
Checkout (Switch) 检出
Rebase 变基
Cherrypick 摘取
Stash 暂存
Log 日志
Reflog 引用日志
Show 显示
Config 配置

问题

待整理

Repo

Git Repository表现为一个文件夹

Git是一个版本管理工具,除了GitHub还有其他网站如GitLab等支持Git

Git报错:Unable to create 'XXX/.git/index.lock': File exists.
解决方法:去工程的.git文件夹,删除index.lock文件

其他

有冲突的时候怎么取消合并的步骤 master是一个特殊分支吗?从功能性上来说,有主分支这种概念吗? 很久没有pull/push,积累了很多commit,冲突很多,那要一次性解决完吗? 40位的ID和8位的ID,什么关系?8位ID是前缀啊! push和pull就是同步而已 push之前先pull,谁要合并谁就解决冲突 add 之后就是 index index就是staging area(staged area) HAED就是Repo,为什么?!因为Repo不需要存储Working Dir和Index,只需要HEAD的部分 本地的HEAD就是Remote HEAD的同步版本 release issue 是git的功能吗,还是只是Github的功能? git怎么不拉所有的分支/所有的commit记录?

git checkout HEAD~1 其中HEAD~1表示HEAD前的1个Commit

命令

待整理:

冲突

对于非文本文件,Git检测冲突的最小单位是文件,对于文本文件,Git检测冲突的最小单位是行。

问题:二进制文件和文本文件是如何区分的?
猜测:实际上两种类型的文件都是存储为二进制,但是文本文件符合一定的编码规则,比如按照特定的解码规则,解码的时候不会出现错误,普通的二进制文件肯定是不可以的,应该就是按照这样的方式进行区分文本文件和二进制文件的吧。

修复冲突可以直接选择使用冲突两方的某一方的版本覆盖冲突的部分。

分支

Branch

标签

Tag

认证

Github使用token认证,可以为不同的Repo设置不同的token,但是这样Repo A的token保留在电脑上,再push Repo B的时候就会认证失败,还挺不方便的,我并没有找到能用的清除本地token记录的方式,只能用下面的方式代替:

# 在无法推送的Repo中:
# 查看remote地址
> git remote -v
origin	https://github.com/GZhonghui/xxx.git (fetch)
origin	https://github.com/GZhonghui/xxx.git (push)

# 修改remote地址,顺便把正确的token填入
git remote set-url origin https://github_username:token_of_this_repo@github.com/GZhonghui/xxx.git

# 然后就可以push啦

子模块

Submodule,子模块将整个工程分割开来,子模块也就是依赖,但是不用将依赖的代码添加到自己的工程中来,而且一般是依赖别人的库,使用Git的子模块可以很方便的将别人的库添加到自己的库中,依赖的模块也可以很方便地更新。

大文件

Git LFS,大坑

使用Git上传大文件的时候很可能遇到LFS的错误。先不说LFS能不能用,就算能用,它的性能也绝对不够,直接禁用就好,使用以下命令移除Git LFS:

git lfs uninstall

服务器

.git文件是干啥的

Github

Bitbucket

[AI]Bitbucket 是 Atlassian 公司推出的一個 Git 代碼託管與協作平台,主要用於軟體開發團隊進行程式碼版本控制、協作開發與專案管理,它和 GitHub、GitLab 類似。

Pull Request

底层理解

git的工作原理

Git 把所有数据(包括文件内容、目录结构、提交记录等)都存储为对象,对象主要有以下四种类型:

  1. blob(Binary Large Object):存储文件的内容。
  2. tree:表示目录,记录文件名到 blob 或 tree 的映射(这里不太理解)。
  3. commit:表示一次提交,指向一个 tree。
  4. tag:用于打标签的对象(不是重点)。

简单来说就是上面四种对象,都有自己的hash id(最常见的就是commit id了)
使用cat-file可以查看一个id对应的内容

anny@annys-MacBook-Air trial % git log
commit d5845d878949af658efeaaf710a458c9c3e3c3ae (HEAD -> master)
Author: GZhonghui <mail@gzher.com>
Date:   Tue Jul 8 11:36:35 2025 +0900

    1st commit
anny@annys-MacBook-Air trial % git cat-file -p d5845d878949af658efeaaf710a458c9c3e3c3ae
tree 56dd4326f33de0b7575658c179df3967840dde90
author GZhonghui <mail@gzher.com> 1751942195 +0900
committer GZhonghui <mail@gzher.com> 1751942195 +0900

1st commit
anny@annys-MacBook-Air trial % git cat-file -p 56dd4326f33de0b7575658c179df3967840dde90
100644 blob ce013625030ba8dba906f756967f9e9ca394464a	README
100644 blob b80e3222ab264bd7cafb376749bd18814fd66776	main.py

顺便说一句:
git add / git commit等,这种叫作git的高级命令,用这些命令就足够我们工作了
但是如果想要看到git的工作过程,可以使用git的底层命令,上面我们用到的git cat-file就是一个底层命令。

可视化工具

常见错误

无法访问/tmp

mustang[46]% git log
temporary file: Permission denied

# 方法1:确认系统的临时文件的路径($TMPDIR or /tmp)的权限
# 方法2:使用--no-pager (git --no-pager log),禁用分页器,这样log就不会尝试写入硬盘了

Repo的权限

fatal: detected dubious ownership in repository at '/export/www/htdocs'
To add an exception for this directory, call:

        git config --global --add safe.directory /export/www/htdocs
        
# 按照提示执行命令即可

命令输出包含乱码

# 如果包含类似 "^[[33m" 的字符,说明当前环境不支持显示颜色
# 使用此参数关闭 git 的颜色渲染
--no-color
git show --no-color ac23ebd6a15ea96929553f037fe523d940cfdec0
 
# 其他的可能是编码问题

指令合集

资料来源:GeekHour
git_gitcheatsheet-bygeekhour.pdf

Odt笔记(20221007)