MercurialとGitの違いは何ですか?


727

私はWindowsで(msysGitを使用して)gitをしばらく使用しており、分散ソース管理のアイデアが気に入っています。つい最近、私はMercurial(hg)を調べてきましたが、興味深いようです。ただし、hgとgitの違いに頭を悩ますことはできません。

誰かがgitとhgを並べて比較しましたか?ファンボーイのディスカッションに飛び込むことなく、hgとgitの違いを知りたいです。

回答:


345

これらの記事は役立つかもしれません:

編集:GitとMercurialを有名人と比較するのはトレンドのようです。もう1つあります。


1
「Git vs Mercurial Please Relax」は、この質問と同じくらい古いものの、かなり時代遅れです。たぶん、両方のツールに3年以上の機能が追加されているので、この質問を削除して再度開く必要があります。
gman

238

私はMercurialに取り組んでいますが、基本的には両方のシステムは同等であると信じています。どちらも同じ抽象化で機能します。履歴を構成する一連のスナップショット(変更セット)です。各チェンジセットは、それがどこから来たか(親チェンジセット)を知っており、多くの子チェンジセットを持つことができます。最近のhg-git拡張は、MercurialとGitの間の双方向のブリッジを提供し、この点を示しています。

Gitはこの履歴グラフの変更(それに伴うすべての結果を伴う)に重点を置いていますが、Mercurialは履歴の書き換えを奨励していませんとにかく簡単であり、そうすることの結果は、期待どおりです(つまり、あなたが既に持っているチェンジセットを変更した場合、あなたが私からプルした場合、クライアントはそれを新しいものとして見るでしょう)。そのため、Mercurialは非破壊的なコマンドに偏っています。

軽量ブランチに関しては、それ以来Mercurialは複数のブランチを持つリポジトリをサポートしきました...いつも思っています。複数のブランチを持つGitリポジトリーは、まさにそれです。単一のリポジトリーに複数の分岐した開発ストランドがあります。次に、Gitはこれらのストランドに名前を追加し、これらの名前をリモートで照会できるようにします。Mercurial のブックマーク拡張機能はローカル名を追加します。Mercurial1.6では、プッシュ/プルするときにこれらのブックマークを移動できます。

私はLinuxを使用していますが、TortoiseHgはWindowsの同等のGitよりも高速で優れています(貧弱なWindowsファイルシステムの使用率が高いため)。http://github.comhttp://bitbucket.orgはどちらもオンラインホスティングを提供しています。Bitbucketのサービスは素晴らしく、応答が速いです(私はgithubを試していません)。

クリーンでエレガントな感じがするので、Mercurialを選択しました。Gitで取得したshell / Perl / Rubyスクリプトにうんざりしました。私が何を意味するのか知りたい場合は、git-instaweb.shファイルをのぞいてみてください。それは、Rubyスクリプトを生成するシェルスクリプトであり、ウェブサーバーを実行していると思います。シェルスクリプトは、最初のRubyスクリプトを起動する別のシェルスクリプトを生成します。適切な尺度として、Perlも少しあります。

MercurialとGitをJames BondとMacGyverと比較するブログ投稿が好きです-MercurialはGitよりもなんとなく控えめです。Mercurialを使用している人はそれほど簡単には感動しないように思えます。これは、各システムがLinusが「これまでで最もクールなマージ」と説明したことをどのように行うかに反映されています。Gitでは、次のようにして、関連のないリポジトリとマージできます。

git fetch <project-to-union-merge>
GIT_INDEX_FILE=.git/tmp-index git-read-tree FETCH_HEAD
GIT_INDEX_FILE=.git/tmp-index git-checkout-cache -a -u
git-update-cache --add -- (GIT_INDEX_FILE=.git/tmp-index git-ls-files)
cp .git/FETCH_HEAD .git/MERGE_HEAD
git commit

これらのコマンドは私の目にはかなり難解に見えます。Mercurialでは、次のことを行います。

hg pull --force <project-to-union-merge>
hg merge
hg commit

Mercurialコマンドが単純で特別なものではないことに注意してください-唯一の異常なことはへの--forceフラグhg pullです。これは、関係のないリポジトリからプルするとMercurialが異常終了するために必要です。Mercurialが私にとってよりエレガントに見えるのは、このような違いです。


21
TortoiseHgはLinux上のGnomeファイルマネージャであるNautilusとも連携することに注意してください。
oenli

4
Rubyスクリプトは、httpdがRuby WebサーバーであるWebrickの場合にのみ生成されます。
代替

4
Gitと同様に、Mercurialはコミット時にファイルのスナップショットを保存します。名前の変更はGitのようなヒューリスティックでしか追跡できないことに同意しません。モデルには、名前の変更などの追加情報をスナップショットに追加することを排除するものはありません。それはMercurialで行います。
Martin Geisler、2011年

63
関連のないプロジェクトをgitとマージ(プル)するには、次のようにしますgit pull <url-of-project>。引用したメールはgit(2005)のごく初期のものです
knittl 2011年

5
knittl:ああ、いいです。Gitの難解さが減っていると聞いてうれしいです。それでも、この例はシステムが私たちがクールだと思う点で少し異なっていることを示していると思います。GitはMercurialに比べて私には低レベルに感じられます(しかし、これ以上強力ではありません)。
マーティンガイスラー、2011年

73

Gitはプラットフォームであり、Mercurialは「単なる」アプリケーションです。Gitはバージョン管理されたファイルシステムプラットフォームであり、たまたまDVCSアプリが同梱されていますが、プラットフォームアプリの場合と同様に、対象アプリよりも複雑で、エッジが粗くなっています。しかし、これはgitのVCSが非常に柔軟であることを意味し、gitを使用してソース管理以外のことを実行できることは非常に豊富です。

それが違いの本質です。

Gitは、最初から、つまりリポジトリ形式から、最もよく理解されています。Scott ChaconのGit Talkは、このための優れた入門書です。内部で何が起こっているのかを知らずにgitを使用しようとすると、ある時点で混乱してしまいます(非常に基本的な機能だけに固執しない限り)。これは、毎日のプログラミングルーチンのDVCSが必要な場合は愚かに聞こえるかもしれませんが、gitの天才は、リポジトリの形式が実際には非常に単純で、gitの全体の操作を非常に簡単に理解できることです。

さらに専門性を重視した比較として、私が個人的に見た中で最高の記事はダスティン・サリングスです:

彼は実際に両方のDVCSを幅広く使用しており、両方をよく理解していて、結局gitを好むようになりました。


78
私はgitが「プラットフォーム」であると言及する人をよく読んでいますが、gitを実行する以外のことを行うプラットフォームとしての主要な例がないため、それは理論または一般的な神話です。
イアンケリング

@Ian-私が間違っていない場合、Aptana Studio 3はそれを内部更新システムに使用します。
Mac

22
つまり、Mercurialはオープンソースの分散リビジョン管理システムであり、gitはライフスタイルの選択です。
Tim Keating

51

大きな違いはWindowsです。Mercurialはネイティブでサポートされていますが、Gitはサポートされていません。bitbucket.org使用して、github.comに非常によく似たホスティングを取得できます(実際には、無料のプライベートリポジトリを取得するのでさらに優れています)。私はしばらくmsysGitを使用していましたが、Mercurialに移動してとても満足しています。


64
したがって、「自然に」という言葉は適切ではありませんが、Windowsでは十分にサポートされていません。
イアンケリング

14
gitはWindowsである程度サポートされています。ただし、クロスプラットフォームのUnicodeファイル名を使用して、どのような問題が発生するかを確認してください。
クレイグマックイーン

@クレイグ:それはプラットフォームの欠点の多くです。有能なプラットフォームがあれば、適切なロケールに切り替えることができます。utf-8に固執する場合、Mac OS Xのutf-8の正規化がわずかに異なることを除いて、ほとんど問題ありませんが、ウィンドウでutf-8を使用できるかどうかは
わかりませ

23
WindowsはUnicodeをサポートしていますが、MSはそのAPIでUTF-8ではなくUTF-16を選択しました。それにもかかわらず、gitがUnicodeのクロスプラットフォームをサポートすることは十分に可能です。SVNはその問題をかなりうまく解決しました。しかし、現時点ではmsysGit開発の優先度は高くありません。code.google.com/p/msysgit/issues/detail?id=80
Craig McQueen

