背景:
公司使用 gitlab 部署了本地 git 服务器,有自己的帐号体系,通过 GitHub desktop 同时管理 GitHub 仓库和 公司 gitlab 仓库的时候不小心往公司 gitlab 仓库提交了自己 GitHub 的帐号,这导致了 gitlab 交记录中的账号信息在 gitlab 服务器找不到,进而无法进行帐号信息的管理和统计。
那么,我怎么将错误提交到 commit 中的账号信息修改为 gitlab 服务器的账号体系中的帐号呢?
下面提供 3 种情景及其解决方案:
1. 如何修改 Git 中单个提交的提交者信息?
2. 如何批量修改所有 Git commit 提交者信息?
3. 如何将 Git 仓库中将指定用户的信息替换成另一个用户的信息?
一、git 如何修改单个 Commit 的提交者信息?
要修改 Git 中某个特定提交(commit)的提交者信息(作者姓名和邮箱),可以根据该提交的位置选择不同的方法。以下是详细的操作步骤:
✅ 修改最近一次提交的提交者信息
如果你需要修改的是最近的一次提交,可以使用以下命令:
git commit --amend --author="新作者名 <新邮箱地址>"
如果不想修改提交信息,可以添加 --no-edit
参数:
git commit --amend --author="新作者名 <新邮箱地址>" --no-edit
此命令会将当前分支的最新提交替换为一个新的提交,并更新作者信息。
🔄 修改历史中的某个提交的提交者信息
如果需要修改的是历史中的某个提交(非最近一次),可以使用交互式变基(interactive rebase):
-
首先,确定要修改的提交之前的那个提交的哈希值(commit ID)。可以使用
git log
查看提交历史:git log
-
启动交互式变基,将
<commit_id>
替换为上一步中找到的提交的哈希值:git rebase -i <commit_id>
或者,如果你知道要回溯的提交数目,例如修改最近的第 3 个提交,可以使用:
git rebase -i HEAD~3
在打开的编辑器中,找到要修改的那一行,将其前面的
pick
改为edit
,然后保存并退出。-
Git 会暂停在你选择的提交上。此时,使用以下命令修改提交者信息:
git commit --amend --author="新作者名 <新邮箱地址>"
如果不想修改提交信息,可以添加
--no-edit
参数。 -
继续变基操作:
git rebase --continue
如果还有其他需要修改的提交,Git 会依次暂停,重复步骤 4 和 5,直到变基完成。
⚠️ 注意事项
在使用
git rebase
修改历史提交时,请确保你对这些提交的历史有足够的了解,尤其是在这些提交已经推送到远程仓库的情况下。修改已推送的提交历史可能会导致其他协作者的代码库出现问题。-
如果你已经将修改后的提交推送到远程仓库,可能需要使用强制推送:
git push --force
请谨慎使用强制推送,确保不会影响其他协作者的工作。
强制推送可能会受限制,请联系网络管理员解决,如果你有权限并且使用的是 gitlab 请跳转到本文结尾部分。
二、批量修改所有 Git commit 提交者信息的步骤:
-
设置用户信息:首先,你需要在本地仓库中设置用户信息。在命令行中输入以下命令:
git config --local user.name '你的名字' git config --local user.email '你的邮箱'
这将设置你的用户名和邮箱,这些信息将用于后续的 commit 信息。
开始 rebase:然后,你可以使用
git rebase -i --root --exec "git commit --amend --reset-author --no-edit"
来开始 rebase。这个命令会自动修改所有 commit 的提交者信息,并且不会打开编辑器来确认每个 commit(如果打开了,直接关掉即可)。-
处理冲突:如果在执行 rebase 时遇到冲突,例如有一些未被跟踪的工作树文件会被覆盖,你可以选择以下几种方法之一来解决这个问题:
-
提交或保存你当前的更改:在终端中运行
git stash
命令,它会将你的更改保存为临时存储,并将工作树重置为干净状态。然后你可以切换分支,并在需要的时候再应用这些更改。 -
清除未跟踪的文件:你可以使用
git clean -d -f
命令来清除未跟踪的文件。这个命令会删除工作树中所有未被跟踪的文件和目录。然后你可以再次尝试执行git rebase
命令。
-
提交或保存你当前的更改:在终端中运行
同步到远端仓库:完成所有修改后,你需要将修改后的信息同步到远端仓库。你可以使用
git push -f
命令进行强制同步。但是,请注意,这个操作会覆盖远端分支的提交历史,所以在操作之前,请确认你了解这个操作的风险。
请注意,这个动作将会导致所有的提交信息中的用户名信息被修改!
强制推送可能会受限制,请联系网络管理员解决,如果你有权限并且使用的是 gitlab 请跳转到本文结尾部分。
三、如何在 Git 仓库中将指定用户的信息替换成另一个用户的信息?
这个过程需要使用 git filter-branch
命令。请按照以下步骤操作:
-
备份你的仓库:
在进行任何操作之前,建议先备份你的仓库,以防出现意外情况。git clone --mirror <repository_url> backup-repo.git
-
进入你的仓库目录:
cd <your-repo-directory>
-
使用
git filter-branch
替换用户信息:
假设你想将用户old@example.com
替换为new@example.com
,并将用户名从Old Name
替换为New Name
,可以使用以下命令:git filter-branch --env-filter ' if [ "$GIT_COMMITTER_EMAIL" = "old@example.com" ] then GIT_COMMITTER_NAME="New Name" GIT_COMMITTER_EMAIL="new@example.com" fi if [ "$GIT_AUTHOR_EMAIL" = "old@example.com" ] then GIT_AUTHOR_NAME="New Name" GIT_AUTHOR_EMAIL="new@example.com" fi ' --tag-name-filter cat -- --branches --tags
友情提示: 指令中出现的 new/old@example.com
是假设的,请修改以符合实际情况!
出现下面的画面代表进入了处理程序,稍安勿躁静待佳音即可
出现下面的画面代表处理完成
-
强制推送更改到远程仓库:
由于历史记录被修改,需要强制推送更改到远程仓库。git push --force --tags origin 'refs/heads/*'
如果你看到这个画面,则代表修改完成!
-
清理旧的引用:
运行以下命令清理旧的引用:rm -rf .git/refs/original/ git reflog expire --expire=now --all git gc --prune=now
至此,批量替换指定提交者信息操作结束!
关于强制推送受限的解决方案(仅供参考)
如果出现下面 报错,说明你的这个分支 不被允许强制推送
解决办法:使用浏览器开启这个仓库 ,按图示路径找到的复选框勾选上即可!