最も一般的なMercurialコマンドに相当するGitですか?


89

Mercurialを使用してきましたが、Gitの簡単なデモを行いたいと思います。

Gitに相当するものは何ですか?

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

3
ここで答えを見つけているときに誰かが1つに遭遇した場合、少なくとも人気のあるDVCS間のすべての同等のコマンドを示す表を見てみたいと思います。Googleのクイック検索で見つかりませんでした。
Mark Rushakoff

回答:


104

Git-HGロゼッタ石は悪くない

ここで言及されていない2つの間にいくつか他の落とし穴があります。このリストは、私が別の方法で行ったとき(git-> hg)に自分のブログ投稿から引用されました。

水銀は .hgignore、構文:グロブはgitのの.gitignoreと同じ動作です。

Gitは .git/config~/.gitconfig使用するのgit-configが値を変更するには
水銀 .hg/hgrc~/.hgrc使用hg help -c config

Git git commit -v<br> Hg hg diff | less; hg commit

Git gitk<br> Hg hg view, or thg from [TortoiseHg][1]

Git git gui<br> Hg Mercurialには、変更セットを選択するためのGUIは付属していませんhg record。コンソールコマンドのみが付属しています。

Git git rebase<br> Hg hg rebase。以下の場合git rebase --interactiveがありますHG HISTEDITは、またはMercurialのキュー

Git git push URL ; git remote add origin URL<br> Hg hg push URL; $EDITOR .hg/hgrc ; [paths] default = URL

Git gitk, git log origin/master..HEAD<br> Hg hg outgoing

Git git format-patch RANGE<br> Hg hg email -m filename -o

Git git add . ;ドット
Hgに 注意hg add ;ドットは必要ありません。

Git git checkout REVISION-KEY<br> Hg hg update CHANGESET


空白を埋めるためだけに、Mercurialからの最も便利なコマンドのいくつか:

Hg hg record
Git git add -p; git commit

Hg hg inc [URL]
Git実際の同等物はありません。あなたは同等のことしかできないhg pull; hg log -r .:

Hg hg out URL
Git方法がわかれば追加してください。

マージ競合解決のためにhg resolve、Mercurial のコマンドには、動作を変更するいくつかのオプションがあります。

Hg hg resolve -m FILE(競合の問題を手動で修正することでファイルが解決されたことを示します)
Git git add FILE

Hg hg resolve -u FILEはファイルを未解決の
Git としてマークし、ファイルgit reset HEAD FILEをアンステージします

Hg hg resolve -l(解決済み/未解決の競合のあるファイルをリスト)
Git- git status完全にマージされたファイルは自動的にインデックスに追加され、競合のないファイル

Hg hg resolve FILE(マージ後、ファイルの再マージを試みます)私が知っている再マージに相当する
Gitはありません。


4
おそらく、これはwikiであるべきです。
KEYO

1
gitkにはMercurialのグラフィカルクローンhgviewがあります( "hg view"コマンドとは異なることに注意してください)
tonicebrian

1
小さな提案:HgとGitのテキストの入れ替え(MercurialユーザーにとってはGitであるため)
Chris S

1
けれどもhg record非常にユーザーフレンドリーではないhg crecord(からcrecord拡張子)非常に使いやすいですcursesベースのテキストUIです。
DenilsonSáMaia 14

1
@ ozzy432836私は何年もHgを使っていませんが、同等の解決策だと思います。FWIWのデフォルトのアクションはhg resolve、私がgitを好む理由の1つです。hg resolve引数を渡さない場合、デフォルトでは手動で解決されたマージが破棄されます。
richq 2016

48

注:GitとMercurialの最大の違いの1つは、インデックスまたはステージング領域が明示的に存在することです。

MercurialのGitのユーザーのために

Gitは、インデックスまたはステージング領域の概念を公開する唯一のDistributedSCMです。他の人はそれを実装して非表示にするかもしれませんが、他の場合には、ユーザーはそれに気づいても対処する必要もありません。

Mercurialのおおまかな同等物はですDirState。これは、作業コピーのステータス情報を制御して、次のコミットに含めるファイルを決定します。ただし、いずれの場合も、このファイルは自動的に処理されます。
さらに、コマンドラインでコミットするファイルを指定するか、を使用して、コミット時に選択性を高めることができますRecordExtension

インデックスの扱いに不安を感じた場合は、より良いものに切り替えています;-)


コツは、Gitを完全に活用するにはインデックスを理解する必要があるということです。2006年5月のこの記事は当時を思い出させます(そして、それは今でも真実です):

「インデックスを拒否すると、本当にgit自体が拒否されます。」

さて、この記事には、使いやすくなった多くのコマンドが含まれています(内容にあまり依存しないでください;))が、一般的な考え方は残っています。

あなたは新しい機能に取り組んでおり、ファイルに小さな変更を加え始めます。

# working, add a few lines
$ git add myFile
# working, another minor modification
$ git add myFile

この時点で、次のコミットは現在のブランチに2つの小さな変更を加えます

# working, making major modification for the new features
# ... damn! I cannot commit all this in the current branch: nothing would work

$ git commit

この時点でステージング領域(インデックス)に追加された変更のみを記録し、現在作業ディレクトリに表示されている主な変更は記録しません。

$ git branch newFeature_Branch
$ git add myFile

次のコミットでは、新しいブランチ「newFrature_Branch」のその他すべての主要な変更が記録されます。

さて、コミット対話的に、あるいは分割をしている追加する「を介して、Mercurialので利用可能な機能hg recordをインストールする必要があります:」コマンドまたは他の拡張機能RecordExtension、またはCrecordExtension
しかし、これはMercurialの通常のワークフローの一部ではありません。