38

基本的な切断されたリビジョン管理を探しているWindows開発者は、Hgを使用してください。HgはシンプルでWindowsシェルと十分に統合されていましたが、Gitは理解しにくいものでした。Hgをダウンロードしてこのチュートリアル(hginit.com)を実行しました-10分後、ローカルリポジトリがあり、プロジェクトに戻りました。


1
私は同じチュートリアルに従いました。それは決定的です。
ネイサン


20

それらはほとんど同じです。私の観点からの最も重要な違い(つまり、一方のDVCSをもう一方に選択させた理由)は、2つのプログラムがブランチを管理する方法です。

Mercurialで新しいブランチを開始するには、リポジトリを別のディレクトリに複製し、開発を開始するだけです。次に、プルしてマージします。gitでは、使用する新しいトピックブランチに明示的に名前を付けてから、同じディレクトリを使用してコーディング開始します。

つまり、Mercurialの各ブランチには独自のディレクトリが必要です。gitでは通常、単一のディレクトリで作業します。Mercurialでブランチを切り替えるとは、ディレクトリを変更することを意味します。gitでは、git checkoutでディレクトリのコンテンツを変更するようgitに要求することを意味します。

私は正直です:Mercurialで同じことができるかどうかはわかりませんが、通常はWebプロジェクトで作業しているため、gitで常に同じディレクトリを使用することは私にとって快適なようです。 -Apacheを構成して再起動します。ブランチするたびにファイルシステムを台無しにすることはありません。

編集:Deestanが述べたように、Hgはブランチ名前を付けました。これは単一のリポジトリに保存でき、開発者が同じ作業コピー内でブランチを切り替えることができます。とにかく、gitブランチはMercurialの名前付きブランチとまったく同じではありません。それらは永続的で、gitのようにブランチを破棄しません。つまり、名前付きブランチを実験的タスクに使用すると、マージしないことを決定した場合でも、リポジトリに格納されます。これが、Hgがリリース用ブランチのように、実験的な短期実行タスクにはクローンを使用し、長期実行タスクには名前付きブランチを使用することを推奨する理由です。

多くのHgユーザーが名前付きブランチよりもクローンを好む理由は、技術よりも社会的または文化的なものです。たとえば、Hgの最新バージョンでは、名前付きブランチを閉じて、変更セットからメタデータを再帰的に削除することもできます。

一方、gitは永続的ではなく、各チェンジセットのメタデータとして保存されない「名前付きブランチ」を使用するように招待します。

私の個人的な観点から見ると、gitのモデルは名前付きブランチの概念に深くリンクしており、同じディレクトリを持つブランチと別のブランチを切り替えます。hgは名前付きブランチで同じことを行うことができますが、それでも私は個人的にあまり好きではないクローンの使用を奨励します。


6
これは違いではありません。Hgはブランチにも名前を付けました。通常の開発では、クローンブランチではなく、常にこれらを使用します。
Deestan 2010

2
私の知る限り、Hgの名前付きブランチは、各コミットでメタデータを格納して取得されます。私は間違っているかもしれませんが、ブランチを作成すると、そのメタデータが各チェンジセットに埋め込まれ、履歴の一部になると読みました。これはgitとの大きな違いです。「クローンはブランチ名を記録したくないクイック実験に最適です。名前付きブランチは長期ブランチに適しています」tinyurl.com/2wz39qx 私の投稿で私が言おうとしていたのは、gitの標準ワークフローがあなたを招待するということです。単一の作業用コピーを使用する。HG標準ワークフローにはクローンが含まれますが、これは私の個人的なニーズに適合しません。
Arialdo Martini 2010

GitとHgでの類似点/相違点の適切な説明については、次を参照してください:mercurial.selenic.com/wiki/GitConcepts#Branch_model
sampablokuper

2
hgの名前付きブランチは、gitのブランチとは異なります。hgには、真のパスが1つあります。すべてのブランチはそのパスからのブランチです。gitには1つの真のパスはありません。リポジトリとその状態へのポインタの状態はさまざまです。各ブランチは異なるポインタです。どのポインターがメインのポインターであるかは使用次第です。ブランチはすべてピアです。
gman

