git 学习: 学习指南/git notes/fixup/rebase
工作中的常用 git 用法笔记
🕐
版本
git --version
# git version 2.37.2常见用法 Tag
| 用法 | 代码 |
|---|---|
| 创建tag | |
| 由远程tag 创建分支 | |
| 将tag代码恢复到当前分支 | |
| 删除远程Tag | |
| 一键删除本地所有的tag | |
| 顺便删除 gihtub release | |
| 查出项目最新的tag | |
| 升级 semver | |
常见用法 branch
| 用法 | 代码 |
|---|---|
| 拉取最新 | |
| 将 master 重命名为 main 分支 | |
| 删除分支(本地/远程) | |
| 删除远程分支 | |
| 新建并切换到分支 | |
| 重命名(其它分支) | |
| 重命名实战(当前分支) | |
| cheery-pick 将某条提交,合并到某个分支 |
|
其它
| 用法 | 代码 |
|---|---|
| git rebase/cherry-pick | git rebase/cherry-pick: 合并最近的 message |
| git fixup(精细化管理git message) | |
| 回滚到某个githash | |
| 清理/网上方法 | |
| 体积优化(已验证) | |
| 官方推荐的一个工具(体积优化) | https://www.jianshu.com/p/19cabd0307ee https://blog.csdn.net/Aloneingchild/article/details/104984527 |
| 取短 hash | |
解决代码冲突时的 “use theirs” | |
解决代码冲突时的 “use ours” | |
git merge 远程的 master 分支 | |
| git撤销commit到未提交状态 | https://blog.csdn.net/ywb201314/article/details/106191221 |
| git merge/reabase | |
| git 删除某个文件,保留线上 右侧命令执行完,.yarnrc 不会变灰 | |
| 暂存区 | |
清理 git
- 查看大小
- 找出占用空间的大文件
- 清理,释放内存
git stash
出现的场景:你正在开发一个功能,这个时候,你同事在
dev分支上
git alias
Basically you just need to add lines to ~/.gitconfig
[alias]
st = status
ci = commit -vgit 忽略大小写
- https://stackoverflow.com/questions/52950/how-to-make-git-ignore-changes-in-case
- https://www.worldhello.net/gotgit/08-git-misc/030-case-insensitive.html
# 配置层面(需要变成敏感,就改成false)
git config core.ignorecase true
git config --global core.ignorecase true
# 命令方式修改文件
git mv --cached name.txt NAME.TXT
git mv -f mynewapp.sln MyNewApp.sln添加 submodule
git submodule add git@github.com:aric-tpls/scrapy-app.git scrapy/scrapy-slim移除子模块 submodule
git submodule deinit -f python/scrapy-slim
rm -rf python/scrapy-slim/
rm -rf .git/modules/python/scrapy-slim/
# 手动移除
[submodule "子模块名"]
path = 子模块路径
url = 子模块仓库地址
# 清理
git rm -f python/scrapy-slimgit fixup 实战
适合场景:你最近的几条修改,都是针对同一个修改,但确实产生了几个 commit,你想合并第1条 message 的内容。
# 我想在 feat: add test1 再添加一些修改,但不要与后面的有冲突,否则后面的相关修改会有conflict,进而会将此后的 message 都覆盖掉
# 找到2个关键的 hash:
# dc5799c3: 这里修改的是 README.md
# 执行你的修改,假设我改了其它文件 package.json
git add .
git commit --fixup=dc5799c3
git rebase -i --autosquash ed454f19
# 切记,如果过程中有 conflict,这种情况下,中间的 commit 会被合并为1条
# 所以,如果确认中间过程的修改过多,不短途用 fixup 操作


简化后的 fixup 函数,上面的操作,可以简化为:
fixup
dc5799c3, 这时会有交互式界面
#!/usr/bin/env bash
# 检查是否传入了目标提交
if [ -z "$1" ]; then
echo "Usage: git-fixup-rebase <target-commit>"
return 1
fi
# 获取目标提交
TARGET_COMMIT=$1
# 找到目标提交的上一条提交
BASE_COMMIT=$(git rev-parse $TARGET_COMMIT^)
# 如果没有找到上一条提交,提示错误
if [ -z "$BASE_COMMIT" ]; then
echo "Error: Could not find the parent commit of $TARGET_COMMIT."
return 1
fi
# 执行交互式变基
git add .
git commit --fixup=$TARGET_COMMIT
git rebase -i --autosquash $BASE_COMMIT
fixup项目awesome-ci测试
# reset
cd ~/saybot/awesome-ci
git reset --hard 74dc906b22df884e74b1b0c115c59119a00ff5f6
# 有1/4 的提交记录
git reset --hard db60dfef
git push origin -f
git add .
git commit --fixup=dc5799c3
git rebase -i --autosquash ed454f19
git rebase -i --autosquash HEAD~5Git常用命令速查

修改具体有问题的 msg
AI 帮我提交了几个中文的 message,需要修改一下 https://chat.qwen.ai/c/eaf6b0ae-d783-4235-bd39-07d95e5f979b

# 1. 启动交互式 rebase,指定该提交的父提交:
git rebase -i a1b2c3d^
# 2. 找到以 a1b2c3d 开头的那一行,把前面的 pick 改成 reword(或 r)
reword a1b2c3d 旧的提交信息
pick e4f5g6h 另一个提交
...
# 3. 如果该提交已推送到远程仓库,修改后需要强制推送
git push --force-with-lease --force-with-lease我的实际操作
值得注意,一大堆的 hash 都被更新了
特别注意: 后面那个界面,才是真实的 message



github PR 安全无害
提交
gh的PR的时候,如果别人的commit在 你的提交之前已经 合并,需要使用以下方式处理
# 1. 同步远程
git fetch origin
# 2. 切到你的分支
git checkout feat/kat-123
# 3. 基于最新 release rebase
git rebase origin/release
# 4. 如果出现 conflict:
# - 手动编辑文件,解决冲突
# - git add <resolved-files>
# - git rebase --continue
# (重复直到 rebase 完成)
# 5. 安全强制推送(即使有 conflict 也这么干)
git push --force-with-leaseRollback
再加上 git revert 就可以恢复之前的代码(gr)
# 回滚刚才提交的
git reset HEAD~1
🔗 参考链接
- https://stackoverflow.com/questions/5480258/how-do-i-delete-a-remote-tag
- https://devconnected.com/how-to-delete-local-and-remote-tags-on-git/
- https://stackoverflow.com/questions/2003505/how-do-i-delete-a-git-branch-locally-and-remotely
- https://github.com/aric-notes/git-notes
- https://stackoverflow.com/questions/1404796/how-can-i-get-the-latest-tag-name-in-current-branch-in-git
- https://stackoverflow.com/questions/3103589/how-can-i-easily-fixup-a-past-commit