Git Credential Manager
Git for Windows を使った場合の資格情報の保存
git pull などリモートとの接続をすると初回接続時には以下のように CredentialHelperSelector が表示されます。

manager を選択すると GitHub への接続ウィンドウが開きます。
ここで Sign in with your browser ボタンをクリックします。

すると、ブラウザが開きます。
もしブラウザで GitHub にログインしていなければ以下のようにログイン画面が表示されます。

ログインが完了するか、すでにログイン済であればブラウザは真っ暗な画面になります。
場合によっては以下のようにもう一度 CredentialHelperSelector が表示されるかもしれません。もう一度 manager を選択しましょう。

すると、コンソールの方では git pull が成功しているはずです。
これ以降は、GitHub の方でアカウント情報を変更したり、認証の期間が切れるまではログインを求められることはありません。
では、どうしてログインが求められなくなるのでしょうか?
資格情報として保存されている
Git に GitHub の認証情報をキャッシュする - GitHub Docs
上記リンクは GitHub から出ている認証情報、つまりログインした情報を保存する方法についてのガイドです。
そこで、Git Credential Manager(GCM) を使うというガイドが示されています。
実は最初に行った CredentialHelperSelector から GitHub へのログインという一連の操作は、内部では Git Credential Manager を利用しています。
保存されている資格情報を確認する
上記のリンクにある通り Windows の [コントロール パネル] の [ユーザー アカウント] > [資格情報マネージャー] に資格情報、つまりパスワードやアクセストークン情報が保存されています。



エントリを開くと以下の画像のように「編集」と「削除」が可能です。

この認証が Git Credential Manager から自動的に読み込まれるため、GitHub へのサインインが不要になっています。
Visual Studio の場合
Visual Studio の Git 機能を使っている場合も同様に Git Credential Manager が利用されています。
ソース管理の設定から「資格情報ヘルパー」の確認ができますが、そこに GCM が選択されていれば利用されているということです。

GitHub への直接ログインを促される場合
設定によっては git pull などのリモート操作の際に以下のような入力を促される場合があります。
もちろん、これでログインすることも可能ですが自分でアクセストークンを取得するなど手間がかかります。
どうして Git Credential Manager が利用されないかの確認をすべきです。
確認
❯ git config --global credential.helper
❯ git config --global credential.helperselector.selected
いずれかの結果に helper-selector または manager が入っていない可能性があります。
gitconfig への設定
gitconfig に以下の設定をします。もしすでに [credential] セクションの設定があればそれは消して問題ありません。
[credential]
helper = helper-selector
そこでもう一度 git pull 等をすると以下が表示されます。

そうすると gitconfig は以下のように増えています。CredentialHelperSelector の結果が manager になり、今後は Git Credential Manager が使われるようになったということですね。
[credential]
helper = helper-selector
[credential "helperselector"]
selected = manager
ちなみにこれは、以下のように 1 行にまとまった設定にすることも可能です。
[credential]
helper = manager
ただし、Git for Windows のグローバルの gitconfig 設定で helper-selector の設定が残っていると、そちらが優先して参照されるので、いずれにしろ helper-selector が出てしまうかもしれません。
例えば %USERPROFILE%\.gitconfig には helper = manager が直接書かれていても、Git for Windows のインストールフォルダにある gitconfig に helper = helper-selector の設定があればそちらが優先されます。
CredentialHelperSelector のダイアログが頻繁に出る場合の対処
いくつかやり方はありますが、一つの方法を示します。
Git for Windows の gitconfig の場所を以下のコマンドで調査します。インストールフォルダが分かれば直接開いてもらっても大丈夫です。
❯ git config --show-origin --get-all credential.helper
その場所にある gitconfig を開き、credential に関する設定があることを確認します。
続いて %USERPROFILE%\.gitconfig の credential の設定も確認します。
両方に存在する、またはどちらかに無いことが確認できたら、両方のファイルの credential の設定を以下のみにします。
[credential]
helper = manager
どちらかのファイルだけを上記にし、片方は credential の設定を削除する方法でも良いのですが、今回は一例として両方を残すようにしています。(場合によっては %USERPROFILE%\.gitconfig は他の Git を使うアプリでも参照されるため)
Visual Studio の Git 設定
Visual Studio はマシンに Git for Windows がインストールされていなくても Git を利用することができます。
つまり、Visual Studio 自体が Git を持っているということです。
以下のように Git の設定情報を見ると MinGit というものが使われていることが分かります。

では、その Git はどこにあるのでしょうか?
git.exe
Visual Studio のインストールフォルダによりますが、C:\Program Files にインストールしている場合は以下にあります。
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe
この git は PATH には入っていないため、このフォルダのものを直接使うしかありません。(使う必要はまったくありませんが)
gitconfig
続いて gitconfig です。場所と内容は以下です。
[core]
symlinks = false
autocrlf = true
[color]
interactive = true
ui = auto
[pack]
packSizeLimit = 2g
[help]
format = html
[http]
sslCAinfo = %(prefix)/etc/ssl/certs/ca-bundle.crt
[diff "astextplain"]
textconv = astextplain
[rebase]
autosquash = true
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[credential]
helper = manager
[credential "https://dev.azure.com"]
usehttppath = true
[include]
; include Git for Windows' system config in order
; to inherit settings like `core.autocrlf`
path = C:/Program Files (x86)/Git/etc/gitconfig
path = C:/Program Files/Git/etc/gitconfig
上記を見て分かる通り、helper = manager となっており、Visual Studio のオプション画面で見た GCM の設定通り Git Credential Manager が選択されていることが分かります。
- 検索ワード
- 「Git CredentialHelperSelector」
- 「Git 認証情報 管理」
- 「visual studio gitconfig」