If you have a personal account and a work account, then it gets more tedious to use both on the same computer. Here is a step-by-step guide on how to set them up.

Step 1. Generate SSH key for each account

Refer to Github’s instructions on how to generate your SSH key and adding it to Github.

In essence, you want to generate for all your accounts and specify where to keep the keys. We name it personal and work.

ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/personal
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/work

The corresponding public keys ( and will be created.

You will also want ssh-agent to save your passphrase:

eval "$(ssh-agent -s)"
ssh-add -K ~/.ssh/personal
ssh-add -K ~/.ssh/work

Step 2. SSH config

In your ~/.ssh/config file:

Host work
   AddKeysToAgent yes
   UseKeychain yes
   IdentityFile ~/.ssh/work

Host personal
   AddKeysToAgent yes
   UseKeychain yes
   IdentityFile ~/.ssh/personal

Test that the right github user is being connected to with ssh -T [email protected] and ssh -T [email protected].

Step 3. Git usage

With that set up, you need to change the remotes URL. Instead of, you have to replace with either work or personal.

Your personal ones look like this when you run git remote -v:

origin	[email protected]:casualhacker/awesome_repo.git (fetch)
origin	[email protected]:casualhacker/awesome_repo.git (push)

Similarly, for work ones:

origin	[email protected]:hardworker/awesome_repo.git (fetch)
origin	[email protected]:hardworker/awesome_repo.git (push)

If it is not, you will want to change it with eg. git remote set-url [email protected]:hardworker/awesome_repo.git. Of course, git clone has to use the same URL.

Step 4. Customize gitconfig

Gitconfigs can have different “levels” (system, global, local), and they will overide previous level.

Assuming the “personal” account is the default, we can set in ~/.gitconfig (the global level), and then specify an alternate gitconfig for “work”. In it, we can customize the “email” and “name” that are used in a commit.

# Personal account as default
  email = [email protected]
  name = John Doe

# Work account in ~/work
[includeIf "gitdir:~/work/**"]
  path = "~/work/.gitconfig"

As you can see in the includeIf section, we specify a path to another gitconfig. This gitconfig will only be used if the repo is in the “work” directory (or any nested subdirectories).

In the “work” gitconfig:

# Work account
  email = [email protected]
  name = John Doe

You can check by running git config in different places.




Back to Home