4

Git配置多用户 & reset 和 revert

 1 year ago
source link: https://blackdn.github.io/2022/10/04/Git-Advance-2022/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

“纵使黑夜孤寂,白昼如焚。”

Git配置多用户 & reset 和 revert

国庆快乐,虽然要过半了
对于git操作,之前写过一篇文章:Git基本操作及连接Github
这篇文章属于是一个番外吧
因为遇到了这个问题还卡了我好一会
所以还是记录一下嗷

一个设备配置多个Github用户

其实一般情况下也不会有这个需求,但是因为公司的工作账号和个人账号是两个Github账号,然后为了方便摸鱼在工作之余折腾一些自己的东西(比如我的Github Page),所以还是想在一台机子上配置两个账户的。

生成ssh密钥

很多配置多个账户的文章都提到要大家生成两个ssh密钥,其实这是非必需的。重要的是在本地配置一个config配置文件(所以其实可以在配置文件中声明用同一个ssh密钥)但是为了方便起见,这里还是配置了连两个密钥。
配置密钥的具体步骤可以参见:配置SSH密钥

编辑配置文件

配置文件config是实现多用户的精髓所在,我们需要在~/.ssh/目录下新建一个config文件(Windows应该在/c/Users/you/.ssh/的目录下),文件包含内容如下:

# user1
Host user1.github.com    #纯纯自定义的内容
HostName github.com    #这个不用变,除非是gitLab等其他平台
PreferredAuthentications publickey    #认证方式,我们用ssh公钥
IdentityFile ~/.ssh/id_rsa    #这个对应账号下加入的ssh认证文件
User user1    # 自定义的名字

# user2
Host user2.github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519
User user2

其实需要变的只有IdentityFileHost的内容。在user1的github账号中我添加的ssh是id_rsa.pubuser2添加的是id_ed25519.pub,所以在IdentityFile中就要进行一个区分。

然后我们可以测试一下和github的连接。以往我们用的命令是:ssh -T [email protected],但是现在为了告诉github我们连接的是哪个账户,需要对@后面的内容进行一个修改,改成我们的自己配置的Host

~ ssh -T [email protected]
Hi user1! You've successfully authenticated, but...
~ ssh -T [email protected]   
Hi user2! You've successfully authenticated, but...

这样一来,基本就能在一台机子上成功区分两个用户了。
不过还有最后一个坑点

最后一个坑点在于,我们克隆项目代码的时候,不能直接输入复制来的ssh命令,同样要把@后面的内容进行一个改,以OkHttp为例:

#普通clone OkHttp:
[email protected]:square/okhttp.git
# 以user1去clone OkHttp:
[email protected]:square/okhttp.git
# 以user2去clone OkHttp:
[email protected]:square/okhttp.git

因为有些仓库设置了权限(private啥的),或者只有Organization里的账户允许提交仓库啥的(比如我的工作账号),所以还是要必要在一开始的时候明确使用的是哪个账号clone的。

此外,对于那些已经clone到本地的项目,再进行远程操作的时候可能会出现一些问题(比如push的时候会有权限问题啥的):

ERROR: Permission to user2/project.git denied to user1.
fatal: Could not read from remote repository.

这是由于git没有正确识别到当前仓库的用户所导致的,上面的情况就说明当前是user1,所以没有权限访问user2的仓库。有两个方法可以解决这个问题:

第一个方法是重新关联一次远程仓库。先解除关联,再重新关联。不过要注意的是重新关联的时候,要用我们config里的Host内容代替原来的ssh命令:

# 删除关联的远程仓库
git remote remove origin
# 添加关联远程仓库
git remote add origin [email protected]:user2/project.git

第二个方法就是手动修改本地仓库目录下.git/config中的url信息:

[remote "origin"]
    url = [email protected]:user2/project.git

Git用户配置

之前我们只有一个账号的时候,我们采用的是git的全局配置来设定我们当前的nameemail

$ git config --global --list
user.name=BlackDn
[email protected]
core.safecrlf=warn
core.autocrlf=input

而如今在多用户的情况下,虽然说可以不进行额外的配置,但这样会让我在这个设备上所有操作的nameemail都是这个全局设置的内容。我的同事小伙伴肯定会为这个叫BlackDn的人感到疑惑。
因此,如果有需要的话,我们可以为每个仓库设置自己的nameemail
首先来删除全局的配置:

git config --global --unset 'user.name'
git config --global --unset 'user.email'

然后进入到某个仓库的目录,为其单独配置:

git config user.name `user1`
git config user.email `[email protected]`

git reset 和 git revert

git reset

git reset侧重于版本切换,我们每次commit,在git看来都是一个新版本的发布,并会自动给我们生成一个版本号,可以用git loggit reflog查看(具体可见:Git基本操作及连接Github)。
我们可以用git reset 版本号的形式回到对应版本,也可以用git reset HEAD^回到上一个版本(HEAD^^就是回到上上个版本)

在使用git reset的时候,默认参数是--mixed,也就是说git reset --mixed HEAD^git reset HEAD^效果是一样的,它表示:撤销commit,并且撤销git add,但是我们所做的代码改动是会保留的。
此外,我们常用到--soft参数和--hard参数。
--soft表示:撤销commit,不撤销git add ,同时保留代码改动,相当于就是把commit的东西变成add状态;
--hard表示:撤销commit,撤销git add,并且删除代码改动,相当于直接回到了上一次commit完的状态,中间的修改都没啦。

不过很多时候,我们只是想修改一下commit的注释,这种情况我们不必用reset,可以用git commit --amend,执行该命令后会进入vim编辑器,修改第一行的注释后保存即可。

git revert

git revert本质还是一次commit提交,只不过它的提交内容和上次的commit内容相反,即“否定上一个提交的提交”。
上一个commit加了一行,那么revert就删一行;上一个commit加了个文件,那么revert就删这个文件,等等。

git reset类似,git revert 版本号git revert HEAD^等方式都是可以的。

git reset主要用于本地的回退操作,而git revert的设计初衷是为了更安全地撤销已经push的提交。毕竟git作为版本管理工具,很多时候是很多个人进行团队开发的。revert会在history中保留被撤销的commit,更利于团队交流协作。(当然如果不想让别人知道自己的错误代码还是可以用reset的嘿嘿)

  1. [如何在一台电脑上设置多个github账号 Dr. Xiaotao Shen](https://www.shenxt.info/post/2020-03-11-multi-github-in-one-pc/)
  2. 记一次git多用户提交失败的折腾经验

  3. Git基本操作及连接Github - WelcomeQwQ

  4. git commit之后,想撤销commit

  5. 面试官:说说你对Git Reset 和 Git Revert 的理解?区别?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK