Git 高级用法

修改连续多个 commit 的用户名与邮箱

注意: 只建议修改未 push 的 commit。

因为修改 Commit 的用户名或邮箱会生成一个新的 commit 来替换之前的 commit 。如果在修改之前已经 push 到了远端,修改后再次 push 会出现冲突。 只能使用强制推送 push -f。 如果其他人已经拉取( pull )了旧 commit 会出现很多麻烦。

比如,你的 commit 历史为 A-B-C-D-E-F,F 为 HEAD

你打算修改 C 和 D 的用户名或邮箱,你需要:

  1. 运行 git rebase -i B,如果你需要修改 A,可以运行 git rebase -i --root
  2. 把 C 和 D 两个 commit 的那一行的 pick 改为 edit,当 rebase 开始后,将会暂停在 commit C
  3. 运行 git commit --amend --author="Naomi <email@address.com>"
  4. 运行 git rebase --continue,将会继续暂停在 commit D
  5. 运行 git commit --amend --author="Naomi <email@address.com>"
  6. 运行 git rebase --continue,rebase 结束

如果需要更新到远程仓库, 使用 git push -f(请确保修改的 commit 不会影响其他人)

批量替换全部 commit 的用户名与邮箱

如果需要改写大量提交的话可以使用 git filter-branch。下面的命令会遍历并重写每一个提交来包含你的新邮箱地址。

bash
复制代码
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 的文件,无论它是否存在。

bash
复制代码
git filter-branch --tree-filter 'rm -f src/password.txt' HEAD

参考

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP