# 回退到某commit, 仅回退commit信息,不会改变工作区任何文件(非常快,因为其实没有任何文件的改变)
# 如果你的改动没有 push 到远程,可以通过此方式,将直接改变 log 历史线
# 通过 git status 你将看到目标与现在的差异,改动了哪些文件,这些将处于缓存区,修改为你满意的后,就可commit,中间的commit将看起来没有存在过一样
git reset --soft
# 回退到某 commit, 真正的时光机,将伴随工作区所有文件的改动,本地工作区源码将彻底变为目标版本
git reset --hard
git reset --soft # 跳转到指定版本、不还原缓存区、不还原工作区。
git reset # 跳转到指定版本、还原缓存区、不还原工作区。
git reset —hard 跳转到指定版本、还原缓存区、还原工作区、。
TODO: git reset 和 git revert 区别
# 查看本地 tag
git tag
git tag -l
# 删除本地tag
git tag -d <tagname>
# 删除远端tag
git push origin --delete <tagname>
--delete
也可简写-d
# 向远端推送本地tag
git push origin <tagname>
# 向远端推送本地所有tag
git push origin --tags
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 引用,
# 添加子模块远程仓库引用,此时还没有对应的 commit
# 注意: 经过测试, 此步就会生成 .gitmodules, .git/config 中 submodule 信息
git submodule add <url> <path>
# 此时确定 commit 引用
# PS: git submodule init 的时候,从 .gitmodules 读取子模块信息,然后生成配置文件到 .git 里
git submodule init
# 从远程检出子模块代码, 即下载 commit 引用 对应的文件内容
git submodule update
这称为 子模块初始化
git submodule init
git submodule update
等同下方
git submodule update --init --recursive
git submodule add <仓库地址> <本地路径>
其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。 注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone) 命令执行完成,会在当前工程根路径下生成一个名为“.gitmodules”的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。
git submodule add git@github.com:yiyungent/PluginCore.git src/PluginCore
添加成功后,在父仓库根目录增加了.gitmodule文件。
.gitmodule
经过测试 , 生成的是 .gitmodules
,
git --version
git version 2.26.2.windows.1
cat .gitmodules
并且在父仓库的git 配置文件中加入了submodule段。
cat .git/config
克隆一个包含子仓库的仓库目录,并不会clone下子仓库的文件,只是会克隆下.gitmodule描述文件,需要进一步克隆子仓库文件。
// 初始化本地配置文件
$ git submodule init
// 检出父仓库列出的commit
$ git submodule update
或者是执行以下命令(该命令效果等同于上面两个命令):
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文件夹内。
git clone --recursive git@github.com:yiyungent/OneTree.git
git branch -m master main
推送到远端
git push -u origin main
git push --delete origin master
git config --global init.defaultBranch main
发现有个文件没注意大小写,于是重命名了该文件,发现 git 没有识别这个更改,不能提交
解决方法:
查看git 的设置
git config --get core.ignorecase
发现默认是不区分大小的,因此当你修改了文件名 (或文件夹名) 的大小写后,git并不会认为你有修改
更改设置
git config core.ignorecase false
参考:
Bad owner or permissions on /root/.ssh/config
当将 Windows 下 Git 配置 复制到 Linux 下后, git clone 报错
sudo chmod 600 /root/.ssh/config
补充:
chmod -R 600 /root/.ssh
补充: Git 配置文件
~/.gitconfig
~/.ssh/
~/.gnupg/
WARNING: UNPROTECTED PRIVATE KEY FILE!
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.
chmod -R 600 /root/.ssh
私钥文件不能允许其他人访问, 因此权限 777 不被允许, 建议 600
git submodule init
git submodule update
init 执行后, 注入
.git/config
, 但原本本地仓库就有啊,难道 push 上去的没有此项? 难道 push 在 clone 后, 此项就没有了?
有了此项后
update
才有效