Gitの「merge・pull・push」の違いとは?サーバーにプログラムを上げることをマージと呼ぶのか、SVNとの違いも解説

Linux系

GitやSubversion(SVN)を使った開発では、「マージ」「プル」「プッシュ」「コミット」「デプロイ」といった言葉が頻繁に登場します。どれもソースコードを移動・反映する場面で使われるため混同しやすいのですが、技術的にはそれぞれ異なる処理を指します。

特に「プログラムをサーバーに上げること」をマージと呼べるかどうかは、どのサーバーへ何を反映しているのかによって答えが変わります。Gitのリモートリポジトリへ自分のコミットを送信しているなら通常は「push」、開発ブランチの変更をmainなど別ブランチへ統合しているなら「merge」、実行環境のサーバーへアプリケーションを配置しているなら「deploy(デプロイ)」と呼ぶのが一般的です。

また、mergeはTortoiseSVNだけの用語ではありません。GitにもSubversionにも正式にマージという概念・操作があります。ここではLinuxのコマンドラインでGitを使う場合を中心に、SVNとの違いも含めて整理します。

結論:mergeはTortoiseSVNだけの言葉ではない

「merge(マージ)」はTortoiseSVN固有の用語ではありません。Gitにも正式にgit mergeというコマンドがあります。Git公式ドキュメントでは、git mergeは複数の開発履歴を結合するためのコマンドとして説明されています。[参照] Git公式 git-merge

Subversionにもマージがあります。Apache Subversionの公式ドキュメントでもsvn mergeが用意されており、ある開発ラインで行われた変更を別の作業コピーへ適用する処理などに利用されます。[参照] Version Control with Subversion・svn merge

TortoiseSVNはSubversionをWindowsのGUIから操作しやすくするクライアントです。そのためTortoiseSVNの画面にも「Merge」がありますが、TortoiseSVNだけがマージという言葉を使っているわけではありません。

Gitでいう「merge」とは何をする操作なのか

Gitのmergeは、簡単にいえば別々に進んだ開発履歴を統合する処理です。典型的なのは、機能開発用のfeatureブランチで行った変更をmainブランチへ取り込むケースです。

例えばmainからfeature-loginというブランチを作り、そこでログイン機能を開発したとします。開発完了後にmainへ移動し、git merge feature-loginを実行して変更を統合するのであれば、これは明確に「マージする」と表現できます。

この操作では、状況によってFast-forwardになったり、新しいマージコミットが作成されたりします。また同じ部分が両方で異なる内容へ変更されていると、merge conflict(マージコンフリクト)が発生することがあります。

「サーバーに上げる」だけなら通常はmergeとは呼ばない

現場で「プログラムをサーバーに上げる」という表現には複数の意味があります。ここを区別しないと、mergeという言葉が正しいかどうか判断できません。

例えばLinux上のローカルGitリポジトリで変更をコミットし、そのコミットをGitHub、GitLab、社内Gitサーバーなどのリモートリポジトリへ送っているのであれば、通常は「pushする」と表現します。Git公式ではgit pushを、関連するオブジェクトとともにリモートの参照を更新するコマンドとして定義しています。[参照] Git公式 git-push

一方、Webサーバーやアプリケーションサーバーなどの実行環境へ完成したプログラムを配置しているのであれば、「デプロイする」「リリースする」「本番環境へ反映する」などの方が意味を正確に伝えられます。

pushとmergeは何が違う?

git pushgit mergeは、どちらも変更が別の場所へ反映されるように見えるため混同されることがあります。しかし目的は異なります。

操作 主な意味 典型例
git merge 開発履歴を統合する featureブランチをmainへ統合
git push ローカルの変更をリモートへ送る ローカルmainをoriginへpush
git pull リモートから取得して現在のブランチへ統合する origin/mainの更新をローカルへ反映
deploy アプリケーションを実行環境へ配置・反映する 本番Webサーバーへリリース

例えばgit push origin mainを実行した場面を「mainをサーバーへマージしました」と言うと、聞いた側は「何のブランチをmainへmergeしたのだろう?」と受け取る可能性があります。この場合は「mainをリモートへpushしました」と言う方が誤解がありません。

pullの中ではmergeが行われることがある

少しややこしいのがgit pullです。Git公式ドキュメントによると、git pullはまずリモートリポジトリから変更を取得し、その後、設定やオプションに応じて現在のブランチへ統合する処理を行います。一般的な設定ではfetchした内容をmergeする動作になり、rebaseを使用する構成もあります。[参照] Git公式 git-pull

つまり「pullとmergeは完全に無関係」というわけでもありません。典型的なgit pullは、大まかにはリモートから変更を取得するfetchと、それを現在のブランチへ統合する処理を組み合わせたものです。

例えば他の開発者がorigin/mainを更新しているとき、自分のmainでgit pullを実行すると、その変更を取得して自分の履歴へ統合できます。ただしpullを実行したこと自体を通常「サーバーへマージした」とは表現しません。

GitHubやGitLabの「Merge Request」も同じマージの考え方

Gitを利用する開発では、ローカルで直接git mergeを実行する以外にも、Webサービス上でブランチを統合することがあります。GitHubでは「Pull Request」、GitLabでは「Merge Request」と呼ばれる仕組みが代表例です。

