写在前面
自己在本地使用多个 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