3秒でわかる
手元のリポジトリのコミットをリモートへ送り出す操作。push して初めて他の人から見えるようになり、バックアップとしても意味を持ちます。
もう少し詳しく
どういうものか
push は、ローカルリポジトリにあるコミットを GitHub などのリモートリポジトリへ送る操作です。送られるのはファイルの現在の内容ではなく、コミットの履歴そのものです。まだコミットしていない編集内容は push しても届きません。
なぜ必要か
commit だけでは、変更は自分のパソコンの中に閉じたままです。他の人がレビューすることも、CI がテストを走らせることも、パソコンが壊れたときに取り戻すこともできません。push はその履歴を共有の場所に置く行為で、チームで作業する場合の合流点になります。
具体例
git add .
git commit -m "商品一覧に並び替えを追加"
# 初回 ローカルの枝とリモートの枝を結びつけながら送る
git push -u origin feat/sort-products
# 2 回目以降はこれだけで済む
git push
# 送り先と枝の対応を確認する
git remote -v
git branch -vvつまずきやすいところ
もっとも多いのが、リモートが先に進んでいて拒否される場合です。他の人の push を取り込んでいないと rejected と表示されます。ここで強制的に上書きしてしまうと、相手のコミットが履歴から消えます。正しい手順は、先に git pull (または git fetch してから合流)して、それから push し直すことです。
<a href="/glossary/git-pull" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">git pull</a> --<a href="/glossary/rebase" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">rebase</a> # 相手の履歴の上に自分のコミットを載せ直す
git pushそもそも履歴が送られていない、という場合もあります。git status で「Changes not staged」や「Untracked files」が残っていれば、それはまだコミットされていないので push しても届きません。push は commit 済みの履歴だけを運びます。
もうひとつは、push したつもりで別のブランチに送っていた場合です。Pull Request の画面に変更が出てこないときは、まず今いるブランチと追跡先を確認します。
--force は共有ブランチでは使わないのが原則です。どうしても履歴を書き換えたいときは --force-with-lease を使うと、自分が知らない他人のコミットがある場合に止まってくれます。
似た用語との違い
| 操作 | 向き | 内容 |
|---|---|---|
| commit | ローカル内 | 変更を履歴として記録する |
| push | ローカル → リモート | 記録した履歴を送る |
| pull | リモート → ローカル | 相手の履歴を取り込む |
覚え方
commit が「保存」、push が「提出」です。手元でどれだけ保存しても、提出しなければ誰にも届きませんし、パソコンが壊れれば一緒に消えます。