17

gitmercurialには大きな違いが1つあります。が各コミットを表す方法。gitはコミットをスナップショットとして表し、mercurialはコミットを差分として表します。

これは実際にはどういう意味ですか?まあ、多くの操作はgitでより高速です。たとえば、別のコミットへの切り替え、コミットの比較などです。特に、これらのコミットが遠く離れている場合。

私の知る限り、Mercurialのアプローチの利点はありません。


29
チェンジセット(diff)の利点は、占有するスペースが少ないことです。Gitは、圧縮を使用してコミットに使用されたスペースを回復しますが、これには、ときどき明示的な再圧縮ステップ(「git pack」)が必要です。
クォーク

8
現在は「git gc」と呼ばれていますが、ガベージコレクションにはさまざまなレベルがあり、最近のバージョンのgitでは一部のレベルが自動的に実行されます。
FelipeC 2009

6
実際、Mercurialもスナップショットを使用しています
Ronny、

13
「スナップショット」と「差分」の違いを理解できていません。hgとgitの両方のストアは、ファイルデルタ(のグループ)としてコミットします。これらの差分は、それぞれのSCMが選択した以前のリビジョンに基づいています。あなたが言及した操作に対してgitが実際に高速であることを示す数値がありますか?とにかく、別のコミットに更新すると、ほとんどの時間は作業ディレクトリに書き込み、リポは読み取れません。
ケビン

2
「スナップショット」と「差分」-まったく無関係。ただし、リポジトリは内部に保存されているため、ユーザーの表示内容には影響しません。gitとmercurialはどちらもユーザーに「スナップショット」を提示します。私がBazaarと同じように、gitと同じ方法で実装されたリポジトリ形式をmercurialに追加できなかった理由はありません。
マークブース

11

何もない。どちらも同じように動作し、どちらもほぼ同じように動作します。どちらかを選択する必要がある唯一の理由は、すでに使用しているプロジェクトを支援する場合です。

1つを選択するもう1つの理由は、システムの1つだけをサポートするアプリケーションまたはサービスです。たとえば、githubのためにgitを学ぶことを選択しました。


6
答えが実用的すぎるようです。:)
Arafangion


11

私がそれらを正しく理解している場合(そして私はそれぞれの専門家から遠く離れています)、それらは基本的にそれぞれ異なる哲学を持っています。私は最初に水銀を9か月間使用しました。今はgitを6に使用しています。

hgはバージョン管理ソフトウェアです。主な目標は、ソフトウェアのバージョンを追跡することです。

gitは時間ベースのファイルシステムです。その目標は、ファイルシステムに別の次元を追加することです。ほとんどはファイルとフォルダを持っています、gitは時間を追加します。VCSはその設計の副産物であるため、たまたま機能すること。

HGでは、常に維持しようとしているプロジェクト全体の履歴があります。デフォルトでは、hgは、プッシュおよびプルするときに、すべてのユーザーによるすべてのオブジェクトへのすべての変更を望んでいると思います。

gitには、オブジェクトのプールと、これらのオブジェクトのどのセットが特定の状態のファイルのツリーを表すかを決定するこれらの追跡ファイル(ブランチ/ヘッド)があります。gitをプッシュまたはプルする場合、プッシュまたはプルする特定のブランチに必要なオブジェクトのみを送信します。これは、すべてのオブジェクトの小さなサブセットです。

gitに関する限り、「1つのプロジェクト」はありません。同じリポジトリに50のプロジェクトをすべて含めることができ、gitは気にしません。それぞれを同じリポジトリで個別に管理し、問題なく生きることができます。

Hgのブランチのコンセプトは、メインプロジェクトからのブランチまたはブランチからのブランチなどです。Gitにはそのようなコンセプトはありません。gitのブランチは単なるツリーの状態であり、すべてがgitのブランチです。公式、最新、または最新のブランチはgitでは意味がありません。

それが理にかなっているのかどうかはわかりません。私が絵を描くことができれば、hgはこのように見えるかもしれませんが、各コミットはo

             o---o---o
            /        
o---o---o---o---o---o---o---o
         \         /
          o---o---o