例えばfeatureブランチをリモートへpushし、「この変更をmainへ取り込んでください」というMerge Requestを作成し、レビュー後にmainへ統合する流れがあります。この最後の統合処理は「マージ」と呼んで問題ありません。

つまりLinuxのコマンドラインを使っているか、TortoiseSVNのGUIを使っているかは本質ではありません。別の変更履歴・開発ラインを統合しているかどうかが、mergeという言葉を使う際の重要なポイントです。

SVNとGitでは考え方が違ってもmergeは両方に存在する

GitとSubversionはバージョン管理の仕組みが異なります。Gitは分散型バージョン管理システムで、Subversionは集中型のバージョン管理システムです。そのためcommit、push、updateなどの意味やワークフローを単純に一対一で置き換えることはできません。

しかし、複数の開発ラインで発生した変更を統合する必要がある点は共通しています。そのためSubversionにもGitにもmergeがあります。

TortoiseSVNを長期間利用してからGit中心の現場へ移った場合、以前の操作感から「サーバー側へ変更をまとめて反映する=マージ」という感覚になっていることも考えられます。しかしGitの現場ではpush、merge、deployを区別して表現した方が、チーム内の意思疎通が正確になります。

「サーバーに上げる」が曖昧になりやすい理由

日本の開発現場でよく使われる「サーバーに上げる」という表現そのものが、かなり幅広い意味を持っています。Gitサーバーへpushすることも、検証サーバーへファイルを配置することも、本番環境へデプロイすることも「上げる」と表現される場合があります。

例えば「修正版をサーバーに上げました」だけでは、Gitのリモートリポジトリへpushしただけなのか、mainへmergeまで完了したのか、本番サーバーへdeployしたのか分かりません。

チーム開発では「featureブランチをoriginへpushしました」「レビュー後mainへmergeしました」「mainの最新版を検証環境へdeployしました」のように工程を分けて表現すると、作業状況を正確に共有できます。

実際の開発フローで見るcommit・push・merge・deploy

Gitを使った典型的な開発を例にすると、それぞれの用語の違いが分かりやすくなります。

  1. プログラムを修正する
  2. git addで変更をステージする
  3. git commitでローカルリポジトリへ変更履歴を記録する
  4. git pushでfeatureブランチをリモートリポジトリへ送る
  5. Pull RequestやMerge Requestを作成してレビューする
  6. featureブランチの変更をmainへmergeする
  7. mainの成果物を本番・検証サーバーへdeployする

この例では、4番が「サーバーへpush」、6番が「merge」、7番が「deploy」です。見た目にはすべて「作ったプログラムを先へ進める作業」ですが、バージョン管理上は別々の操作です。

LinuxのコマンドラインかGUIかは用語を決める基準ではない

「Linuxのコマンドラインだからmergeとは言わない」「TortoiseSVNだからmergeと言う」という区別ではありません。操作方法がCLIかGUIかは、mergeという概念の有無とは別問題です。

GitをLinuxで操作していてもgit mergeは普通に利用できます。逆にGit用GUIクライアントを使っていてもpushはpushです。ツールの画面上でボタンをクリックするか、ターミナルへコマンドを入力するかが違うだけです。

したがって「マージとはTortoiseSVNだけなのか」という疑問に対しては、マージはTortoiseSVN固有ではなく、Gitでも正式に使用される用語と整理できます。

現場で指摘された場合は「何をしていたか」で判断する

「それはマージとは言わない」と指摘された場合、その指摘が妥当かどうかは実際の操作によります。もしgit pushを実行してリモートリポジトリへ変更を送ったことを「マージ」と呼んでいたのであれば、Gitの標準的な用語としては「push」と表現する方が正確です。

一方、実際に別ブランチの変更を現在のブランチへ統合していたのであれば、それはGitでもmergeと呼べます。「Gitだからmergeと言わない」という説明であれば正確ではありません。

また、会社独自のリリースツールやCI/CDパイプラインを利用している場合、社内で「マージ」「リリース」「反映」といった独自の呼び方をしていることもあります。技術用語としての定義と、プロジェクト固有の運用用語は分けて考えると混乱しにくくなります。

まとめ:GitにもSVNにもmergeはあるが、pushやdeployとは別の操作

mergeはTortoiseSVNだけで使われる言葉ではありません。Gitにはgit merge、Subversionにはsvn mergeがあり、どちらにも変更や開発履歴を統合する「マージ」という概念があります。

ただし、Gitでローカルの変更をリモートリポジトリへ送信する操作は通常「push」と呼びます。さらに、完成したプログラムをWebサーバーなどの実行環境へ配置するのであれば「deploy(デプロイ)」や「リリース」「本番反映」などと呼ぶ方が適切です。

したがって「プログラムをサーバーに上げる=常にマージ」ではありません。どのサーバーへ何を上げ、どの操作を行ったのかによって、push・merge・deployを使い分ける必要があります。

開発現場では「サーバーへ上げた」という曖昧な表現より、「リモートへpushした」「mainへmergeした」「本番へdeployした」と具体的に伝えると認識違いを防げます。LinuxのコマンドラインかTortoiseSVNかではなく、実際に行っている処理の内容で用語を選ぶのがポイントです。

コメント

タイトルとURLをコピーしました