Git 总结

回退

git reset

1
2
3
4
# 回退到某commit, 仅回退commit信息,不会改变工作区任何文件(非常快,因为其实没有任何文件的改变)
# 如果你的改动没有 push 到远程,可以通过此方式,将直接改变 log 历史线
# 通过 git status 你将看到目标与现在的差异,改动了哪些文件,这些将处于缓存区,修改为你满意的后,就可commit,中间的commit将看起来没有存在过一样
git reset --soft
1
2
# 回退到某 commit, 真正的时光机,将伴随工作区所有文件的改动,本地工作区源码将彻底变为目标版本
git reset --hard
1
2
3
4
5
git reset --soft     # 跳转到指定版本、不还原缓存区、不还原工作区。

git reset # 跳转到指定版本、还原缓存区、不还原工作区。

git reset —hard 跳转到指定版本、还原缓存区、还原工作区、。

git reset 和 git revert 区别

TODO: git reset 和 git revert 区别 tag
1
2
3
# 查看本地 tag
git tag
git tag -l
1
2
# 删除本地tag
git tag -d <tagname>
1
2
# 删除远端tag
git push origin --delete <tagname>
--delete 也可简写 -d
1
2
# 向远端推送本地tag
git push origin <tagname>
1
2
# 向远端推送本地所有tag
git push origin --tags
submodule 参考: git submodule来管理独立git子目录 - 走看看 git submodule 使用小结 - 简书
1
git submodule --help
git submodule 允许一个git仓库,作为另一个git仓库的子目录,并且保持父仓库和子仓库相互独立。

子模块 实例

修改 子模块 内容 后 Visual Studio Code GitLens
Visual Studio Git
进入子模块,并 add, 主项目 status 不受影响 情景1: 拥有对子模块远程仓库权限,直接修改子模块路径中的文件
本地开发调试子模块结束后, 进入子模块路径 add, commit, push, 然后主项目 git add 子模块路径,git commit 这时会发现 new commits, git add 即可 情景2: 子模块对应的远程仓库有更新,本地子模块内容过时
本地进入子模块路径,git pull 子模块更新,然后返回主项目根目录, git add 子模块路径, git commit 子模块实际上就是记录的一个 commit 引用,
1
2
3
4
5
6
7
8
9
# 添加子模块远程仓库引用,此时还没有对应的 commit
# 注意: 经过测试, 此步就会生成 .gitmodules, .git/config 中 submodule 信息
# TODO: 注意: 经过测试, 在已有仓库上执行 add 此步 就会 clone 子模块到本地, 后续需要更新子模块才使用 git submodule update
git submodule add <url> <path>
# 此时确定 commit 引用
# PS: git submodule init 的时候,从 .gitmodules 读取子模块信息,然后生成配置文件到 .git 里
git submodule init
# 从远程检出子模块代码, 即下载 commit 引用 对应的文件内容
git submodule update
这称为 子模块初始化
1
2
git submodule init
git submodule update

等同下方
1
git submodule update --init --recursive

添加子仓库

1
git submodule add <仓库地址> <本地路径>
其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。 注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone) 命令执行完成,会在当前工程根路径下生成一个名为“.gitmodules”的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。
1
git submodule add git@github.com:yiyungent/PluginCore.git src/PluginCore
注意: 可以看到 add 后就进行了 clone 子模块到本地的操作 添加成功后,在父仓库根目录增加了.gitmodule文件。 .gitmodule 经过测试 , 生成的是 .gitmodules ,
1
2
git --version
git version 2.26.2.windows.1
1
cat .gitmodules
并且在父仓库的git 配置文件中加入了submodule段。
1
cat .git/config

检出(checkout)

克隆一个包含子仓库的仓库目录,并不会clone下子仓库的文件,只是会克隆下.gitmodule描述文件,需要进一步克隆子仓库文件。
1
2
3
4
5
// 初始化本地配置文件
$ git submodule init

// 检出父仓库列出的commit
$ git submodule update
或者是执行以下命令(该命令效果等同于上面两个命令):
1
git submodule update --init --recursive
即可将子模块内容下载下来后工程才不会缺少相应的文件。

更新

如果在本地修改子仓库,在主仓库 git status会显示子仓库有修改。 需要先在子仓库提交,然后再到主仓库提交代码。

删除子模块

1.使用vim编辑.gitmodules(vim .gitmodule), 删除对应要删除的submodule的行. 2.使用vim编辑.git/config,删除有对应要删除的submodule的行. 3.执行 git rm --cached {submodule_path}。 注意,路径不要加后面的“/”。 例如:你的submodule保存在 supports/libs/websocket/ 目录。 执行命令为: git rm --cached supports/libs/websocket 如果未按照上述步骤删除,可能残留在.git/modudles文件夹内。

clone 时 带上子模块

1
git clone --recursive git@github.com:yiyungent/OneTree.git
master 重命名为 main 参考: Github默认分支由master变更为main - 知乎
1
git branch -m master main
推送到远端
1
git push -u origin main

删除旧的 master 分支

1
git push --delete origin master

修改本地 git init 默认分支

1
git config --global init.defaultBranch main
设置大小写敏感 发现有个文件没注意大小写,于是重命名了该文件,发现 git 没有识别这个更改,不能提交 解决方法: 查看git 的设置
1
git config --get core.ignorecase
发现默认是不区分大小的,因此当你修改了文件名 (或文件夹名) 的大小写后,git并不会认为你有修改 更改设置
1
git config core.ignorecase false
git subtree 参考: git subtree 简单使用记录 | Verne in GitHub GitHub

国内镜像加速地址

GitClone - GitHub缓存加速网站,为开发者服务 补充

git commit emoji 表情

gitmoji | An emoji guide for your commit messages

Bad owner or permissions on /root/.ssh/config

当将 Windows 下 Git 配置 复制到 Linux 下后, git clone 报错
1
sudo chmod 600 /root/.ssh/config
补充:
1
chmod -R 600 /root/.ssh
补充:
Git 配置文件
1
2
3
~/.gitconfig
~/.ssh/
~/.gnupg/

WARNING: UNPROTECTED PRIVATE KEY FILE!

1
2
3
4
5
6
7
8
9
10
11
12
13
Warning: Permanently added the RSA host key for IP address '192.30.255.112' to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '/root/.ssh/id_rsa_yiyun' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/root/.ssh/id_rsa_yiyun": bad permissions
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
1
chmod -R 600 /root/.ssh
私钥文件不能允许其他人访问, 因此权限 777 不被允许, 建议 600

关于 submodule init 等

参考: Git Submodule使用完整教程 - lsgxeva - 博客园 - 详细过程分析
1
2
git submodule init
git submodule update
init 执行后, 注入 .git/config, 但原本本地仓库就有啊,难道 push 上去的没有此项?
难道 push 在 clone 后, 此项就没有了? 有了此项后 update 才有效 参考 感谢帮助! Git常规配置与用法 git 回退版本 git reset(--hard、--soft)、revert命令 区别及理解 Github中提交Commit时使用GPG进行签名 如何在 Gitee 上使用 GPG 使用GPG对Git Commit进行签名