Gitを安心して使うために知っておきたいGitコマンドの動き　git push編

# はじめに
Gitを学び始めたばかりの方にとって実行するのに怖いコマンド筆頭は`git push`だと思います。１度プッシュしてリモートに変更を送信すると簡単には戻せないと聞いていたので、送信したいローカルブランチを対象のリモートブランチにちゃんと送信できるのか、とプッシュするときは毎回緊張していました。
これは、今考えると`git push`を実行したときに何がどのように更新されるかを理解していなかったことが原因だと思います。
この記事ではGit初心者向けに、`git push`コマンドに焦点を当てて実行されたときの動きをまとめています。

前回はgit branch編で`git branch`コマンドに焦点を当てた記事を作成しました。良ければこちらも参照してみてください。

https://qiita.com/Sato_1021/items/41f4887ca29f7acddf22

# git pushコマンドとは
そもそも`git push`とはどのようなコマンドなのでしょうか。
ドキュメントには以下のように書いています。
```
Updates remote refs using local refs, while sending objects necessary to complete the given refs.
```
つまり`git push`とは、「ローカルブランチを送信してリモートブランチを更新する」コマンドとなります。プッシュによる影響を受けるのはプッシュ先となるリモートブランチだけになります。
`push`とは「ある一定の方向に押す」のような意味があるのでコマンド名通りだと思います。

## 本記事に出てくるコマンド
この記事で説明するコマンドは下記になります。
1. `git push origin [ローカルブランチ名]:[リモートブランチ名]`
1. `git push origin [ローカルブランチ名]`
1. `git push origin HEAD`
1. `git push`
1. `git push -u`
1. `git push -n`
1. `git push origin :[リモートブランチ名]`

また、ご自身でドキュメントを見たい方はGit Documentationを確認して頂ければと思います。
下記のURLからご覧いただけます。

https://git-scm.com/docs

# 具体例と実行コマンド
### ブランチ名を指定してプッシュする
```
git push origin [ローカルブランチ名]:[リモートブランチ名]
```
一切省略していない形のコマンドです。プッシュしたいローカルブランチ名、更新したいリモートブランチ名を明示的に指定します。
このコマンドはローカルとリモートでブランチ名が違ってもプッシュできます。
同名の場合、ほぼ使うことはないと思います。
![スライド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715171/c22dadd3-c638-52c9-916a-88339519d978.png)


### ローカルブランチと同名のリモートブランチにプッシュする
```
git push origin [ローカルブランチ名]
```
ローカルブランチと同じ名前のリモートブランチにプッシュします。ほとんどの人はプッシュしたいローカルブランチ名とリモートブランチ名は同じだと思いますのでこちらのコマンドを使用している人は多いと思います。
また同名のリモートブランチが存在しない場合、ローカルブランチ名と同名のリモートブランチが新しく作成されます。
![スライド3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715171/341c8e84-d900-87b2-1456-ba5e1ffba0eb.png)

ブランチ名の代わりに`HEAD`を使えばより簡単にプッシュできます。
```
git push origin HEAD
```
`HEAD`とは現在作業中のブランチ（今後はカレントブランチと呼びます）のことで、こちらも同名のリモートブランチにプッシュします。
私は作業をした後すぐにプッシュすることが多いので、こちらのコマンドを使う頻度が１番高いです。


### `git push`を省略して実行する
```
git push
```
リポジトリ名やローカルブランチ名、リモートブランチ名の全てを省略した場合、カレントブランチを上流ブランチにpushします。
上流ブランチが設定されていない場合やローカルブランチ名と上流ブランチ名が同じではない場合、警告を出してくれます。

プッシュと同時に上流ブランチを設定する方法をがあるのでそちらと一緒に使うと安心して省略した形でもプッシュをできると思います。

![スライド4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715171/b2bdbcc1-5ffd-79b8-efcb-b6d1170f784d.png)

#### 補足：上流ブランチを確認する
```
git branch -vv
```
こちらのコマンドで上流ブランチを確認することができます。

### push先を上流ブランチとして設定しながらプッシュする
```
git push -u origin [ローカルブランチ名]
git push -u origin HEAD
```
pushに成功したとき、push先のブランチを上流ブランチとして設定します。こちらのコマンドを１度実行することで、次からは`git push`と省略した形でプッシュできるようになります。

### リモートブランチを更新しないようにプッシュする
```
git push -n
git push --dry-run
```
実際に送信はしませんが、プッシュをしたかのように動作します。
例えば下記のようなコマンドを入力します。
```
git push -u origin feature/newbranch
```
新しいリモートブランチを作成して、そのブランチを上流ブランチとして登録するためのコマンドです。
ここに`--dry-run`をつけて実行します。
```
$ git push --dry-run -u feature/newbranch

To [リモートリポジトリのURL]
 * [new branch]      HEAD -> feature/newbranch
Would set upstream of 'feature/newbranch' to 'feature/newbranch' of 'origin'
```
このように新しいブランチを作成して上流ブランチとして設定しましたと結果が返ってきます。しかし実際には新しいブランチは作成されていませんし、上流ブランチも設定されていません。
どうしてもプッシュするのが怖いときはこちらのコマンドでどのように動くのか確認できます。

### リモートブランチを削除する
```
git push origin :[リモートブランチ名]
git push origin -d [リモートブランチ名]
git push origin --delete [リモートブランチ名]
```
上の方で説明した`git push origin [ローカルブランチ名]:[リモートブランチ名]`の別の使い方です。ローカルブランチ名を指定しない場合、空をプッシュすることになります。それにより指定したリモートブランチが削除されます。
`-d`のようにオプションで削除することも可能です。

# おわりに
本記事ではpushコマンドの中でも特によく使うコマンドを紹介しました。これらのコマンドを使うことができれば基本的に`git push`でやりたいことはできると思います。
「プッシュがよくわからなくて怖い」という方に、git pushコマンドについて少しでも理解を深めていただければ幸いです。