回答:
これらの記事は役立つかもしれません:
編集:GitとMercurialを有名人と比較するのはトレンドのようです。もう1つあります。
私はMercurialに取り組んでいますが、基本的には両方のシステムは同等であると信じています。どちらも同じ抽象化で機能します。履歴を構成する一連のスナップショット(変更セット)です。各チェンジセットは、それがどこから来たか(親チェンジセット)を知っており、多くの子チェンジセットを持つことができます。最近のhg-git拡張は、MercurialとGitの間の双方向のブリッジを提供し、この点を示しています。
Gitはこの履歴グラフの変更(それに伴うすべての結果を伴う)に重点を置いていますが、Mercurialは履歴の書き換えを奨励していませんが、とにかく簡単であり、そうすることの結果は、期待どおりです(つまり、あなたが既に持っているチェンジセットを変更した場合、あなたが私からプルした場合、クライアントはそれを新しいものとして見るでしょう)。そのため、Mercurialは非破壊的なコマンドに偏っています。
軽量ブランチに関しては、それ以来Mercurialは複数のブランチを持つリポジトリをサポートしてきました...いつも思っています。複数のブランチを持つGitリポジトリーは、まさにそれです。単一のリポジトリーに複数の分岐した開発ストランドがあります。次に、Gitはこれらのストランドに名前を追加し、これらの名前をリモートで照会できるようにします。Mercurial のブックマーク拡張機能はローカル名を追加します。Mercurial1.6では、プッシュ/プルするときにこれらのブックマークを移動できます。
私はLinuxを使用していますが、TortoiseHgはWindowsの同等のGitよりも高速で優れています(貧弱なWindowsファイルシステムの使用率が高いため)。http://github.comとhttp://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が私にとってよりエレガントに見えるのは、このような違いです。
git pull <url-of-project>
。引用したメールはgit(2005)のごく初期のものです
Gitはプラットフォームであり、Mercurialは「単なる」アプリケーションです。Gitはバージョン管理されたファイルシステムプラットフォームであり、たまたまDVCSアプリが同梱されていますが、プラットフォームアプリの場合と同様に、対象アプリよりも複雑で、エッジが粗くなっています。しかし、これはgitのVCSが非常に柔軟であることを意味し、gitを使用してソース管理以外のことを実行できることは非常に豊富です。
それが違いの本質です。
Gitは、最初から、つまりリポジトリ形式から、最もよく理解されています。Scott ChaconのGit Talkは、このための優れた入門書です。内部で何が起こっているのかを知らずにgitを使用しようとすると、ある時点で混乱してしまいます(非常に基本的な機能だけに固執しない限り)。これは、毎日のプログラミングルーチンのDVCSが必要な場合は愚かに聞こえるかもしれませんが、gitの天才は、リポジトリの形式が実際には非常に単純で、gitの全体の操作を非常に簡単に理解できることです。
さらに専門性を重視した比較として、私が個人的に見た中で最高の記事はダスティン・サリングスです:
彼は実際に両方のDVCSを幅広く使用しており、両方をよく理解していて、結局gitを好むようになりました。
大きな違いはWindowsです。Mercurialはネイティブでサポートされていますが、Gitはサポートされていません。bitbucket.orgを使用して、github.comに非常によく似たホスティングを取得できます(実際には、無料のプライベートリポジトリを取得するのでさらに優れています)。私はしばらくmsysGitを使用していましたが、Mercurialに移動してとても満足しています。
基本的な切断されたリビジョン管理を探しているWindows開発者は、Hgを使用してください。HgはシンプルでWindowsシェルと十分に統合されていましたが、Gitは理解しにくいものでした。Hgをダウンロードしてこのチュートリアル(hginit.com)を実行しました-10分後、ローカルリポジトリがあり、プロジェクトに戻りました。
それらはほとんど同じです。私の観点からの最も重要な違い(つまり、一方の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は名前付きブランチで同じことを行うことができますが、それでも私は個人的にあまり好きではないクローンの使用を奨励します。
gitとmercurialには大きな違いが1つあります。が各コミットを表す方法。gitはコミットをスナップショットとして表し、mercurialはコミットを差分として表します。
これは実際にはどういう意味ですか?まあ、多くの操作はgitでより高速です。たとえば、別のコミットへの切り替え、コミットの比較などです。特に、これらのコミットが遠く離れている場合。
私の知る限り、Mercurialのアプローチの利点はありません。
何もない。どちらも同じように動作し、どちらもほぼ同じように動作します。どちらかを選択する必要がある唯一の理由は、すでに使用しているプロジェクトを支援する場合です。
1つを選択するもう1つの理由は、システムの1つだけをサポートするアプリケーションまたはサービスです。たとえば、githubのためにgitを学ぶことを選択しました。
googleの比較も(それは少し古いですが、2008年に行われました)
私がそれらを正しく理解している場合(そして私はそれぞれの専門家から遠く離れています)、それらは基本的にそれぞれ異なる哲学を持っています。私は最初に水銀を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には、同じファイル内のどの行をステージにコピーするかを決定するコマンドもあるので、これらのコミットを個別に分割することもできます。なぜそれをしたいのですか?別のコミットとして、他の人は必要なものだけをプルできるか、問題があった場合は問題のあったコミットだけを元に戻すことができるからです。
checkout -b <name>
ために使用できますgit branch <name>
versioncontrolblogには、いくつかの異なるバージョン管理システムを比較できる動的な比較表があります。
dir-a/foo.c
しdir-b/foo.c
て作業を続けると、プル後の作業が私の作業と正しくマージされることを意味しdir-b/foo.c
ますdir-a/foo.c
。
ブランチ(特に短期間のブランチ)の操作に関しては、かなり大きな違いがあります。
MercurialとGitを比較するこの記事(BranchingExplained)で説明されています。
プロジェクトにWindowsベースの共同編集者はいますか?
ある場合、Git-for-Windows GUIは扱いにくく、難しく、不親切に見えます。
対照的に、Windows上のMercurialは非常に簡単です。
昨年、私はgitとhgの両方を自分で使用するために評価し、hgを使用することにしました。私はそれがよりすっきりしたソリューションのように見えて、当時はより多くのプラットフォームでよりよく機能したと感じました。しかし、それはほとんどトスアップでした。
最近では、git-svnとSubversionクライアントとして機能する機能があるため、gitを使い始めました。これは私を勝ち取り、私は今完全にgitに切り替えました。学習曲線は少し高くなっていると思いますが(特に内部を覗く必要がある場合)、本当に素晴らしいシステムです。ジョンが投稿した2つの比較記事を読んでいきます。
私は現在、SVNからDVCSへの移行の過程にあり(私の発見についてブログに書いている最中、私の最初の実際のブログ作成作業中...)、私は少し調査(=グーグル)しました。私が見る限り、両方のパッケージでほとんどのことができます。gitにはいくつかのまたはより優れた高度な機能が実装されているようですが、TortoiseHgを使用すると、Mercurialの場合、Windowsとの統合の方が少し良いと思います。Git Cheetahもあることは知っていますが(両方試しました)、Mercurialソリューションはより堅牢に感じられます。
どちらもオープンソースであることがわかります(そうですか?)重要な機能が不足することはないと思います。何かが重要であれば、人々はそれを求め、人々はそれをコーディングします。
一般的な方法としては、GitとMercurialで十分だと思います。彼らは両方ともそれらを使用する大きなプロジェクト(Git-> linux kernel、Mercurial->もちろんMozilla基盤プロジェクトなど)を持っているので、どちらも本当に何かが欠けているとは思いません。
そうは言っても、それが私のブログの取り組みの素晴らしい情報源になるので、私は他の人がこれについて言うことに興味があります;-)
DVCSに関するInfoQのガイドには、git、Mercurial、Bazaarに関する優れた包括的な比較表とグラフがあります。
私はこれが答えの一部ではないことを理解していますが、そのメモでは、NetBeansやEclipseなどのプラットフォーム用の安定したプラグインの可用性が、どのツールがタスクにより適しているか、どちらのツールが適切かという役割を果たすことも考えています「あなた」に最適です。つまり、本当に CLI方式で実行したい場合を除きます。
Eclipse(およびそれに基づくすべて)とNetBeansの両方で、リモートファイルシステム(SSHなど)およびファイルの外部更新に問題が発生することがあります。これは、「シームレス」に動作するように選択したものをすべて使用するもう1つの理由です。
私も今、この質問に自分で答えようとしています。候補者をGitまたはMercurialに煮詰めました。このトピックに関する有益な情報を提供してくれて、信心深くならずにありがとうございました。
mercurialとgitのさらに興味深い比較:MercurialとGit。主な焦点は内部と分岐プロセスへの影響です。
MercurialのWebサイトには、2つのシステムの類似点と相違点についての優れた説明があり、語彙と基本的な概念の違いを説明しています。長い間gitユーザーとして、それはMercurialの考え方を理解するのに本当に役立ちました。
SVNから移行する場合は、Mercurialを使用してください。その構文はSVNユーザーにとってより理解しやすいためです。それ以外は、どちらでも問題はありません。ただし、GITチュートリアルとHGinitのいずれかを選択する前に確認してください。
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を使用します。