単一のルートとそこから枝が出ているツリー。gitはそれを実行できますが、多くの場合、強制されない方法でgitを使用します。gitの画像がある場合、簡単に次のようになります。

o---o---o---o---o

o---o---o---o
         \
          o---o

o---o---o---o

実際、いくつかの点で、gitでブランチを表示することさえ意味がありません。

議論を非常に混乱させる1つのこと、gitとmercurialはどちらも「ブランチ」と呼ばれるものを持っていますが、リモートで同じものではありません。Mercurialの分岐は、異なるリポジトリ間で競合がある場合に発生します。gitのブランチは明らかにhgのクローンに似ています。しかし、クローンは、同様の動作をする可能性がありますが、間違いなく同じではありません。かなり大きいchromium repoを使用してgit vs hgでこれらを試してみてください。

$ time git checkout -b some-new-branch
Switched to new branch 'some-new-branch'

real   0m1.759s
user   0m1.596s
sys    0m0.144s

そして今、クローンを使用してhgで

$ time hg clone project/ some-clone/

updating to branch default
29387 files updated, 0 files merged, 0 files removed, 0 files unresolved.
real   0m58.196s
user   0m19.901s
sys    0m8.957

どちらもホットランです。つまり、私はそれらを2回実行し、これが2回目の実行です。hg cloneは実際にはgit-new-workdirと同じです。どちらも、まるでタイプしたかのように、まったく新しい作業ディレクトリを作成しますcp -r project project-clone。これは、gitで新しいブランチを作成することと同じではありません。それははるかに重いです。hgにgitの分岐に相当するものがある場合、それが何であるかわかりません。

私はあるレベルでhgとgit 同様のことができるかもしれないことを理解しています。もしそうなら、彼らがあなたを導くワークフローにはまだ大きな違いがあります。gitの一般的なワークフローは、すべての機能のブランチを作成することです。

git checkout master
git checkout -b add-2nd-joypad-support
git checkout master
git checkout -b fix-game-save-bug
git checkout master
git checkout -b add-a-star-support

これで3つのブランチが作成され、それぞれがマスターと呼ばれるブランチに基づいています。(私はgitにそれらの1行を2行ではなく各行にするいくつかの方法があると確信しています)

今、私は1つに取り組むために

git checkout fix-game-save-bug

そして働き始める。コミットなど。Chromeと同じ大きさのプロジェクトでもブランチ間の切り替えはほぼ瞬時です。私は実際にそれをhgで行う方法を知りません。これは私が読んだチュートリアルの一部ではありません。

もう1つの大きな違い。Gitのステージ。

Gitはこのステージのアイデアを持っています。あなたはそれを隠しフォルダと考えることができます。コミットするときは、作業ツリーの変更ではなく、ステージ上のものだけをコミットします。奇妙に聞こえるかもしれません。作業ツリーのすべての変更をコミットする場合は、変更したgit commit -aすべてのファイルをステージに追加してからコミットします。

では、ステージのポイントは何ですか?コミットは簡単に分離できます。joypad.cppとgamesave.cppを編集し、それらを別々にコミットしたいとします。

git add joypad.cpp  // copies to stage
git commit -m "added 2nd joypad support"
git add gamesave.cpp  // copies to stage
git commit -m "fixed game save bug"

Gitには、同じファイル内のどの行をステージにコピーするかを決定するコマンドもあるので、これらのコミットを個別に分割することもできます。なぜそれをしたいのですか?別のコミットとして、他の人は必要なものだけをプルできるか、問題があった場合は問題のあったコミットだけを元に戻すことができるからです。


「Gitには、同じファイル内のどの行をステージにコピーするかを決定するコマンドもあるので、それらのコミットを個別に分割することもできます。」これらのコマンドは何ですか?
ジェームズマクマホン

1
@James:git add --patchlinux.die.net / man / 1 / git add -i
git

@gman:マスターをチェックアウトしてブランチを作成する代わりに、それに切り替えずに新しいブランチを作成するcheckout -b <name>ために使用できますgit branch <name>
tanascius

8

versioncontrolblogには、いくつかの異なるバージョン管理システムを比較できる動的な比較表があります。

以下はgit、hg、bzrの比較表です。


