Git の push と pull の意味と使い分け方を徹底解説

IT入門辞典

はじめに

Gitを使って開発を進める際、頻繁に登場するコマンドに pushpull があります。
「push すると何が起こるのか」「pull するとローカルにどんな変化が生じるのか」「両コマンドの使い分けはどうすればよいのか」といった疑問は、初心者だけでなく経験者でもつきまといます。

この記事では、まずGitのリモートとローカルの概念を整理し、続いてそれぞれのコマンドの実際の挙動と使い方を「例を交えながら」詳しく解説します。最後に、実際の開発フローに組み込む際の注意点やチームでの共通ルールの立て方まで掘り下げます。


1. Gitにおける「ローカル」と「リモート」って何?

用語具体例目的
ローカルリポジトリ自分のマシン上の ~/project/コミット、ブランチ作成など、自分の作業スペース
リモートリポジトリGitHub/GitLab・自社サーバーの git@github.com:user/repo.git他人との共有、CI/CDの起点、バックアップ
  • ローカルリポジトリ には git init で生成された working directory(ファイルが実際に置かれた場所) と index(ステージング領域)ディレクトリ以下の .git/ フォルダ が含まれます。
  • リモートリポジトリ は実際にはサーバー上にある Git ディレクトリで、複数人が同時にプッシュやプルを行うことで同期が取れます。

2. git pull とは何か?

2.1 基本的な動作

git pull はローカルリポジトリにリモートリポジトリの更新を反映させるコマンドです。具体的には次の二ステップです:

  1. fetch(フェッチ)
    git fetch origin <branch> でリモートのコミット情報を「ローカルのリモート追跡ブランチ」へ取得。
  2. merge(マージ)もしくは rebase
    ローカルの現在のブランチにリモートの変更を統合。デフォルトはマージですが、--rebase を指定すればリベースを行います。
$ git pull           # デフォルト: fetch + merge
$ git pull --rebase  # fetch + rebase

2.2 典型的なワークフロー

  1. git pull → ローカルの変更点をリモートの最新状態に同期。
  2. もしローカルコミットが存在していれば、マージコンフリクト が発生する可能性がある。
  3. コンフリクトを解決後に git commit を実行し、マージコミット(あるいは rebase のコミット)が作成される。

2.3 注意点

内容詳細
デフォルトのマージマージコミットができるので履歴が分岐します。頻繁に行うと履歴が煩雑になることがある。
Rebase 推奨git pull --rebase をデフォルトに設定 (git config pull.rebase true) すると、直線的な履歴が保てます。
対象ブランチの指定git pull origin feature1 のようにブランチを明示すると意図せぬ統合を防げます。

3. git push とは何か?

3.1 基本的な動作

git pushローカルリポジトリからリモートリポジトリへ コミットを送信します。基本的な構文は次のとおり:

$ git push <remote> <local_branch>:<remote_branch>
# 例:
$ git push origin main   # ローカル `main` をリモート `main` にアップロード

3.2 リモート追跡ブランチとの関係

  • upstream(上流)設定がある場合、push では省略可。
    $ git push   # upstream が設定されていれば push 先は自動で決定
    
  • git push -u origin feature2 のように -u(–set-upstream)を付けると、今後 git push を単体で実行可能になります。

3.3 強制プッシュ(force push)

$ git push --force-with-lease
  • リベース後にローカルコミットを再書き換えた ときに、リモートに上書きしたい場合に使います。
  • --force-with-lease を使うと、自分の上書きが相手の最新コミットに合わない 場合に失敗。安全性が高い。

3.4 アクセス権限とトークン

  • GitHub などでは PAT(Personal Access Token) が必要。
  • SSH 鍵認証の場合は ~/.ssh/id_rsa がキー。
  • 認証エラーは「無効な認証情報」か「権限不足」のどちらか。

4. pull と push の使い分け

