VS Codeでcommand+D(⌘+D)で文字選択しすぎてしまったとき戻る方法

エディタで⌘+Dで単語選択するけど、たとえば下に5つある同一単語のうち4つまでを選択したいというと場面がたまにある。でも⌘+D押しすぎてしまって、5つ全部選択してしまった〜みたいなことが起こっていて地味に困っていた。

カーソル操作のUndoをやりたい

自分は主にVSCodeを使っているのだけど、VSCodeではcommand+U(⌘+U)で戻れるらしい!

Image from Gyazo

cursorUndo 生えている

Image from Gyazo

戻れて便利

あとこのコマンドは最初はAtomのコミュニティIssueで発見したので、たぶんAtomでもイケるはず。というかVS CodeAtomキーバインドの設定入れてた気がするからVSCodeでも使えているだけかもしれない。

⌘+Uで戻れないっていう人は⌘+Shift+Pでコマンドパレット開いて、キーバインド設定行って、↑のsoftUndoを探せば設定できそうな気がしている。


一つ便利になってよかった、こんなことを知らないのは自分くらいだと思う。

React Hooks(proposal)の予習をしたので自分用のメモをさらす

Hooksのalphaがきてやいのやいの言ってるので自分も追っておきますかということで予習。

この記事はReact v16.7.0-alpha時点の仕様と学習メモなので、Stableリリースされた時点でこの記事を参照にするのはよくないです。おそらくAPI変更が行われるはずなので。

ここではこの概要ページ以外のところに書かれているTipsとか詳細挙動とかFAQとかを中心にまとめて書いていく。基本的なことは概要ページで十分把握できると思う。

このエントリのモチベーションとしてはReactHooksの公式ガイドがいまのところ

  • 概要はこうです
  • それでは詳しくみていきましょう
  • 経験豊富な開発者はこう思うでしょう、これについては後述します
  • ここではこう書いていますが、これについてはFAQを参照してください
  • それではAPIリファレンスです、どうぞ
    • だがAPIリファレンスに具体的なことはあまり書いていない

という流れで、全部読まないと体系的に理解できない&情報があっちこっちに偏在しているという状態。

なので覚えておかないとあとあとハマりそうなことはこうして書いてリンク貼っておかないとわからなくなりそう。そういうモチベーションで書いている。

そういうわけであとあと忘れそうなことだけを書く。自分用のFAQともいう。あとコードブロックはほとんど公式ドキュメントからの引用。


useState

setHogeを使うときの挙動

classコンポーネントthis.setState()と違って、ステートはマージされるのではなくて置き換えになる。

useStateは浅く疎結に。あらゆるプロパティを1個にまとめないほうがよい

マージではなく置き換えになるので、ひとつ値が変わるたびにprevStateとマージする必要がでる。そもそも1個にまとめなかったらそんなことをしなくてもよいパターンって結構あるよねということらしい。

カスタムフックに置き換えたりするときも値のマージとかやってないから抽出が容易でよかったですねってなるらしい。

useEffect

どう便利?

  • classコンポーネント
    • componentDidMount,componentDidUpdateの2箇所に同一のコードを書く必要が出るパターンがある
    • ロジックを一箇所にまとめたい欲求がでてくる
    • Reactコンポーネントのバグ要因のひとつはcomponentDidUpdateでの適切な処理をミスることでもある
  • Effect Hook
    • ロジックをエフェクト1箇所にまとめられる
    • ブロッキングが起こらない
    • 基本的に毎レンダリング後に実行される
    • クリーンナップ処理ができる

ブロッキング起こらない

classコンポーネントだとcomponentDidMount,componentDidUpdateで副作用処理してると画面の更新をブロッキングするけど、useEffectはブロッキングしないらしい。

クリーンナップ処理

  • useEffectで関数を返すと、クリーンナップ実行時にその関数を実行してくれる
    • クリーンナップはいつ起こる?
      • 2度目のEffect時
        • useEffect()が実行されるとき前回のuseEffect()があれば、まず前回エフェクトのクリーンナップが行われる
          • useEffectレンダリング毎に異なるものが使用されているのはこのため
      • コンポーネントのアンマウント時にも実行される
