VSCode/Git 意図しないブランチにpushしてしまった件

* Windows10
* VSCode 1.29.1

# やったこと

* ブランチ作成
  * `git checkout -b new-branch origin/other-branch`
* VSCodeにて
  * ファイル修正
  * commit
  * push
      * `ソース管理(Ctrl + Shift + G) ⇒ 三つポチ ⇒ プッシュ`
* `new-branch`にpushされると思ったが、`other-branch`にpushされてる :sob: 


# 調査

## VSCodeの`プッシュ`で、どんなコマンドが発行されたのか？

* `ソース管理(Ctrl + Shift + G) ⇒ 三つポチ ⇒ Git 出力の表示`

```bash:実際に発行されたコマンド
> git push origin new-branch:other-branch
```

### このコマンドの意味って？

* [おまけ2-git-push-のおさらい](https://qiita.com/awakia/items/6aaea1ffecba725be601#%E3%81%8A%E3%81%BE%E3%81%912-git-push-%E3%81%AE%E3%81%8A%E3%81%95%E3%82%89%E3%81%84)

> `git push <リモートのレポジトリ名> <ローカルのブランチ名>:<リモートのブランチ名>`

* 意図した操作じゃなーい :sob: 


## なぜこのようなコマンドが発行されるのか？

* VSCodeのドキュメントやソースをたどれませんでした・・ :sweat_smile:
* ご存知の方がいれば、教えてください・・ :bow:
  * [git コマンドと vscode の git 関連操作](https://qiita.com/satokaz/items/4660ce57ca8eb456a096#git-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8-vscode-%E3%81%AE-git-%E9%96%A2%E9%80%A3%E6%93%8D%E4%BD%9C) が参考になりそう

# どう操作すれば`new-branch`にpushできたのか？

## パターン1 (「やったこと」の場合)

*  :warning: pushの前に (ブランチ作成直後がベター)  :warning:
* VSCodeの`ソース管理(Ctrl + Shift + G) ⇒ 三つポチ ⇒ ブランチの発行`

```bash:実際に発行されたコマンド
> git push -u origin new-branch
```
  * [git push -u](https://git-scm.com/docs/git-push#git-push--u)

## パターン2 (VSCodeで完結)

* `F1` + `Git Branch`と入力 + 作成したいブランチ名を入力
      * 追跡ブランチは作成されない

```bash:実際に発行されたコマンド
> git checkout -q -b new-branch
```

* VSCodeの`ソース管理(Ctrl + Shift + G) ⇒ 三つポチ ⇒ ブランチの発行` もしくは、`画面左下の雲矢印マーク`
  * [Git Status Bar actions](https://code.visualstudio.com/docs/editor/versioncontrol#_git-status-bar-actions)
* ファイル修正
* commit
* push
  * 仮に`ブランチの発行`を忘れても、警告ダイアログが開く
      * `'new-branch'ブランチに上流ブランチはありません。このブランチを公開しますか？`

```bash:実際に発行されたコマンド
> git push

fatal: The current branch new-branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new-branch

> git push -u origin new-branch
```

# 所感 (言い訳)

* いつもはVSCodeからGit操作をすることが無いため、この現象に陥ることは無かった
* とはいえ、Gitについて分かっていなかったので、そのことに気づけて良かった・・・ :v:


# 補足

## Gitのお勉強

* [git-config push.default](https://git-scm.com/docs/git-config#git-config-pushdefault)

> This used to be the default, but not since Git 2.0 (simple is the new default).

* default設定の`simple`ってどんな動作？
  * [性格別おすすめpush.default設定](https://qiita.com/awakia/items/6aaea1ffecba725be601#%E6%80%A7%E6%A0%BC%E5%88%A5%E3%81%8A%E3%81%99%E3%81%99%E3%82%81pushdefault%E8%A8%AD%E5%AE%9A)

> これからのデフォルト。upstreamが設定されていて、それが同名のブランチ名であるときのみpushする。初心者でも安心して使える。初心を忘れないあなたと、デフォルトを愛するあなた向き。

* `push.default=simple`で`git push`を実行すると以下のようになる

```
$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:master

To push to the branch of the same name on the remote, use

    git push origin hogehoge

To choose either option permanently, see push.default in 'git help config'.
```

* 追跡ブランチを確認してみる
  * 「やったこと」のブランチ作成後だと、追跡ブランチが`[origin/other-branch]`となっている
  * この辺りが VSCodeの動作と関係ありそうだが・・

```bash
$ git branch -vv
* new-branch   1234567 [origin/other-branch] hage
```

* 追跡ブランチを作成する方法 (のうちの一つ。「やったこと」に該当するもの) 
  * [3.5 Git のブランチ機能 - リモートブランチ > 追跡ブランチ](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81#_pushing_branches)

> シンプルな方法としては、`git checkout -b [branch] [remotename]/[branch]` を実行します。