Gitはコミットを一連の「ファイルコンテンツの変更」と見なし、これらの変更を一度に1つずつ追加できるようにします。
その機能とその結果を調査する必要があります。Gitパワーのほとんど(Mercurialと対照的に、マージを簡単に戻す(または問題を二分する、またはコミットを元に戻す)機能など)は、その「ファイルコンテンツ」パラダイムに由来します。


tonfa(プロファイル内:「Hg dev、pythonist」:数字...)コメントに盛り込まれました:

インデックスには基本的に「gitっぽい」ものはありません。hgは、価値があると見なされた場合、実際に、mqまたはshelveすでにその一部を実行している場合に、インデックスを使用できます。

ああ少年。ああ、またか。

まず、1つのツールを他のツールよりも美しくするためにここにいるわけではありません。私はHgが素晴らしく、非常に直感的で、優れたサポートがあります(特に、私のプラットフォームであるWindowsでは、LinuxとSolaris8または10でも動作します)。

インデックスは実際には、Linus TorvaldsがVCSで動作する方法の中央にあります。

Gitは、最初のマージを行う前であっても、1日目から明示的なインデックス更新を使用しました。それは単に私がいつも働いてきた方法です。私はダーティツリーを持っている傾向があり、コミットしたくないランダムパッチがツリーにあります。これは、次のバージョンのMakefileの更新にすぎないためです。

これで、インデックス(Gitでのみ見られる概念ではありません)「コンテンツは王様」というパラダイムの組み合わせにより、かなりユニークで「git風」になります。

gitはコンテンツトラッカーであり、ファイル名はコンテンツに関連付けられていない限り意味がありません。したがって、git add filenameの正しい動作は、ファイルのコンテンツとその名前をインデックスに追加することだけです。

注:ここでの「コンテンツ」は次のように定義されています

Gitのインデックスは基本的に次のように定義されています

  • ツリーの「コンテンツ」全体を含めるのに十分です(これにはすべてのメタデータが含まれます:ファイル名、モード、およびファイルコンテンツはすべて「コンテンツ」の一部であり、それら自体はすべて無意味です!
  • 明白で些細な(しかし非常に重要な!)ファイルシステム比較の最適化を可能にする追加の「統計」情報。

したがって、実際にはインデックスがコンテンツであると見る必要あります

内容は別パーツとしての「ファイル名」や「ファイル内容」ではありません。2つを分離することはできません
ファイル名だけでは意味がありません(ファイルの内容も必要です)。ファイルの内容自体も同様に意味がありません(到達方法を知っている必要があります)。

私が言おうとしていることは、基本的にgitではコンテンツなしでファイル名を表示できないことです。概念全体が狂っており、有効ではありません。「現実」とは無関係です。

よりよくある質問、主な利点は以下のとおりです。

  • 細かい粒度でコミット
  • コミットされていない変更をかなり長い間ツリーに保持するのに役立ちます
  • 1つのコミットに対していくつかの小さなステップを実行し、で何をしたかを確認しgit diffgit addまたはで各小さなステップを検証しますgit add -u
  • マージの競合の優れた管理ができますgit diff --basegit diff --oursgit diff --theirs
  • git commit --amendその間にインデックスが変更されていない場合は、ログメッセージのみを修正できます。

私は個人的に、この振る舞いがデフォルトであってはならないと思います、あなたは人々がテストされた、または少なくともコンパイルされた何かをコミットすることを望みます

一般的には正しいですが(「テスト済みまたはコンパイル済み」の部分について)、Gitでブランチとマージ(チェリーピッキングまたはリベース)を使用できるため、一時的なプライベートブランチ(プッシュされた部分のみ)で何度でもコミットできます。リモートの「バックアップ」レポジトリに)、パブリックブランチでこれらの「醜いコミット」を再実行しながら、すべての適切なテストを実施します。


1
インデックスには基本的に「gitっぽい」ものは何もありません。hgは、価値があると思われる場合にインデックスを使用できます。実際、mqまたはshelveはすでにその一部を行っています。私は個人的に、この動作をデフォルトにすべきではないと考えています。テストされた、または少なくともコンパイルされたものをコミットしてほしいと思います。
tonfa

2
Gitインデックスの内容については、stackoverflow.com
questions / 4084921 /…

Mercurialでは、最後のコミット(プッシュ前)はgitのインデックスのように機能します。これを修正、ロールバック、コミットメッセージを変更、またはフェーズをパブリックに変更して確定できます。
Ruslan Yushchenko

12

Mercurial:

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

相当するGit:

git init
git add -A
git commit -am "comment" # -a is not necessary along with the above add -A
git status

1
私(そして、ほとんどのgitユーザーは)を使っgit add -uてい-Aます。-uは、追跡されていない新しいファイルを無視して、追跡されているすべてのファイルの変更をステージングします。
u0b34a0f6ae 2009

3
しかし、追加・削除は、新しい人跡未踏のファイル:)追加
トンファー

3
それgit statusはと同等であることに同意しませんhg status。私はHgの初心者で、hgのステータスをGitと同じように機能させることができませんでした。
レオ・レオポルド・ヘルツ준 영

1

addremoveを使用しない場合も、ほぼ同じです。

git init # Start a project in the current directory
git status # Displays both changes and added/removed files
git commit -m "comment" # commit any uncommited changes

ただし、これらは単独で作業するときに使用するコマンドです。変更を他の人の作業、および、および関連するコマンドとマージしたい場合は、きちんとしたものに入ります。git pullgit push


さらに、最後に「git show」(「git diff」と同じ)を使用して、前回のコミット以降に変更された内容を確認します。
PHLAK 2009

2
"git show"(引数なし)は、最後のコミットでの変更表示します。「git diff」は、最後のコミット以降の変更を示します。
ダスティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.