1
Mercurialに関する情報は完全に正確ではありません。Mercurialには「移動または名前変更後のインテリジェントなマージ」があります。具体的には、これは、に名前を変更dir-a/foo.cdir-b/foo.cて作業を続けると、プル後の作業が私の作業と正しくマージされることを意味しdir-b/foo.cますdir-a/foo.c
マーティンガイスラー、

Gitに関する情報(Better SCM Initiativeの比較、IIRCから得られたもの)も、いくつかの場所で不正確であるか、またはあまり使用されていません。
JakubNarębski、2010年


7

プロジェクトにWindowsベースの共同編集者はいますか?

ある場合、Git-for-Windows GUIは扱いにくく、難しく、不親切に見えます。

対照的に、Windows上のMercurialは非常に簡単です。


私はgitが好きですが、ここで同意する必要があります。Gitには、ステージを備えたより優れたコマンドラインと、より優れたドキュメントがあります。私はposixシェルでgitコマンドを楽しく使用します。しかし、WindowsのtortoiseHGは素晴らしいです、それはいくつかのdiffツール(比較を超えて)とさえ統合し、サブリポジトリ、およびstrip / mqのような多くのhgプラグインを完全にサポートしています
Keyo

少なくとも1つの非常に優れたWindows(およびOS X + Linux)Git GUIが利用可能です。
Mot

7

mercurialのbitbucket.orgのgitとgithubのgitの間で注意すべき点の1つは、mercurialに必要な数のプライベートリポジトリを設定できることですが、githubは有料アカウントにアップグレードする必要があります。だから、私は水銀を使用するbitbucketに行く理由です。


5

昨年、私はgitとhgの両方を自分で使用するために評価し、hgを使用することにしました。私はそれがよりすっきりしたソリューションのように見えて、当時はより多くのプラットフォームでよりよく機能したと感じました。しかし、それはほとんどトスアップでした。

最近では、git-svnとSubversionクライアントとして機能する機能があるため、gitを使い始めました。これは私を勝ち取り、私は今完全にgitに切り替えました。学習曲線は少し高くなっていると思いますが(特に内部を覗く必要がある場合)、本当に素晴らしいシステムです。ジョンが投稿した2つの比較記事を読んでいきます。


4
hgsubversion:bitbucket.org/durin42/hgsubversionをご覧ください。現在、Mercurialの開発バージョンが必要ですが、7月1日のMercurial 1.3のリリースが予定されています。
マーティンガイスラー、

4

私は現在、SVNからDVCSへの移行の過程にあり(私の発見についてブログに書いている最中、私の最初の実際のブログ作成作業中...)、私は少し調査(=グーグル)しました。私が見る限り、両方のパッケージでほとんどのことができます。gitにはいくつかのまたはより優れた高度な機能が実装されているようですが、TortoiseHgを使用すると、Mercurialの場合、Windowsとの統合の方が少し良いと思います。Git Cheetahもあることは知っていますが(両方試しました)、Mercurialソリューションはより堅牢に感じられます。

どちらもオープンソースであることがわかります(そうですか?)重要な機能が不足することはないと思います。何かが重要であれば、人々はそれを求め、人々はそれをコーディングします。

一般的な方法としては、GitとMercurialで十分だと思います。彼らは両方ともそれらを使用する大きなプロジェクト(Git-> linux kernel、Mercurial->もちろんMozilla基盤プロジェクトなど)を持っているので、どちらも本当に何かが欠けているとは思いません。

そうは言っても、それが私のブログの取り組みの素晴らしい情報源になるので、私は他の人がこれについて言うことに興味があります;-)


1
はい、どちらもオープンソースプロジェクトです。
マーティンガイスラー、


3

私はこれが答えの一部ではないことを理解していますが、そのメモでは、NetBeansやEclipseなどのプラットフォーム用の安定したプラグインの可用性が、どのツールがタスクにより適しているか、どちらのツールが適切かという役割を果たすことも考えています「あなた」に最適です。つまり、本当に CLI方式で実行したい場合を除きます。

Eclipse(およびそれに基づくすべて)とNetBeansの両方で、リモートファイルシステム(SSHなど)およびファイルの外部更新に問題が発生することがあります。これは、「シームレス」に動作するように選択したものをすべて使用するもう1つの理由です。

私も今、この質問に自分で答えようとしています。候補者をGitまたはMercurialに煮詰めました。このトピックに関する有益な情報を提供してくれて、信心深くならずにありがとうございました。


2
+1。「シームレスな」体験は、これらのものを扱っていない人が考えるよりも重要であるためです。IDEの堅固なプラグインは、多くの違いをもたらします。
eksortso 2010年


2

MercurialとGitのパフォーマンス比較に興味がある場合は、この記事をご覧ください。結論は:

GitとMercurialはどちらもかなりの数になっていますが、速度とリポジトリーのサイズの間には興味深いトレードオフがあります。Mercurialは追加と変更の両方が高速であり、リポジトリの成長を同時に制御します。Gitも高速ですが、そのリポジトリは、再パックするまで変更されたファイルで非常に急速に増大します。これらの再パックは非常に遅くなる可能性があります。しかし、パックされたリポジトリはMercurialのものよりもはるかに小さいです。



2

SVNから移行する場合は、Mercurialを使用してください。その構文はSVNユーザーにとってより理解しやすいためです。それ以外は、どちらでも問題はありません。ただし、GITチュートリアルHGinitのいずれかを選択する前に確認してください。



1

VCSシステムは複雑にする必要があると考える人もいます。彼らは、現場での用語や概念の発明を奨励しています。彼らはおそらく、このテーマに関する数多くの博士号が興味深いと思います。それらの中におそらくGitを設計したものがあります。

Mercurialは異なる考え方で設計されています。開発者はVCSについてあまり気にする必要はありません。代わりに、主な機能であるソフトウェアエンジニアリングに時間を費やすべきです。Mercurialを使用すると、ユーザーは回復不可能な間違いを犯すことなく、システムを使用して楽しく使用できます。

プロフェッショナルツールには、明確に設計された直感的なCLIが付属している必要があります。Mercurialユーザーは、奇妙なオプションなしで単純なコマンドを発行することにより、ほとんどの作業を行うことができます。Gitダブルダッシュでは、クレイジーなオプションが標準です。Mercurialは、CLIの担当者である場合に大きな利点があります(正直なところ、自尊心のあるソフトウェアエンジニアはそうである必要があります)。

例として、誤ってコミットしたとします。一部のファイルを編集するのを忘れました。Mercurialでのアクションを元に戻すには、次のように入力するだけです。

$ hg rollback

次に、システムが最後のトランザクションを取り消すというメッセージが表示されます。

Gitでは次のように入力する必要があります。

$ git reset --soft HEAD^

では、リセットの意味を理解しているとしましょう。しかし、それに加えて、「-soft」および「--hard」のリセットとは何かを理解する必要があります(直感的な推測はありますか?)。ああ、もちろん、最後に「^」の文字を忘れないでください!(今リッチーの名前でそれは...)

Mercurialのkdiff3やmeldなどのサードパーティツールとの統合も、はるかに優れています。パッチを生成して、大騒ぎせずにブランチをマージします。Mercurialには、次のように入力してアクティブにするシンプルなhttpサーバーも含まれています

hg serve

そして、他の人にあなたのリポジトリを閲覧させてください。

つまり、GitはMercurialが行うことをはるかに複雑な方法で、はるかに劣ったCLIで実行します。プロジェクトのVCSを科学研究分野に変えたい場合は、Gitを使用してください。それをあまり気にせずにVCSジョブを実行し、実際のタスクに集中したい場合は、Mercurialを使用します。


1
実際には、gitコマンドのエイリアスを作成できます。これにより、CLIの使用が簡単になります。このSuperUser(StackExchange)の質問には、たくさんの質問があります。
スポイケ

1
もちろん、いくつかの一般的なタスクを処理するためのシェルスクリプトを作成することもできます。最終的に、設計が不適切で直感に反するCLIを持つVCSに対処するためのラッパーCLIを構築していることに気付き始めます。そしてそれだけではありません。Gitは、ドキュメントとCLIメッセージに慣れるためにユーザーが最終的に学習して理解することを余儀なくされる、使い勝手がよくない、非常に多くの概念を導入しています。
Kostas 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.