function FriendStatus(props) {
  // ...
  useEffect(() => {
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });

useEffect内でリターンした関数がクリーンナップ時に実行される

useEffectのパフォーマンス最適化

基本的に毎レンダリングごとにエフェクトは実行される。でも毎回発火するのは困るとかパフォーマンスがよくないとかそういうのが起こってくる。

classコンポーネントcomponentDidUpdateをこう書いていたものが

componentDidUpdate(prevProps, prevState) {
  if (prevState.count !== this.state.count) {
    document.title = `You clicked ${this.state.count} times`;
  }
}

こうなる

useEffect(() => {
  document.title = `You clicked ${count} times`;
}, [count]); // Only re-run the effect if count changes

エフェクトを1回だけ実行したいなら空の配列をわたす

useEffect(() => {
  document.title = `You clicked ${count} times`;
}, []);

Hooksのルール

reactjs.org

ここを読む

  • トップレベルでの呼び出しのみ
  • React Functionsからの呼び出しのみ

という基本ルールがある

ReactはuseStateによる複数のステートをどう認識しているのか

Hooksが呼び出された順番に依存して認識している

条件分岐

useEffectの条件分岐をしたい場合はuseEffect内でif文

 useEffect(function persistForm() {
    // 👍 We're not breaking the first rule anymore
    if (name !== '') {
      localStorage.setItem('formData', name);
    }
  });

ifブロックの中でuseEffectしてはいけない

ifブロックのなかにuseEffectを入れて条件によってuseEffectの実行が歯抜けになったりすると、Reactは困ってしまう。

なぜなら前述したとおりReactはHooksの呼び出された順番に依存して認識しているので、歯抜けになると順番が破綻してバグってしまう。

これらルールを守っていくには

eslintのルールプラグインが提供されているのでこれを使うと安心安全

www.npmjs.com

インラインコールバックで再レンダリングが起こる問題を防ぐには

classコンポーネントthis.onClick = this.onClick.bind(this)として回避していたようなやつをHooksではどうやるか。

useCallbackuseReducerを使う。

useCallback

この形式

function HelloButton(props) {
  const handleClick = useCallback(()=> console.log('hello'), [])

  return (
    <button onClick={handleClick}>Greeting</button>
  );
}

useReducer

この形式

function AddButton(props) {
  const [todos, dispatch] = useReducer(todosReducer);

  function handleClick() {
    dispatch({ type: 'add', text: 'hello' });
  }

  return (
    <button onClick={handleClick}>Add todo</button>
  );
}

React的にはネストが深いコンポーネントにコールバックをバケツリレーしなくてはいけない場合は、useContextを使ってdispach関数を子コンポーネントで扱えるようにするパターンがグッドだよねという雰囲気を感じる(https://reactjs.org/docs/hooks-faq.html#how-to-avoid-passing-callbacks-down)。

そのほか「〜するべき?」「どうすれば〜できる?」などの疑問

reactjs.org

身も蓋もないけどほかはだいたいFAQ読むとだいたい書かれている。

結構想定されるQuestionがしっかりカバーされている印象。

ただAPIの使い方や挙動を知った上でないと理解できないものがほとんどなので、そういう意味でも当エントリの上述部分を把握しておくとFAQが読みやすくなると思っている。


なんだこの雑なエントリは!

VS Codeでjsx,tsx書いてるとformatOnSave(保存時にフォーマットするオプション)が効かない問題

現象

Prettier走ってほしいのに、React書いててファイルがjsxあるいはtsxだとなぜか効かなくて困った。

原因はデフォルトでformatOnSavefalseにしていて、言語ごとにtrueにしていたからだった。

解決方法

VS Codesettings.jsonでこう書いていたのが原因。

// Set the default formatOnSave
    "editor.formatOnSave": false,
    // Enable per-language basis by scoping for Prettier
    "[javascript]": {
        "editor.formatOnSave": true
    },
    "[typescript]": {
        "editor.formatOnSave": true
    }

基本的にfalseにしておいて、言語ごとにスコープ切ってtrueにしている。こうしているのには理由があって、フォーマッタが保存時に走ってほしくないファイルだってあるから……。

そういうわけでjsx,tsxでも効くように設定を足す。

// Set the default formatOnSave
    "editor.formatOnSave": false,
    // Enable per-language basis by scoping for Prettier
    "[javascript]": {
        "editor.formatOnSave": true
    },
    "[typescript]": {
        "editor.formatOnSave": true
    },
    "[javascriptreact]": {
        "editor.formatOnSave": true
    },
    "[typescriptreact]": {
        "editor.formatOnSave": true
    }

javascriptreact,typescriptreactというのを足す。

なんでこんなことになっているのかは不明、jsxtsxjavascripttypescriptに含めておいてほしい…。

fish-nvmだけ使ってたらenv: node: No such file or directoryと怒られた

気づくまで

fishシェル環境にするついでにnodebrew使うのをやめてnvmに移行した。nvmはそのままでは使えないので自分はfish-nvmを使っていた。

ふとしたときからVSCodeのGit連携機能が使えなくなってしまったり、ターミナルでwhich nodeとかやってもenv: node: No such file or directoryって言われるようになっているのに気づいた。

ググるとどうやらPATHに問題があるみたいな雰囲気があったけどPATHいじってないし困ってしまった。

原因

グローバルのNodeバイナリを消したせいだった

少し前にhomebrewで入れているyarnの挙動がおかしかったので一度アンインストールして再インストールしていた。Yarnは実はNodeを依存パッケージとして一緒にインストールするので、一緒にNodeもアンインストールした。

「nvmで管理するしグローバルNodeいらんやろ、ついでに消しとこ」

と思って消したのだった。

Yarnのインストールガイドには「nvmとか使うならNode一緒に入れなくていいから--without-nodeを使う」って書いてあるので、

$ brew install yarn --without-node

再インストール時にはこれでグローバルNodeバイナリはナシにしたのだった。

fish-nvmはセッション開始時にnvmのNodeバイナリを読み込まない

fishでnvmを素直に使うとターミナルの開始に1〜3秒位遅延が発生するらしい。だからfish-nvmという存在があってこいつがよしなにしてくれているのだけど、仕様として「セッション開始時にnvmの抱えてるNodeバイナリを読み込まない」っていう挙動をする。

シェルのこととnvmの設計に詳しくないのでなんでfishでnvm使うと遅くなるのかわからないけど、とにかくそういうことらしい(nvm側の問題らしい)。

グローバルのNodeが消失したせいでセッション開始時に読み込めるNodeがいなくなったので、そりゃ色々と動かなくなるわな……というはなしだった。

グローバルのNodeバイナリを消した途端色々壊れてしまったというか、いままでグローバルにNodeバイナリがいたから運良く動いていたとも言える……。

グローバルにNode入れ直した

homebrewでNodeバイナリ入れ直したらとりあえず直った。Nodeバイナリ入れると/usr/local/bin/nodeが入るので元通り。

シェル起動してwhich nodeした段階では/usr/local/bin/nodeが返ってきて、そのあとnode -vするとnvmのdefaultのnodeバージョンが返ってくる。もう1回which nodeすると/User/<username>/.nvm/versions/node/<version>/bin/nodeが返るように戻った。

fish-nvmのREADME

本件の回避策としては、そもそもfish-nvmを使わず遅延問題を代償してbassで直接nvmを毎セッションごとに起こすほうが書かれている。けど、Nodeのグローバル入れ直す前に自分の環境でこれやっても、結局bassの処理のほうがあとからされるので結局解決しなかった。(なぜなのか)

あとfish-nvmのREADMEに書かれているこの方法

Another common scenario is if you need to have the binary of the node or package available. For example if you are vim user, some plugins need access to the node binary. Since we only source nvm when we use one of the alias, you will probably get an error saying that node isn't available.

For example to create a binary for node we could create a file under /usr/local/bin

touch /usr/local/bin/node Open that file on your editor and paste the following:

! /usr/bin/env fish

__nvm_run "node" $argv Make that file executable:

chmod +x /usr/local/bin/node Test it

which node To simplify this process there's another helper function nvm_alias_command

If you run nvm_alias_command without any arguments it will create the alias binaries provided by default by fish-nvm: npm, node, npx, yarn

ここの部分も回避策の一種だと思うのだけど、なぜか自分の環境ではうまく動かなかった(なぜかシェルが起動しなくなった、なぜなのか)


fmnというnvmライクなfish専用のnodeのバージョンマネージャもある。fish1本でやっていくならこれでいいんだけど、自分は諸事情でzshbashも使うので、普段はfishだけどfmnに依存するのはベターではない……fish-nvmを使う必要がある。

なんだかスッキリ解決してないけど、とりあえずもとに戻ったのでヨシということにする(グローバルのNodeホントは捨てたい)

Pixelaを使って生存記録をつけている

Pixelaというグッドなウェブサービスがある。

pixe.la

GitHubの草と同様のコントリビューショングラフを作れるサービス。ユーザ登録からグラフの作成、グラフに草を生やすまで全部cliで完結できていい。

基本的に草のグラフは日々の継続の可視化するために使われるはずで、どうやら世の中の人は筋トレ習慣とかを記録したりしているらしい。

PixelaはたしかリリースされてTwitterで話題になってるのを見てすぐ登録した。

生存記録をつけている

https://pixe.la/v1/users/hitonatsu/graphs/alive

僕は筋トレはグラフをつけるほど毎日ガチでやっていない。筋トレ記録のような毎日継続してかつ記録をつけたいことって案外ないなと思っていたのだけど、なにかないかと考えてたら唯一記録をつけたいものがあって、それが生存記録だった。

僕たちは毎日生きている以上この世に生をコントリビュートしているはずなので、これを記録していきたいと思ってつけている(なんで生存記録をつけるモチベーションがあるのかについては日記のほうに書いた)。

生存報告の仕組み

Pixelaの公式にiOS12のショートカット使うと便利かもって書いてあるので、マネしてショートカットを作って毎朝起きたら通知センターからボタンを押している。

f:id:hitonatsu:20181101163752p:plain
長くてごめん

PixelaへのPOST成功したらSiriになんかランダムで喋ってもらえるようにしている。もうちょいフレーズを足したいけどあんまり思いつかないのでいい感じの一日を生きていきましょうフレーズを募集しております。

ボタン押すのめんどくさいから「Hey,Siri. 生存」っていうと生存報告できるようにもしている。でもiOSのショートカットをSiri経由で頼むと、ボタン押すときよりもなぜか妙に時間がかかってしまう。だから現状は素朴にボタンを押す運用になってしまっている。改善されてほしい。

ホントはスマートウォッチとかフィットネスバンドで当日の何時に心拍数を検知したらiftttに飛ばして〜みたいなことをするのが1番なんだろうけど、自分はこの手のデバイスを持ってないのでできない…。この手のデバイス欲しいですねという感情はある。お金がない。

iOSショートカットはいまは正直トリガーが非常に不便で、【家の位置情報+充電中になったら】というような条件でトリガーできたらいいんだけど現状できない。Siriに頼むか素朴にボタン押すかしか現状作ったショートカットを発火できないのでこういった牧歌的な運用になってしまっている。

Webサイトにグラフを表示する

この生存状況グラフを日記のほうのブログのヘッダーに表示させている。これによって訪れた人が「筆者がまだ生きているのかそれとも故人のブログなのか」の判別ができるようにしている。

ただ表示させるまでに紆余曲折を経てしまった。

紆余曲折

PixelaはSVGでこのグラフを描画していてそれを提供してくれている。どうやってWebサイトに貼ろうかと思って、最初にFetchAPIで素朴に叩いてDOMに挿入しようとしたけど、当時はcorsの問題があってFetchできなかった(これはPixelaリリース当初で今はcorsでも取れるようになっている…GitHubのカンバンみて気づいた)

あと当時はcorsで引っかかったけど仮にそもそもfetchで取れてもSVGはレスポンシブにするのめんどくさいんだよな〜ってなっていた。とりあえずシュッとブログに貼ってみたかったので最初はHTMLのirameタグで牧歌的に貼り付けていた。iframeでSVGを描画すると中の<g>タグにアクセスできないからレスポンシブにできない(やろうと思えばできるけどダルい)のでPCでのみ表示させていた。

レスポンシブでSVGなら簡単に画像だよな〜ってことで画像で欲しかったから自分でFirebase Cloud FunctionsでPuppeteerを動かしてPixelaのSVG部分をキャプチャして、せっかくだからFirebase Storageで配信するかと思って途中まで手を動かしていた。

で、途中でなんとなくPixelaのカンバン覗いてみたらリリース当初より少しずつアップデートがされていて、ボヤ〜っと考えてたらふと『これもしかしてそもそも直接<img src="">で取れるんじゃない?』って思ってやったらできた。

PixelaのグラフAPI<body>タグなしで直接SVGを返してくれているのに気づいていなくて、こんな遠回りをしてしまった。普通に<img src="https://pixe.la/v1/users/hitonatsu/graphs/alive">で表示できてしまった。

そういう感じで今は<img>タグでめっちゃ普通にグラフ表示させて頂いている。

今はせっかくPuppeteer動かすのやってしまったから、使わないけど最後までコード書き上げるかどうかを悩んでいるところです。


wlが貼られています

Alfredのクリップボード機能で不要なものを単体で消す

AlfredのPowerPack買うとクリップボード拡張がついてきて、まあ要するにクリップボードの履歴が使えるようになる。

使っているとたまに

  • ミスってコピーした
  • 別にいいけどできればあんまり残しておきたくないようなものをコピーしてしまった
  • 設定からアプリ拒否設定忘れててクリップボードに残したくないアプリの情報のものが記録されてしまった

とかが起こってしまうときがある。

いらないクリップボード情報を単体で消したい

fn + deleteキー

でいけた。

助かった。

https時代のgitアカウントを使い分ける方法のメモ

時代はhttps

f:id:hitonatsu:20181027101737p:plain

https://help.github.com/articles/set-up-git/

  • GitHubではhttps推奨になっているし…
  • httpsのほうがclone速度はやいし…
  • まとめに書くけどhttpsにすると覚えることが1個だけでラク

SSHでアカウントを使い分けるときはどうしていたか

~/.ssh/configを作成して

host github.com-main
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

host github.com-sub
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github_sub
 User git

みたいなことを書いてssh-add -K ~/.ssh/id_rsa_githubして

$ git clone git@github.com-main:username/repo.git

形式でcloneしたりしていた。git@github.com-mainとかgit@github.com-subとか長いし憶えられないしでつらい。アカウントの数が増えるたびにconfigに足す設計になるのもつらい気がする。

あるいは

$ GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Git環境変数にGIT_SSH_COMMANDが生えてからこうもできていたけどコマンド長いし憶えられないし毎回鍵のパスいるしでつらい気がする。

git2.1.0以降は.gitconfigで管理できるようになって

$ git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"

で鍵指定したりできるようになって便利、だけどそもそもローカルの.gitconfigが必要になってきてちょっぴりつらい。


superuser.com

まあSSHでのアカウント切り替えはstackexchangeのこのスレッドが一番まとまっていると思っている

Caveat

  • 個人的なメモで書いているので多分に間違ってたりするかもしれない

  • ssh-keygenしてからのはなしなのでキージェネレーションのやりかたは書かない

  • ひとつのマシンでgitアカウントを使い分けたい

  • 筆者はMacOS環境なのでMacOS前提で書かれています

そもそもコミッター情報(コミッター名とメアド)はどこに依存しているか

gitのコミッター名とメアドは.gitconfig、あるいはGitの環境変数に依存する

なのでコミットログに記録されるアカウントを切り替えるなら

.gitconfigの場合

$ git config --global user.name "Mona Lisa"
$ git config --global user.email "email@example.com"

グローバルの.gitconfigにコミッター名とメアドを設定。

ローカル(リポジトリ単位のスコープ)で設定するなら

$ git config --local user.name "Mona Lisa"
$ git config --local user.email "email@example.com"

でOK。

環境変数で切り替えるなら

export GIT_COMMITTER_NAME="Mona Lisa"
export GIT_COMMITTER_EMAIL="email@example.com"
export GIT_AUTHOR_NAME="Mona Lisa"
export GIT_AUTHOR_EMAIL="email@example.com"

という具合にする。

環境変数を実際にリポジトリごとに切り替えたりする場合には、direnvを使うと自分は便利だと思っている。

direnvを使う方法はこちらのブログがすごくわかりやすい。


ようするにコミッターを切り替えるための情報を.gitconfigで管理したいなら、使いたいアカウントのnameとemailを.gitconfigに書けばOK。この場合globalとlocalの.gitconfigを巧みに使いわけることになる。

あるいはGit環境変数で管理したいなら、.envrcなりに環境変数をよしなに設定していく。

なおこれらコミッター名の切り替えに関しては以前書いたこの辺の話にも通ずる。

tech-1natsu.hatenablog.com

認証まわりを使い分ける…プライベートリポジトリもcloneしたりpushしたい!

git addするときのコミッター情報を切り替えるのは上記の方法でOKだけど、git pushなりgit cloneするときの認証の場面では上の設定は関係ない。

関係ないとは言っても普通にパブリックリポジトリをCloneする場合は

$ git clone https://gitlab.com/1natsu172/example-public-repo.git

でクローンできる。

プライベートリポジトリでもCloneするなら

$ git clone https://gitlab.com/1natsu172/example-private-repo.git
Username for 'https://gitlab.com': 
Password for 'https://gitlab.com':

という具合にリポジトリへのアクセス権を持ってるか聞かれるので正しいアカウント情報を打てばCloneできる。

毎回使いたいほうのアカウント名とパスワードを打てばアカウントを使い分けられますね。めでたしめでたし。

……めでたしなわけがない。毎回毎回パスワードを打つなんて人間のすることじゃない。

ユーザー名とパスワードをcredential helperに記憶してもらう

人間が毎回打つのは勘弁してほしい。なので記憶してもらうようにする。

MacOSの場合はGit自体に付属しているosxkeychain helperにお願いする。

$ git config --global credential.helper osxkeychain

これでglobalの.gitconfigosxkeychain helperを使うように書き込まれて、めでたく毎回パスワードを打たなくてよくなりました。


なおそもそもgit credential-osxkeychainが使えるかを確認したいなら、

$ git credential-osxkeychain

Usage: git credential-osxkeychain <get|store|erase>

こう返ってくればOKなよう。

上記のcredential helperことは実は全部Githubのヘルプに書かれている。

ところでこれでどうやって認証アカウントを切り替えるんですか?

『パスワード記憶してくれるようになったのはいいけど、どっちのアカウントで認証するかを指示してないじゃないか、プライベートリポジトリのアクセスはどうやって切り替えるんだ!』

わかります。

httpsではプライベートリポジトリのcloneをするときはこう。

https://<username>@<domain>/<repository-username>/<repository-name>.git

ドメインの前に「ユーザー名@」をつける

つまりgit cloneするときにこう

$ git clone https://hitonatsu@gitlab.com/1natsu172/example-private-repo.git

ユーザー名がhitonatsuのアカウントを使いたい場合の例

すると初回だけ

$ git clone https://hitonatsu@gitlab.com/1natsu172/example-private-repo.git
Password for 'https://hitonatsu@gitlab.com':

のようにパスワードを聞かれて、以降はcredential helperが憶えてくれる。

つまり初回のみでOK

リポジトリhttps形式のURLをブラウザからゲットしようとすると

f:id:hitonatsu:20181027084203p:plain

これはGitHubですが…

まあこういう感じ。

リポジトリを最初にcloneするときだけこれをコピーして

https://<username>@<domain>/~

形式に変えてcloneするだけでOK。以後は各アカウント毎にパスワードを憶えてくれる。

「ユーザー名@」をつけてcloneするとリポジトリのリモートURLはどうなるかというと

$ git remote -v
origin  https://hitonatsu@gitlab.com/1natsu172/example-private-repo.git (fetch)
origin  https://hitonatsu@gitlab.com/1natsu172/example-private-repo.git (push)

でちゃんと設定される。

既存のローカルリポジトリのリモートURLをこの形式に変えるなら普通にgit remote set-url origin {url}てな具合で普通にすればOKなはず。

credential helperhttps://<username>@<domain>ごとに記憶してURL判断してくれるっぽいので、これでうまくアカウントを切り替えられた。


ちなみにお察しの通りMacOSではキーチェーンアクセスに保存される。

f:id:hitonatsu:20181027082737p:plain

GitHubじゃなくGitLabの例ですがちゃんとアカウント2件分保存されてますね

まとめ

だけ!

1回設定すればOK、プライベートリポジトリも「ユーザー名@」つけてcloneするだけで完全にラク。覚えやすい。


ハマり解決情報

GitHub Help 最強
  • ぶっちゃけGitのことでハマったらたいていGitHubのヘルプを見ればわかる
    • 検索しづらい見づらいですが…
  • Set up gitに沿って設定すればだいたいなんでもうまくいく
Q. リモートリポジトリとやりとりするときパスワード入れてもうまくいかない…

A.もしかして:2段階認証(2FA)

2段階認証(2FA)してるならcli上で聞かれるパスワード欄には生成したpersonal access tokenを入れる。