Git 高级用法
2022年6月4日约 567 字大约 2 分钟
Git 批量修改 COMMIT
修改连续多个 commit 的用户名与邮箱
注意: 只建议修改未 push 的 commit。
因为修改 Commit 的用户名或邮箱会生成一个新的 commit 来替换之前的 commit 。如果在修改之前已经 push 到了远端,修改后再次 push 会出现冲突。 只能使用强制推送 push -f
。 如果其他人已经拉取( pull )了旧 commit 会出现很多麻烦。
比如,你的 commit 历史为 A-B-C-D-E-F
,F 为 HEAD
你打算修改 C 和 D 的用户名或邮箱,你需要:
- 运行
git rebase -i B
,如果你需要修改 A,可以运行git rebase -i --root
- 把 C 和 D 两个 commit 的那一行的
pick
改为edit
,当 rebase 开始后,将会暂停在 commit C - 运行
git commit --amend --author="Naomi <email@address.com>"
- 运行
git rebase --continue
,将会继续暂停在 commit D - 运行
git commit --amend --author="Naomi <email@address.com>"
- 运行
git rebase --continue
,rebase 结束
如果需要更新到远程仓库, 使用 git push -f(请确保修改的 commit 不会影响其他人)
批量替换全部 commit 的用户名与邮箱
如果需要改写大量提交的话可以使用 git filter-branch
。下面的命令会遍历并重写每一个提交来包含你的新邮箱地址。
git filter-branch -f --env-filter '
# 作者名称
an="$GIT_AUTHOR_NAME"
# 作者邮箱
am="$GIT_AUTHOR_EMAIL"
# 提交者名称
cn="$GIT_COMMITTER_NAME"
# 提交者邮箱
cm="$GIT_COMMITTER_EMAIL"
# 查找提交者邮箱为xxx,替换名称和邮箱
if [ "$GIT_COMMITTER_EMAIL" = "xxx@xxx.xx" ]
then
cn="Naomi"
cm="mangogo.naomi@qq.com"
fi
# 查找作者邮箱为xxx,替换名称和邮箱
if [ "$GIT_AUTHOR_EMAIL" = "xxx@xxx.xx" ]
then
an="Naomi"
am="mangogo.naomi@qq.com"
fi
export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
' HEAD
删除 commit 中敏感文件
--tree-filter
选项在检出项目的每一个提交后运行指定的命令然后重新提交结果。如果需要在所有分支上运行,可以给命令传递 --all
选项
下面的命令会在每一次提交移除了 src 文件夹下的 passwords.txt 的文件,无论它是否存在。
git filter-branch --tree-filter 'rm -f src/password.txt' HEAD