シナリオ何を行うか推奨されるコマンド
最新状態を取得したい既存ブランチに他人のコミットを取り込みたいgit pull(または git pull --rebase
自分の変更を共有したい変更をリモートに反映させるgit push
新しい機能作業開始チームで共有せずローカルに限定git checkout -b feature_x (push後は --set-upstream を設定)
リポジトリを複製・同期新しいマシンに clone → pull で最新化git clone <url> 、必要に応じて git pull

4.1 過密な Pull は不可

開発途中に頻繁に pull すると、マージコンフリクトが多発します。最小限に保つには:

  • ブランチごとに作業分割main は安定版、feature/* は作業中ブランチとして使う。
  • Pull してからの作業:一度に大きなコミットを作らず、頻繁にコミットしてマージ可能性を減らす。
  • ローカルで分岐git stash で一時的に変更を隠し、別ブランチで pullstash apply

4.2 Push でのバッチリチーム共有

  • Pull Request (PR):GitHub などでレビューを交えてマージ前に push する。
  • protected branchmainrelease への直接 push を制限し、レビュー済みPRのみをマージさせる。

5. 実際の開発フローで使う例

5.1 フロー例①:単機能開発

  1. git checkout main
  2. git pull --rebase – 最新を取得
  3. git checkout -b feature/awesome-feature
  4. コミット → git add . / git commit -m
  5. git push --set-upstream origin feature/awesome-feature
  6. GitHub で PR 作成 → レビュー → マージ
  7. git checkout main && git pull --rebase
  8. git merge --ff-only feature/awesome-feature(GitHub 自動マージの場合は省略)
  9. git push origin main

5.2 フロー例②:定期的なリリース

  1. main で作業完了 → git push origin main
  2. CI で自動テスト/ビルド → 成功時に git tag v1.2.3git push origin v1.2.3
  3. release ブランチ生成 (git checkout -b release/1.2.3) → 必要修正 → git push
  4. release ブランチを main に merge(Fast-Forward) → git push origin main

6. よくあるエラーと対処

エラー原因対策
error: failed to push some refs相手のリモートに自分のコミットに先行する変更があるgit pull --rebase で取込 → コンフリクト解決 → git push
error: 'origin' does not appear to be a git repositoryURL が間違っている、またはリモートが設定されていないgit remote add origin <url> で追加
username/password authentication failedPAT が期限切れまたは無効新しい PAT を生成し、git credential で更新
fatal: refusing to merge unrelated histories別々に初期化されたリポジトリをマージgit pull --allow-unrelated-histories でマージを許可
fatal: Needed a single commit to be added to the indexマージコミットの途中で rebase を中断したgit rebase --continue で続行

7. マルチブランチ環境での注意点

  1. リモート追跡ブランチの管理
    • git fetch --prune でデリートされたブランチをローカルから消す。
    • git remote prune origin も忘れずに。
  2. ブランチ名規則
    • feature/*bugfix/*hotfix/* などを明確に命名する。
  3. Protected ブランチ
    • 誰が push / merge できるかを明文化(例:main は PR でのみ更新)。
  4. コミットメッセージ規約
    • Conventional Commits(feat:, fix:, docs: など)を採用すると CI の自動化がしやすい。

8. 最後に

  • pull:リモートの最新状態をローカルへ取り込む。マージまたはリベースで統合。
  • push:ローカルの変更をリモートへ送信する。
  • 使い分けのコツは「まずは情報を取り込み、次に変更を共有」というタイムラインを守ること。
  • チームでも共通の運用ルール(リベースかマージか、どこで push するか)を決めると、作業フローがスムーズになる。

Gitは非常に柔軟で多機能です。初めは pushpull の基本だけをしっかり身につけ、プロジェクトに合わせた細かな設定を段階的に増やしていくと、より効率的に高品質な開発が可能になります。ぜひ今回のポイントを試して、あなたのワークフローをさらに最適化してみてください。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント