git仓库删除提交历史记录及修改github提交用户

旧仓库有些乱七八糟的提交纪录,有些可能还有敏感信息,如果我们需要清除所有这些历史纪录,成为一个全新的库,但是代码保持不变,方法如下:

Checkout

git checkout --orphan latest_branch

Add all the files

git add -A

Commit the changes

git commit -am "commit message"

Delete the branch

git branch -D master

Rename the current branch to master

git branch -m master

Finally, force update your repository

git push -f origin master

原文:how-to-delete-all-commit-history-in-github



如果只是想从中删除某些提交纪录,可以如下操作:

一个例子

考虑这个例子,我们提交了 6 个版本,其中 3-4 包含了错误的代码需要被回滚掉。 同时希望不影响到后续的 5-6。

* 982d4f6 (HEAD -> master) version 6
* 54cc9dc version 5
* 551c408 version 4, harttle screwed it up again
* 7e345c9 version 3, harttle screwed it up
* f7742cd version 2
* 6c4db3f version 1

这种情况在团队协作的开发中会很常见:可能是流程或认为原因不小心合入了错误的代码, 也可能是合入一段时间后才发现存在问题。 总之已经存在后续提交,使得直接回滚不太现实。

下面的部分就开始介绍具体操作了,同时我们假设远程分支是受保护的(不允许 Force Push)。 思路是从产生一个新的 Commit 撤销之前的错误提交。

git revert

使用 git revert <commit> 可以撤销指定的提交, 要撤销一串提交可以用 <commit1>..<commit2> 语法。 注意这是一个前开后闭区间,即不包括 commit1,但包括 commit2。

git revert --no-commit f7742cd..551c408
git commit -a -m 'This reverts commit 7e345c9 and 551c408'

其中 f7742cd 是 version 2,551c408 是 version 4,这样被移除的是 version 3 和 version 4。 注意 revert 命令会对每个撤销的 commit 进行一次提交,--no-commit 后可以最后一起手动提交。

此时 Git 记录是这样的:

* 8fef80a (HEAD -> master) This reverts commit 7e345c9 and 551c408
* 982d4f6 version 6
* 54cc9dc version 5
* 551c408 version 4, harttle screwed it up again
* 7e345c9 version 3, harttle screwed it up
* f7742cd version 2
* 6c4db3f version 1

现在的 HEAD(8fef80a)就是我们想要的版本,把它 Push 到远程即可。

确认 diff

如果你像不确定是否符合预期,毕竟批量干掉了别人一堆 Commit,可以做一下 diff 来确认。 首先产生 version 4(551c408)与 version 6(982d4f6)的 diff,这些是我们想要保留的:

git diff 551c408..982d4f6

然后再产生 version 2(f7742cd)与当前状态(HEAD)的 diff:

git diff f7742cd..HEAD

如果 version 3, version 4 都被 version 6 撤销的话,上述两个 diff 为空。 可以人工确认一下,或者 grep 掉 description 之后做一次 diff。 下面介绍的另一种方法可以容易地确认 diff。

另外一种方式

类似 安全回滚远程分支, 我们先回到 version 2,让它合并 version 4 同时代码不变, 再合并 version 5, version 6。

# 从 version 2 切分支出来
git checkout -b fixing f7742cd
# 合并 version 4,保持代码不变
git merge -s ours 551c408
# 合并 version 5, version 6
git merge master


上述分支操作可以从 分支管理 一文了解。 至此,fixing 分支已经移除了 version 3 和 version 4 的代码,图示如下:

*   3cb9f8a (HEAD -> v2) Merge branch 'master' into v2
|\
| * 982d4f6 (master) version 6
| * 54cc9dc version 5
* |   c669557 Merge commit '551c408' into v2
|\ \
| |/
| * 551c408 version 4, harttle screwed it up again
| * 7e345c9 version 3, harttle screwed it up
|/
* f7742cd version 2
* 6c4db3f version 1

可以简单 diff 一下来确认效果:

# 第一次 merge 结果与 version 2 的 diff,应为空
git diff f7742cd..c669557
# 第二次 merge 的内容,应包含 version 5 和 version 6 的改动
git diff c669557..3cb9f8a

现在的 HEAD(即 fixing 分支)就是我们想要的版本,可以把它 Push 到远程了。 注意由于现在处于 fixing 分支, 需要  Push 时指定远程分支 为 master

原文:https://harttle.land/2018/03/13/remove-certain-commits-from-history.html


如果提交后github不显示commit纪录,或者想修改提交的github邮箱账号,方法如下:

简单的就是在仓库下执行 vim .git/config 指定用户信息

[user]
       name = anzhihe
       email = anzhihe@xxx.com

但是如果是个老仓库的话请用如下方法修改:

1.clone你需要修改commit记录的repo

git clone --bare https://github.com/user/repo.git 
cd repo.git

2.复制以下代码,建立script.sh文件(文件名随便),并根据你的信息修改以下变量:旧的Email地址(就是commit记录中的那个),正确的用户名正确的邮件地址

#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="旧的Email地址"
CORRECT_NAME="正确的用户名"
CORRECT_EMAIL="正确的邮件地址"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

然后执行script.sh

    3.把正确历史 push 到 github

    git push --force --tags origin 'refs/heads/*'

    4.删掉你clone的repo

    至此就可以了,刷新github主页,没有意外就可以看到全部提交记录了。


    不显示commit记录的原因还有其他的,我这个只针对邮箱错误的原因,如不是这个原因请参考https://help.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile/


    原文:https://www.jianshu.com/p/82ee1c341456


    anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/3393.html | ☆★★每天进步一点点,加油!★★☆ | 

    您可能还感兴趣的文章!

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注