Git эквиваленты наиболее распространенных команд Mercurial? - PullRequest
88 голосов
/ 20 сентября 2009

Я использовал 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?

Ответы [ 4 ]

103 голосов
/ 20 сентября 2009

Розеттский камень Git-HG неплох - 1002 *

Есть несколько других ошибок, не упомянутых там. Этот список был взят из моего собственного блога, когда я пошел другим путем (git -> hg).

Hg .hgignore, синтаксис: glob такое же поведение, как и у git .gitignore.

Git .git / config, ~ / .gitconfig, используйте git-config для изменения значений
Hg .hg / hgrc, ~ / .hgrc, используйте hg help -c config

Git git commit -v
Hg Hg diff | Меньше; hg commit

Git Gitk
рт.ст. рт.ст. или thg из TortoiseHg

Git GIT GUI
Hg Mercurial не предоставляет графический интерфейс для выбора наборов изменений, только консольная команда hg record.

Git git rebase
Hg hg rebase . Для git rebase --interactive есть hg histedit или Mercurial Queues

Git git push URL; git remote добавить источник URL
Hg hg push URL; $ РЕДАКТОР .hg / hgrc; [paths] default = URL

Git Gitk, журнал происхождения Git / master .. HEAD
рт. Ст. рт. Ст.

Git git format-patch RANGE
Hg hg электронная почта -m имя файла -o

Git git add. ; Обратите внимание на точку
рт.ст. рт.ст. добавить; Точка не нужна.

Git git checkout REVISION-KEY
рт.ст. рт.ст. обновление CHANGESET


Просто, чтобы заполнить пробелы, некоторые из самых полезных команд из Mercurial:

рт.ст. рт.ст. запись
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 resol -m FILE (помечает файл как разрешенный путем ручного решения проблемы конфликта)
Git git add FILE

Hg hg resolve -u FILE помечает файл как неразрешенный
Git git reset HEAD FILE для удаления файла

Hg hg resol -l (выводит список файлов с разрешенными / неразрешенными конфликтами)
Git git status - файлы, которые были объединены корректно, автоматически добавляются в индекс, те, у которых нет конфликтов

Hg hg разрешения FILE (после объединения пытается повторно объединить файл)
Git нет эквивалента повторного слияния, о котором я знаю.

48 голосов
/ 20 сентября 2009

Примечание: одно из самых больших различий между Git и Mercurial заключается в явном присутствии index или области подготовки .

С Mercurial для Git User :

Git является единственным DistributedSCM , который раскрывает понятие индекса или промежуточной области. Другие могут реализовать и скрыть это, но ни в каком другом случае пользователь не знает и не должен иметь дело с этим.

Грубым эквивалентом Mercurial является DirState, который управляет информацией о состоянии рабочей копии для определения файлов, которые будут включены в следующий коммит. Но в любом случае этот файл обрабатывается автоматически.
Кроме того, можно быть более избирательным во время фиксации, либо указав файлы, которые вы хотите зафиксировать в командной строке, либо используя RecordExtension.

Если вам неудобно работать с индексом, вы переходите к лучшему; -)


Хитрость в том, что вам действительно нужно понимать индекс, чтобы полностью использовать Git. Как эта статья за май 2006 года напоминает нам тогда (и это все еще верно сейчас):

«Если вы отрицаете Индекс, вы действительно отрицаете сам мерзавец».

Теперь эта статья содержит много команд, которые теперь проще в использовании (поэтому не слишком полагайтесь на ее содержимое;)), но общая идея остается:

Вы работаете над новой функцией и начинаете вносить незначительные изменения в файл.

# 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 рассматривает коммит как серию « содержимого файла изменений», и позволяет вам добавлять эти изменения по одному.
Вы должны изучить эту особенность и ее последствия: Большая часть силы Git (например, способность легко отменить слияние (или разделить задачу, или отменить коммит) , вопреки Mercurial ) исходит из этой парадигмы «содержимое файла».


tonfa (в профиле: "Hg dev, pythonist": цифры ...) включили, в комментариях:

В индексе нет ничего по сути "мерзавца", hg может использовать индекс, если он считается ценным, на самом деле mq или shelve уже делают часть этого.

О, мальчик. Здесь мы идем снова.

Во-первых, я здесь не для того, чтобы один инструмент выглядел лучше другого. Я нахожу Hg отличным, очень интуитивно понятным, с хорошей поддержкой (особенно на Windows, моей основной платформе, хотя я работаю на Linux и Solaris8 или 10 тоже).

Индекс на самом деле находится спереди и по центру в пути Линус Торвальдс работает с VCS :

Git использовал явные обновления индекса с первого дня, даже до первого слияния. Это просто, как я всегда работал. У меня, как правило, грязные деревья, с некоторым случайным патчем в моем дереве, который я не хочу зафиксировать, потому что это просто обновление Makefile для следующей версии

Теперь комбинация индекса (что не встречается только в Git), и парадигма «контент - король» делает ее довольно уникальной и ГИТ-иш "

git - это средство отслеживания содержимого , и имя файла не имеет значения, если оно не связано с его содержимым. Следовательно, единственное вменяемое поведение для git add filename - это добавление содержимого индекса и его имени в индекс.

Примечание: «содержание» здесь определяется следующим образом :

Индекс Git в основном очень определяется как

  • достаточно, чтобы содержать общее " содержимое " дерева (и это включает все метаданные: имя файла, режим и содержимое файла - все части из «содержание», и все они сами по себе бессмысленны! )
  • дополнительная информация "stat" для очевидной и тривиальной (но чрезвычайно важной!) Оптимизации сравнения файловой системы.

Так что вы действительно должны видеть индекс как , являющийся содержимым .

Контент не является «именем файла» или «контентом файла» как отдельные части. Вы действительно не можете разделить два .
Имена файлов сами по себе не имеют смысла (они тоже должны иметь содержимое файла), а содержимое файла само по себе также бессмысленно (вы должны знать, как его достичь).

Я пытаюсь сказать, что git принципиально не позволяет вам видеть имя файла без его содержимого. Все понятие безумно и не действует. Это не имеет отношения к «реальности».

С FAQ , основными преимуществами являются:

  • коммит с мелкой гранулярностью
  • поможет вам сохранить незафиксированные изменения в вашем дереве в течение достаточно длительного времени
  • выполните несколько небольших шагов для одного коммита, проверив, что вы сделали с git diff, и подтвердите каждый маленький шаг с помощью git add или git add -u.
  • позволяет отлично управлять конфликтами слияния: git diff --base, git diff --ours, git diff --theirs.
  • позволяет git commit --amend изменять только сообщение журнала, если за это время индекс не был изменен

Лично я считаю, что такое поведение не должно быть по умолчанию, вы хотите, чтобы люди совершали что-то проверенное или хотя бы скомпилированное

Хотя в целом вы правы (в отношении "протестированной или скомпилированной" части), способ, которым Git позволяет вам выполнять ветвление и слияние (выбор вишни или перебазирование), позволяет фиксировать так часто, как вы хотите, во временной частной ветке. (выдвигается только в удаленный «резервный» репозиторий), при этом повторяя эти «уродливые коммиты» в публичной ветке со всеми правильными тестами на месте.

12 голосов
/ 20 сентября 2009

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 голос
/ 20 сентября 2009

Это примерно то же самое, без 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 pull и git push и соответствующими командами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...