git 操作记录
<1>、检查子模块是否在主分支上
git submodule foreach --recursive '
git fetch origin master &&
[ "$(git rev-parse HEAD)" = "$(git rev-parse origin/master)" ] &&
echo "✅ $name 一致" || echo "❌ $name 不一致"
'
使用 git submodule foreach --recursive
来遍历主项目中的所有子模块(包括嵌套的子模块),并对每个子模块执行一个特定的操作。
-
git submodule foreach --recursive
:git submodule foreach
:对每一个子模块执行后面的命令。--recursive
:递归地遍历所有子模块,包括子模块中的子模块。
-
命令体:
'[ "$(git rev-parse HEAD)" = "$(git rev-parse origin/master)" ] \
&& echo " 一致: $name" || echo "不一致: $name"'
$(git rev-parse HEAD)
:获取当前子模块所在分支的最新提交的哈希值。$(git rev-parse origin/master)
:获取子模块远程origin
仓库master
分支的最新提交的哈希值。[ "$(git rev-parse HEAD)" = "$(git rev-parse origin/master)" ]
:比较这两个哈希值是否相等。如果相等,表示子模块的当前分支与远程master
分支是同步的。&& echo " 一致: $name"
:如果上述比较结果为真(即哈希值相等),则输出 "一致: name",其中‘name是子模块的名称或路径(由
git submodule foreach` 自动提供)。|| echo "不一致: $name"
:如果上述比较结果为假(即哈希值不相等),则输出 "不一致: $name"。
<2>、更新所有子模块到master分支
git submodule foreach 'git checkout master && git pull origin master'
# 确保你在主仓库的 master 分支上 | |
git checkout master | |
git pull origin master | |
# 更新所有子模块到 master 分支 | |
git submodule foreach 'git checkout master && git pull origin master' |
1、解释
git checkout master
:切换到master
分支。git pull origin master
:从远程仓库拉取master
分支的最新更改。git submodule foreach '...'
:对每个子模块执行指定的命令。git checkout master
:在每个子模块中切换到master
分支。git pull origin master
:从远程仓库拉取master
分支的最新更改。
<3>要撤销最后一次本地的 Git 提交(使用 git commit -a
创建的提交)
方法 1:保留更改,仅撤销提交(推荐)
如果希望保留对文件的修改,但撤销提交记录,使用以下命令:
git reset HEAD~1
- 作用:将 HEAD 指针回退到上一次提交,但保留工作区和暂存区的修改。
- 后续操作:修改文件后,可以重新
git add
和git commit
。
方法 2:完全撤销提交和更改(慎用)
如果希望彻底删除最后一次提交的更改(包括工作区和暂存区的修改),使用:
git reset --hard HEAD~1
- 作用:强制回退到上一次提交,并丢弃所有未提交的修改。
- 注意:此操作不可逆,未提交的更改将永久丢失。