Примечание. Одно из самых больших различий между Git и Mercurial - это явное присутствие index или промежуточной области.
Из Mercurial для пользователей Git:
Git - единственный DistributedSCM, который раскрывает концепцию индекса или промежуточной области. Другие могут реализовать и скрыть это, но ни в каком другом случае пользователь не знает об этом и не должен иметь с этим дело.
Примерный эквивалент Mercurial - это DirState
, который управляет информацией о состоянии рабочей копии для определения файлов, которые нужно быть включенным в следующий коммит. Но в любом случае этот файл обрабатывается автоматически.
Кроме того, можно быть более избирательным во время фиксации, указав файлы, которые вы хотите зафиксировать, в командной строке или с помощью _ 2_.
Если вам неудобно работать с индексом, вы переходите к лучшему ;-)
Хитрость в том, что вам действительно нужно понимать индекс, чтобы полностью использовать Git. Как напоминает нам эта статья от мая 2006 г. (и это актуально и сейчас):
«Если вы отрицаете Индекс, вы действительно отрицаете сам 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
' или других расширений: вам нужно будет установить _ 7_ или 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 позволяет вам выполнять ветвление и слияние (выбор вишни или ребазирование), позволяет вам делать коммиты так часто, как вы хотите, во временной частной ветке (только с принудительной отправкой). в удаленный «резервный» репозиторий), повторяя эти «уродливые коммиты» в общедоступной ветке со всеми необходимыми тестами.
person
VonC
schedule
20.09.2009