{"id":79524,"date":"2026-10-28T04:51:50","date_gmt":"2026-10-28T04:51:50","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=79524"},"modified":"2026-10-28T04:51:52","modified_gmt":"2026-10-28T04:51:52","slug":"complete-tutorial-use-two-github-accounts-on-one-mac-with-ssh","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/complete-tutorial-use-two-github-accounts-on-one-mac-with-ssh\/","title":{"rendered":"Complete Tutorial: Use Two GitHub Accounts on One Mac with SSH"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This tutorial explains how to configure two GitHub accounts on the same MacBook using separate SSH keys, without repeatedly switching accounts or breaking your existing Git configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;ll use your existing setup as the example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Account 1: Your existing GitHub account, using <code>~\/.ssh\/id_ed25519<\/code><\/li>\n\n\n\n<li>Account 2: <code>rajeshkumarin<\/code>, using <code>~\/.ssh\/id_ed25519_rajeshkumarin<\/code><\/li>\n\n\n\n<li>Operating system: macOS<\/li>\n\n\n\n<li>Terminal: Zsh<\/li>\n\n\n\n<li>Goal: Use both accounts for cloning, pulling, pushing, and committing code.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">1. Understand how it works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your MacBook<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One computer \u00b7 Two GitHub identities<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SSH Key 1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>~\/.ssh\/id_ed25519<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Account 1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SSH Key 2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>~\/.ssh\/id_ed25519_rajeshkumarin<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Account 2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SSH aliases select the correct key automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The key idea is that both accounts connect to <code>github.com<\/code>. Your local SSH configuration uses different aliases to choose the appropriate key.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Step 1 \u2014 Check your existing SSH keys<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open Terminal and run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ls -la ~\/.ssh<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Your files may look like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">~<span class=\"hljs-regexp\">\/.ssh\/<\/span>\n\u251c\u2500\u2500 config\n\u251c\u2500\u2500 id_ed25519\n\u251c\u2500\u2500 id_ed25519.pub\n\u251c\u2500\u2500 id_ed25519_rajeshkumarin\n\u2514\u2500\u2500 id_ed25519_rajeshkumarin.pub<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The private keys are the files without <code>.pub<\/code>. The <code>.pub<\/code> files are the public keys that you add to GitHub.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check whether both key files exist:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ls -l ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519*<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If your existing key has a different filename, keep that filename in the configuration rather than renaming or replacing it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Important: Never share or upload your private SSH keys. Only the public keys should be added to GitHub.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Step 2 \u2014 Generate a second key (only if needed)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You already have a key named <code>id_ed25519_rajeshkumarin<\/code>, so skip this step if that key is valid and you intend to use it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Otherwise, generate a new key:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ssh-keygen -t ed25519 \\\n  -C <span class=\"hljs-string\">\"second-email@example.com\"<\/span> \\\n  -f ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519_rajeshkumarin<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Replace <code>second-email@example.com<\/code> with the email associated with your second GitHub account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If prompted for a passphrase, using one is recommended. Store it securely.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Step 3 \u2014 Add the public key to the second GitHub account<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Copy the public key to your Mac clipboard:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">pbcopy &lt; ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519_rajeshkumarin.pub<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Next:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/images.openai.com\/static-rsc-4\/__GKKpvwUDx5QuPOl_YgICtRqmVNMAvwguxTfrPTL_wQ6QhzMDFdxKYtfxbiZDjbiGvLj0USThcfEIbpi_-vsMH0ET865JDlrribxER3aH-IycAvl-pVbkqNwhDaT1qCFuagAQiPHs5xDqtTgRZje7z-3al0Ltc-mIw31-YtIfg?purpose=inline\">GitHub\u306eSSH key\u4f5c\u6210\u3068\u8a2d\u5b9a\u65b9\u6cd5\uff5c\u304f\u307e<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">1. Open GitHub SSH settings<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go to <a href=\"https:\/\/github.com\/settings\/keys?utm_source=chatgpt.com\">GitHub \u2192 SSH and GPG keys<\/a>. Make sure you are logged in to the second account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/images.openai.com\/static-rsc-4\/DTIPxvD5K2Erkx0gWi_WNhL6aEIZDYUg5IAv6HokvmFyQocH_d4CqXy7X9w1HY47SFbzC2NTY11WOxroxJZvPjRf6qIa2dDb5j92gZYwCcH795gg9Ku_L38uy-oEeiAIGnh6pTVrX01U5L3t0qynZCtABqV186RpNisp_uyoUGs?purpose=inline\">1Password \u306b SSH \u63a5\u7d9a\u3082\u30b3\u30df\u30c3\u30c8\u7f72\u540d\u3082\u7ba1\u7406\u3057\u3066\u3082\u3089\u304a\u3046<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. Add the key<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Click New SSH key.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Title: <code>MacBook Account 2<\/code><\/li>\n\n\n\n<li>Key type: <code>Authentication Key<\/code><\/li>\n\n\n\n<li>Key: Paste the copied public key.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/images.openai.com\/static-rsc-4\/v-CdjO2O8a8_dANFFm1RPrYNfkPS6mTAq8Eawa79NluEBpCz58Upn6J4iFewUTfXGcDa9wiHRMUIzeaX7rcyA_J9uy-nNVBp0M0fa64dDoCxO9s2WJtJSoF4YSrRBx53QICECUVeEwPsSQdj2H7rXIb1NwLMN9Lhpt7ZQ5I6_C0?purpose=inline\">\u0e01\u0e32\u0e23 Setup Git \u0e41\u0e25\u0e30 GitHub \u0e43\u0e2b\u0e49\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e17\u0e33\u0e07\u0e32\u0e19\u0e23\u0e48\u0e27\u0e21\u0e01\u0e31\u0e1a\u0e17\u0e35\u0e21 | \ud83d\ude80 \u0e40\u0e2a\u0e49\u0e19\u0e17\u0e32\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e21\u0e2d\u0e23\u0e4c<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. Save the key<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Click Add SSH key and complete any verification requested by GitHub.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub permits the same public key to be used only once across accounts. Keep your first account&#8217;s existing key registered there, and register the second public key with the second account.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Step 4 \u2014 Configure SSH for both accounts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most important step. Your Mac needs to know which SSH key to use for each GitHub account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open your SSH configuration file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">vi ~<span class=\"hljs-regexp\">\/.ssh\/<\/span>config<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Replace the contents with the following configuration, assuming your first key is <code>id_ed25519<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># GitHub Account 1<\/span>\nHost github.com\n    HostName github.com\n    User git\n    IdentityFile ~\/.ssh\/id_ed25519\n    IdentitiesOnly yes\n    AddKeysToAgent yes\n    UseKeychain yes\n\n<span class=\"hljs-comment\"># GitHub Account 2<\/span>\nHost github-account2\n    HostName github.com\n    User git\n    IdentityFile ~\/.ssh\/id_ed25519_rajeshkumarin\n    IdentitiesOnly yes\n    AddKeysToAgent yes\n    UseKeychain yes<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Save the file in Vim:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Press <code>Esc<\/code>.<\/li>\n\n\n\n<li>Type <code>:wq<\/code>.<\/li>\n\n\n\n<li>Press <code>Enter<\/code>.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Understand the configuration<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Setting<\/th><th>Purpose<\/th><\/tr><tr><td><code>Host github.com<\/code><\/td><td>Alias for Account 1<\/td><\/tr><tr><td><code>Host github-account2<\/code><\/td><td>Alias for Account 2<\/td><\/tr><tr><td><code>HostName github.com<\/code><\/td><td>Actual GitHub server<\/td><\/tr><tr><td><code>IdentityFile<\/code><\/td><td>Private key to use<\/td><\/tr><tr><td><code>IdentitiesOnly yes<\/code><\/td><td>Prevents SSH from trying unrelated keys<\/td><\/tr><tr><td><code>AddKeysToAgent yes<\/code><\/td><td>Adds the key to the SSH agent<\/td><\/tr><tr><td><code>UseKeychain yes<\/code><\/td><td>Supports macOS Keychain integration<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Important: <code>github-account2<\/code> is a local alias, not a real hostname or GitHub username. Both aliases connect to <code>github.com<\/code>. This follows GitHub&#8217;s documented approach for selecting separate SSH keys. GitHub Docs+1<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Step 5 \u2014 Set correct SSH file permissions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">chmod 700 ~\/.ssh\nchmod 600 ~\/.ssh\/config\nchmod 600 ~\/.ssh\/id_ed25519\nchmod 600 ~\/.ssh\/id_ed25519_rajeshkumarin\nchmod 644 ~\/.ssh\/id_ed25519.pub\nchmod 644 ~\/.ssh\/id_ed25519_rajeshkumarin.pub<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These commands protect your private keys and configuration file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your first private key has a different filename, adjust the command accordingly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Step 6 \u2014 Add both keys to the SSH agent<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start the SSH agent:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">eval<\/span> <span class=\"hljs-string\">\"$(ssh-agent -s)\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add the first key:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ssh-add --apple-use-keychain ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add the second key:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ssh-add --apple-use-keychain ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519_rajeshkumarin<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check which keys are loaded:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ssh-add -l<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see fingerprints for your loaded keys.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you get <code>Could not open a connection to your authentication agent<\/code>, run the first command again before adding the keys.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Step 7 \u2014 Test both GitHub accounts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Test Account 1:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">-T<\/span> <span class=\"hljs-selector-tag\">git<\/span><span class=\"hljs-keyword\">@github<\/span>.com<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected response:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Hi YOUR_FIRST_USERNAME! You've successfully authenticated, but GitHub does not provide shell access.<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test Account 2:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">-T<\/span> <span class=\"hljs-selector-tag\">git<\/span><span class=\"hljs-keyword\">@github-account2<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected response:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Hi rajeshkumarin! You've successfully authenticated, but GitHub does not provide shell access.<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The greeting should identify the correct account for each command.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub&#8217;s SSH test may exit with status code 1 even when authentication succeeds, because GitHub does not provide interactive shell access. The greeting is the important part. GitHub Docs+1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the wrong account appears, or authentication fails, see the troubleshooting section below.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. Step 8 \u2014 Clone repositories using either account<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once authentication works, use the corresponding SSH alias when cloning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Account 1<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git <span class=\"hljs-keyword\">clone<\/span> git@github.com:OWNER\/REPOSITORY.git<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Uses <code>~\/.ssh\/id_ed25519<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Account 2 \u2014 rajeshkumarin<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git <span class=\"hljs-keyword\">clone<\/span> git@github-account2:rajeshkumarin\/REPOSITORY.git<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Uses <code>~\/.ssh\/id_ed25519_rajeshkumarin<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>OWNER<\/code> and <code>REPOSITORY<\/code> with the actual repository owner and name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, if your second account owns a repository called <code>my-laravel-app<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git <span class=\"hljs-keyword\">clone<\/span> git@github-account2:rajeshkumarin\/my-laravel-app.git<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For a private repository, the selected account must have permission to access it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. Step 9 \u2014 Configure an existing repository<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You don&#8217;t need to clone a repository again if it already exists on your Mac. Change its remote URL instead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, enter the repository directory:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">cd \/path\/to\/your\/repository<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check the current remote:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git remote -v<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If it should use Account 2, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git remote <span class=\"hljs-keyword\">set<\/span>-url origin git@github-account2:OWNER\/REPOSITORY.git<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify the change:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git remote -v<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see <code>github-account2<\/code> in the remote URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For Account 1, use <code>git@github.com:OWNER\/REPOSITORY.git<\/code> instead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This setting is stored in that repository&#8217;s <code>.git\/config<\/code>, so changing one repository&#8217;s remote won&#8217;t change the others.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Step 10 \u2014 Configure Git commit names and email addresses<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This step is separate from SSH authentication.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SSH decides which GitHub account authenticates when you push. Git&#8217;s <code>user.name<\/code> and <code>user.email<\/code> decide the author identity recorded in your commits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a repository belonging to Account 1:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">config<\/span> <span class=\"hljs-selector-tag\">user<\/span><span class=\"hljs-selector-class\">.name<\/span> \"<span class=\"hljs-selector-tag\">Your<\/span> <span class=\"hljs-selector-tag\">Name<\/span>\"\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">config<\/span> <span class=\"hljs-selector-tag\">user<\/span><span class=\"hljs-selector-class\">.email<\/span> \"<span class=\"hljs-selector-tag\">first-email<\/span><span class=\"hljs-keyword\">@example<\/span>.com\"<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For a repository belonging to Account 2:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">config<\/span> <span class=\"hljs-selector-tag\">user<\/span><span class=\"hljs-selector-class\">.name<\/span> \"<span class=\"hljs-selector-tag\">Rajesh<\/span> <span class=\"hljs-selector-tag\">Kumar<\/span>\"\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">config<\/span> <span class=\"hljs-selector-tag\">user<\/span><span class=\"hljs-selector-class\">.email<\/span> \"<span class=\"hljs-selector-tag\">second-email<\/span><span class=\"hljs-keyword\">@example<\/span>.com\"<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use the appropriate name and email for each account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These commands configure the identity only for the current repository because they omit <code>--global<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Verify the settings:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">config<\/span> <span class=\"hljs-selector-tag\">user<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">config<\/span> <span class=\"hljs-selector-tag\">user<\/span><span class=\"hljs-selector-class\">.email<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You can also inspect the configuration source:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git config --show-origin --<span class=\"hljs-keyword\">get<\/span> user.email<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For commits to appear as verified or linked to the intended GitHub profile, use an email associated with that account, or its GitHub-provided <code>noreply<\/code> email address.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">12. Step 11 \u2014 Push and pull using the correct account<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once the repository&#8217;s remote and commit identity are configured, normal Git commands work as usual.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git status\ngit add .\ngit commit -m <span class=\"hljs-string\">\"Update application\"<\/span>\ngit push origin main\ngit pull origin main<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You don&#8217;t need to specify the SSH key on every command. The remote alias selects the correct key automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Make sure <code>main<\/code> is the correct branch for your repository.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">13. Common problems and solutions<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Error<\/th><th>Likely cause<\/th><th>Solution<\/th><\/tr><tr><td><code>Could not resolve hostname rajeshkumarin<\/code><\/td><td>Username was used as the hostname<\/td><td>Set <code>HostName github.com<\/code> and connect using <code>git@github-account2<\/code><\/td><\/tr><tr><td><code>Permission denied (publickey)<\/code><\/td><td>Public key missing from GitHub, wrong key, or SSH configuration issue<\/td><td>Verify the public key, alias, and <code>IdentityFile<\/code><\/td><\/tr><tr><td>Wrong username in SSH greeting<\/td><td>Wrong key is being selected<\/td><td>Check the <code>Host<\/code> alias and <code>IdentityFile<\/code><\/td><\/tr><tr><td><code>Repository not found<\/code><\/td><td>Incorrect repository path or insufficient access<\/td><td>Verify the owner, repository name, and permissions<\/td><\/tr><tr><td><code>Permission denied<\/code> when pushing<\/td><td>Account lacks write access, or branch protection blocks the push<\/td><td>Check repository access and branch rules<\/td><\/tr><tr><td><code>Key is already in use<\/code><\/td><td>Same public key was added to another GitHub account<\/td><td>Generate a unique key for the second account<\/td><\/tr><tr><td><code>Bad configuration option: UseKeychain<\/code><\/td><td>SSH client does not support that option<\/td><td>Check the SSH client; on macOS, try adding <code>IgnoreUnknown UseKeychain<\/code> under the relevant host entry<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Debug an SSH connection<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If Account 2 still fails, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">-vT<\/span> <span class=\"hljs-selector-tag\">git<\/span><span class=\"hljs-keyword\">@github-account2<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Look for a line similar to:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Offering public key: <span class=\"hljs-regexp\">\/Users\/<\/span>rajesh\/.ssh\/id_ed25519_rajeshkumarin<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That confirms which key SSH is attempting to use. If the wrong key is offered, check the SSH configuration. If the right key is offered but rejected, verify that its matching public key is registered with the correct GitHub account.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">14. Quick reference: All important commands<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">List SSH keys Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ls -la ~\/.ssh<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Edit SSH config Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vi ~\/.ssh\/config<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Load Account 1 key Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ssh-add &#8211;apple-use-keychain ~\/.ssh\/id_ed25519<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Load Account 2 key Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ssh-add &#8211;apple-use-keychain ~\/.ssh\/id_ed25519_rajeshkumarin<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Test Account 1 Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ssh -T git@github.com<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Test Account 2 Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ssh -T git@github-account2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clone Account 1 repo Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">git clone git@github.com:OWNER\/REPOSITORY.git<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clone Account 2 repo Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">git clone git@github-account2:OWNER\/REPOSITORY.git<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check repository remote Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">git remote -v<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check commit email Copy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">git config user.email<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Final checklist<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Setup verification<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">0 of 6Both SSH private keys exist on my Mac.Each public key is added to the correct GitHub account.The SSH config uses HostName github.com for both aliases.Both SSH authentication tests greet the correct usernames.Each repository uses the correct SSH remote URL.Each repository has the correct Git commit name and email.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For official reference, see <a href=\"https:\/\/docs.github.com\/en\/account-and-profile\/how-tos\/account-management\/managing-multiple-accounts?utm_source=chatgpt.com\">GitHub&#8217;s guide to managing multiple accounts<\/a> and <a href=\"https:\/\/docs.github.com\/en\/authentication\/connecting-to-github-with-ssh\/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?utm_source=chatgpt.com\">generating and adding SSH keys on macOS<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The key takeaway: Keep your existing SSH key for Account 1, use <code>id_ed25519_rajeshkumarin<\/code> for Account 2, and use <code>github-account2<\/code> in repository URLs whenever you want Git to authenticate as <code>rajeshkumarin<\/code>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial explains how to configure two GitHub accounts on the same MacBook using separate SSH keys, without repeatedly switching accounts or breaking your existing Git configuration&#8230;. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-79524","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=79524"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79524\/revisions"}],"predecessor-version":[{"id":79525,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79524\/revisions\/79525"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=79524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=79524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=79524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}