git push 问题:committer 'xxx (x)' does not match your user account

写在前面

自己在本地使用多个 git 帐号,或者多个人使用一个机器部署多个 git 帐号的时候,经常会有一些冲突,今天就遇到了一个。

问题描述

我们多个人共同使用一个机器,昨天改配置的时候,不小心将我的用户名和邮箱设置成了全局配置,结果今天别人在用的时候,就不能push了,提示如下错误信息:

committer 'pearl (pearl@myemail.com)' does not match your user account.
the following user name and email address is currently registered.
other (other@heremail.com)

就这个问题百度 google 查了很久,重新设置了 ssh key 也还不行,仍然一直报错,根据 git 的报错提示执行

git commit --amend --reset-author

还是不能解决问题,后来和朋友一起研究他的错误提示信息,显示的是 committer 不正确,然后 git log 查看日志,发现 log 里面有用我的用户名提交的信息,所以决定回滚看看,于是执行

git reset --hard logID(我提交之前的log ID)

再重新设置 ssh key,再 git push 就好了。

问题总结

这个错误提示的原因是由于使用的git仓库是基于ssh协议的(非https),需要密钥对并建立连接。执行 git commit 的时候本地提交不受 ssh 协议限定,也不会检测用户权限,但是提交信息会以 git config user.name 为名,所以在提交日志中出现了非法权限提交。

  • git pull:只需要建立ssh连接即可(ssh-add),所以git pull正常;

  • git commit: 本地提交不受 ssh 协议限定,也不会检测用户权限,但是提交信息会以 git config user.name 为名

  • git push:需要建立ssh连接,并且会检测用户在远程设置中设否具有权限(包括每一次提交者的权限),如果有权限则提交,否则显示权限

参考文档:传送门

设置多个 ssh key

  • 不要设置全局的用户名和邮箱,在对应的 git 项目下设置用户信息

    git config user.name "your_username"
    git config user.email "your_email@example.com"
  • 生成 ssh key

    ssh-keygen -t rsa -C "your_email@example.com"
    
    # 看到如下提示信息后,输入 ssh key 的文件名,如 id_rsa_username
    Generating public/private rsa key pair.
    Enter file in which to save the key (/your_home_path/.ssh/id_rsa):id_rsa_username

    然后可以在当前目录下看到两个新生成的文件,一个 id_rsa_username,一个 id_rsa_username.pub。

  • 将 ssh key 添加到你的 git 项目中(如 github)

    cat id_rsa_username.pub

    粘贴上面内容到 git 项目中的 ssh key 设置的地方即可

  • 将新生成的 key 添加到 ssh-agent 中

    eval "$(ssh-agent -s)"
    Agent pid 59566
    
    cp id_rsa_username ~/.ssh/
    cp id_rsa_username.pub ~/.ssh/
    ssh-add ~/.ssh/id_rsa
  • 设置配置文件,不用每次都添加

    cd ~/.ssh
    vim config
    
    # 该文件用于配置私钥对应的服务器
    # Default github user(first@mail.com)
    Host github.com
    HostName github.com
    User username1
    IdentityFile ~/.ssh/id_rsa_username1
    
    # second user(second@mail.com)
    # 建一个github别名,新建的帐号使用这个别名做克隆和更新
    Host github2
    HostName github.com
    User username2
    IdentityFile ~/.ssh/id_rsa_username2

附 Git 常用命令(参考:git常用命令速查表)

查看某个git命令的帮助文档
git help [command]
查看各个文件的状态
git status
clone一个仓库
git clone [url]
初始化一个仓库
git init
拉取
git pull
添加
git add [file]
提交
git commit -m "commit info"
删除文件(从暂存区和工作区中删除)
git rm [file]
强行删除修改后文件(从暂存区和工作区中删除)
git rm -f [file]
删除文件(从暂存区中删除,也就是在commit 之前撤销提交)
git rm --cached [file]
移动文件或修改文件名
git mv [old-name] [new-name]
查看本地分支信息
git branch
查看远程分支信息
git branch -r
查看所有分支信息(包括本地和远程分支)
git branch -a
创建分支
git branch [branch_name]
切换分支
git checkout [branch_name]
合并分支到当前分支
git maege [branch_name]
删除已经被合并的分支
git branch -d [branch-name]
删除还未被合并的分支
git branch -D [branch_name]
合并代码后还未提交,此时希望撤销合并
git reset --hard HEAD
git reset --hard log_id(回滚到某一指定log位置)
查看提交日志
git log
查看提交日志及其对应的 diff
git log -p
查看提交日志及其涉及的文件,以及这些文件删除/添加了多少行
git log --stat
显示暂存区的文件的 diff
git diff --cached
显示未放到暂存区的文件的 diff
git diff [file]
将 diff 输出到制定文件中
git diff > diff.txt
查看当前分支与某个分支 diff
git diff [branch_name]
查看当前工作目录下的某个目录与某个分支的差别
修改最后一次提交
git commit --amend
撤销已暂存的文件
git reset HEAD [file]
撤销对文件的修改
git checkout -- [file_name]
查看当前配置的远程仓库
git remote
查看当前配置的远程仓库和对应的地址
git remote -v
添加远程仓库
git remote add [remote_name] [url]
从远程仓库抓去数据
git fetch [remote_name] [branch_name]
推送数据到远程仓库
git push [remote_name] [branch_name]
查看某个远程仓库信息
git remote show [remote_name]
重命名远程仓库
git remote rename [old_name] [new_name]
删除某个远程仓库
git remote rm [remote_name]
显示已有的标签
git tag
搜索特定tag
git tag -l [keyword]
创建轻量级标签
git tag [tag_name]
创建含附注标签
git tag -a [tag_name] -m [msg]
给之前的某个提交加标签
git tag -a [tag_name] [hash]
查看某个标签的信息
git show [tag_name]
将标签推送到远程仓库
git push [remote_name] [tag_name]
将所有本地标签一次推送到远程仓库
git push [remote_name] --tags
将分支b衍合入分支a
git checkout b
git rebase a
切换到另一个分支前,你并不想把当前分支上的修改提交的话,可以使用储藏功能
git stash
显示所有储藏
git stash list
应用你的储藏
git stash apply [stash_name]
还原储藏
git stash pop
    原文作者:Pearl
    原文地址: https://segmentfault.com/a/1190000008739604
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