# コミットをリモートリポジトリにプッシュする

ローカル ブランチで実行されたコミットをリモート リポジトリにプッシュするには、git push を使用します。

## `git push` の概要

`git push` コマンドは 2 つの引数を取ります。

* リモート名 (例: `origin`)
* ブランチ名 (例: `main`)

次に例を示します。

```shell
git push REMOTE-NAME BRANCH-NAME
```

たとえば、通常、ローカルの変更をオンライン リポジトリにプッシュするために `git push origin main` を実行します。

## ブランチの名前を変更する

ブランチの名前を変更する場合も、同じ `git push` コマンドを使いますが、新しいブランチの名前という引数をもう 1 つ追加します。 次に例を示します。

```shell
git push REMOTE-NAME LOCAL-BRANCH-NAME:REMOTE-BRANCH-NAME
```

これは `LOCAL-BRANCH-NAME` を `REMOTE-NAME` にプッシュしますが、名前は `REMOTE-BRANCH-NAME` に変更されます。

## "non-fast-forward" エラーに対処する

リポジトリのローカル コピーが同期されていない、つまりプッシュ先である上流リポジトリより古くなっている場合は、`non-fast-forward updates were rejected` というメッセージが表示されます。
これは、ローカルの変更をプッシュする前に上流の変更を取得、つまり "フェッチ" する必要があるという意味です。

このエラーの詳細については、「[非-fast-forwardエラーの処理](/ja/enterprise-server@3.22/get-started/using-git/dealing-with-non-fast-forward-errors)」を参照してください。

## タグをプッシュする

デフォルトで、追加のパラメータを使わない場合、`git push` はリモート ブランチと名前が一致するすべてのブランチを送信します。

1 つのタグをプッシュする場合は、ブランチをプッシュするときと同じコマンドを発行できます。

```shell
git push REMOTE-NAME TAG-NAME
```

すべてのタグをプッシュする場合は、次のコマンドを使用できます:

```shell
git push REMOTE-NAME --tags
```

## リモートブランチまたはタグを削除する

ブランチを削除する構文は、1 回見ただけでは少し難解です:

```shell
git push REMOTE-NAME :BRANCH-NAME
```

コロンの前にスペースがあることに注意してください。 このコマンドは、ブランチの名前を変更するときの手順と似ています。 ただし、ここでは Git に *nothing* を `BRANCH-NAME` にある `REMOTE-NAME` にプッシュするよう指示しています。 このため、`git push` はリモート リポジトリ上のブランチを削除してしまいます。

## リモートとフォーク

[GitHubでリポジトリ](https://guides.github.com/overviews/forking/)を "フォーク" できることは既にわかっているかもしれません。

自分が所有するリポジトリをクローンするときには、更新をフェッチしたりプッシュしたりする対象を Git にリモート URL で指定します。 元のリポジトリとのコラボレーションが必要な場合は、ローカルの Git クローンに新しいリモート URL を追加するといいでしょう。その名前は通例、`upstream` です。

```shell
git remote add upstream THEIR_REMOTE_URL
```

これで、更新とブランチを *その* フォークからフェッチできるようになります。

```shell
git fetch upstream
# Grab the upstream remote's branches
> remote: Counting objects: 75, done.
> remote: Compressing objects: 100% (53/53), done.
> remote: Total 62 (delta 27), reused 44 (delta 9)
> Unpacking objects: 100% (62/62), done.
> From https://HOSTNAME/OCTOCAT/REPO
>  * [new branch]      main     -> upstream/main
```

ローカルの変更が完了したら、ローカルブランチをGitHubにプッシュし、[プル要求を初期化](/ja/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests)できます。

フォークの操作の詳細については、「[フォークを同期する](/ja/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork)」を参照してください。

## 参考資料

* [「Pro Git」ブックの「リモート」チャプター](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes)
* [
  `git remote` メイン ページ](https://git-scm.com/docs/git-remote.html)
* [Git チートシート](/ja/enterprise-server@3.22/get-started/git-basics/git-cheatsheet)
* [Git ワークフロー](/ja/enterprise-server@3.22/get-started/git-basics/git-workflows)
* [Git ハンドブック](https://guides.github.com/introduction/git-handbook/)