Подтвердить что ты не робот

Git использовать передовые методы

Я использую git для управления проектом С++. Когда я работаю над проектами, мне сложно организовать изменения в фиксации при изменении вещей, связанных со многими местами.

Например, я могу изменить интерфейс класса в файле .h, который повлияет на соответствующий файл .cpp, а также на другие файлы, использующие его. Я не уверен, разумно ли положить все вещи в одну большую фиксацию.

Интуитивно, я думаю, что коммиты должны быть модульными, каждый из которых соответствует функциональному обновлению/изменению, чтобы соавторы могли выбирать вещи соответственно. Но кажется, что иногда неизбежно включать большое количество файлов и изменений, чтобы действительно функциональное изменение действительно работало.

Поиск не дал мне никаких хороших предложений или советов. Поэтому я задаюсь вопросом, может ли кто-нибудь дать мне несколько лучших практик при совершении коммитов.

PS. Я использовал git какое-то время, и я знаю, как интерактивно добавлять/переустанавливать/разделять/изменять/... То, что я прошу, это часть PHILOSOPHY.

Обновление: Спасибо за все советы. Может быть, это следует извлечь из практики. Я буду держать проблему открытой в течение некоторого времени, чтобы увидеть, есть ли дополнительные предложения.

4b9b3361

Ответ 1

Я склоняюсь к фиксации, поскольку вы предлагаете: фиксация - это логически связанный набор изменений. Мои коммиты могут быть любыми: от однострочного до изменения во всех файлах (например, добавлять/изменять уведомление об авторских правах в исходных файлах). Причина изменений не обязательно должна быть полной задачей, которую я реализую, но обычно это является важной вехой в задаче.

Если я изменил что-то, что не связано с моей текущей фиксацией, я, как правило, делаю интерактивное дополнение, чтобы отделить и несвязанные изменения, даже если это пробельный код.

Я обнаружил, что коммиты, которые просто выгружают рабочее состояние в репозиторий, делают их намного менее полезными: я не могу выполнить резервное копирование исправления для более ранней версии или легко использовать функциональные возможности утилиты в другой ветке, если коммиты повсюду.

Одной из альтернатив этого подхода является использование множества крошечных коммитов внутри ветки признаков, и после того, как вся функция будет выполнена, сделайте сложную переработку истории, чтобы убрать транзакции в логическую структуру. Но я считаю, что этот подход - это время, потраченное время.

Ответ 2

Это именно тот прецедент, для которого index, область постановки, была введена в git.

Вы можете свободно делать как можно больше изменений, не связанных друг с другом. Затем вы выбираете, что все связано, а затем делайте несколько атомных коммитов за один снимок.

Я делаю это все время. Если вы используете git-gui или любой другой GUI-клиент, вы можете выбрать не только файл, который хотите зафиксировать, но и hunks within the files, поэтому ваши коммиты максимально атомны.

Ответ 3

Я стараюсь следовать этим практикам в порядке...

  • Конец не должен прерывать сборку. Самое главное!

  • Должна быть сделана одна логическая единица изменения - будь то одна строка/символ или целый файл/класс с соответствующими изменениями в других частях кода, все еще следуя за номером 1.

    Что такое логическая единица изменения? В терминах git, если вы можете указать изменения сообщения фиксации как минимум в количестве символов, в одном предложении (без ANDs of course), и вы не можете разбить это описание на более мелкие единицы, что я называю одним блок.

  • Фиксированное сообщение должно четко указывать суть фиксации.

  • Сообщение о коммитте должно быть маленьким, обычно не более 80 символов. Более подробная разработка должна быть частью description.

Ответ 4

Отказ от ответственности: я тоже пытаюсь выяснить, что должно быть, и как окончательная история должна выглядеть. Тем не менее, я хотел поделиться некоторыми ресурсами, которые я встречал во время своих собственных исследований.

Во-первых, в проекте ядра Linux есть отличная страница Merge Strategies для того, чтобы ваш код слился вверх по течению. Они говорят о том, чтобы сделать фиксации размером с укусом; выполнение одного или нескольких рефакторингов совершает до фактических добавлений, которые вы хотите (рефакторинг должен сделать вашу функцию чище, конечно;) и другие вещи.

Моя другая любимая страница - Git Best Practices от Сета Робертсона. Это не только страница с множеством лучших практик для использования git, но также является огромным ресурсом, содержащим достаточную информацию о широком разнообразии git тем, чтобы сделать googling более подробной информацией тривиально.

Ответ 5

То, что я прошу, это часть PHILOSOPHY.

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

Следует сосредоточиться на создании атомной фиксации. Это означает, что для совершения совершения необходимо немного позаботиться о нескольких вещах:

  • Он не должен иметь никакого значения, если сделать частично
  • Не следует прерывать сборку
  • Он должен содержать хорошее сообщение и тело для отслеживания (с указанием билетов, когда это возможно)
  • Он не должен содержать много шума помех (изменение пробелов и стилей, если только для этого не является обязательным)

Обязательства должны быть сосредоточены в одно изменение, а одно изменение - только. Все, что может быть хуже, может иметь плохие побочные эффекты.

Некоторые люди могут утверждать, что это слишком много, что это непрактично. Но лучшим аргументом в пользу этого, даже для небольших компаний, является тот факт, что массовые атомные коммиты заставят ваш дизайн быть более развязанным и последовательным, потому что одно требование достичь полных оптимальных атомных коммитов - иметь здоровую кодовую базу, которая не является беспорядок.

Если вы принудительно применяете эффективные методы фиксации, вы сможете управлять инженерной культурой и самим кодом в лучшем состоянии.

Ответ 6

Иногда, когда вы делаете большой рефакторинг, неизбежно, что вы меняете много файлов в одном коммите. Когда вы меняете интерфейс класса, вам нужно изменить заголовок, реализацию и все места, которые используют интерфейс в одном коммите, потому что промежуточное состояние не будет работать.

Однако рекомендуемая практика заключается в том, чтобы изменить интерфейс без фактического введения каких-либо новых функций во-первых, проверить, что вы не нарушили существующие функции и не зафиксировали это. Затем реализуем фактическую функцию, которая требует обновленного интерфейса и фиксирует это отдельно. Вероятно, вы в конечном итоге внесете некоторые корректировки в рефакторинг в процессе, который вы будете сквоивать до первого коммита, используя интерактивную rebase.

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

Ответ 7

Что-то, что очень помогло мне в разработке того, что я совершал, и почему, переместил нашу организацию репозитория на модель "feature branch", популяризированную Git Расширение потока.

Имея ветки, описывающие каждую функцию (или обновление, bugfix и т.д.), которая работает, становится меньше об этой функции и о том, как вы собираетесь внедрять эту функцию. Например, я недавно исправил ошибку часового пояса в своей собственной ветке bugfix (например, bugfixes/gh-87), а коммиты были разделены на то, что было сделано, или на стороне сервера, и на передней панели, и на тестах. Поскольку все это происходило на ветке, посвященной этой ошибке, (с номером проблемы GitHub тоже, для ясности и автоматического закрытия), мои фиксации рассматривались как инкрементный шаги в решении этой проблемы, и поэтому потребовалось меньше объяснений, почему я их делал.

Ответ 8

Правила коммитов

Наличие хороших рекомендаций по созданию коммитов и их соблюдение значительно упрощают работу с Git и сотрудничество с другими. Проект Git предоставляет документ, в котором изложены несколько полезных советов по созданию коммитов, из которых можно отправлять исправления - вы можете прочитать его в исходном коде Git в файле Documentation/SubmittingPatches.

Во-первых, ваши материалы не должны содержать пробелов. Git предоставляет простой способ проверить это - перед фиксацией запустите git diff --check, который идентифицирует возможные ошибки пробелов и перечисляет их для вас. Вывод git diff --check: enter image description here

Если вы выполните эту команду перед фиксацией, вы сможете определить, собираетесь ли вы совершать проблемы с пробелами, которые могут раздражать других разработчиков.

Затем попробуйте сделать каждый коммит логически отдельным набором изменений. Если вы можете, постарайтесь сделать ваши изменения удобочитаемыми - не кодируйте целые выходные по пяти различным вопросам, а затем отправьте их все в виде одного массивного коммита в понедельник. Даже если вы не делаете коммит в выходные дни, используйте область подготовки в понедельник, чтобы разделить вашу работу по крайней мере на один коммит на проблему с полезным сообщением на коммит. Если некоторые изменения изменяют один и тот же файл, попробуйте использовать git add --patch для частичной обработки файлов (см. Интерактивная подготовка). Снимок проекта в конце ветки идентичен, делаете ли вы один коммит или пять, пока все изменения добавляются в какой-то момент, поэтому постарайтесь упростить задачу своим коллегам-разработчикам, когда им придется просматривать ваши изменения.

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

Последнее, что нужно иметь в виду, это сообщение о коммите. Привычка создавать качественные коммит-сообщения значительно упрощает использование и сотрудничество с Git. Как правило, ваши сообщения должны начинаться с одной строки длиной не более 50 символов, которая кратко описывает набор изменений, за которой следует пустая строка с более подробным объяснением. Проект Git требует, чтобы более подробное объяснение включало вашу мотивацию для изменения и противопоставляло его реализацию предыдущему поведению - это хорошее руководство для подражания. Напишите ваше сообщение о коммите в императиве: "Исправить ошибку", а не "Исправлена ошибка" или "Исправлена ошибка". Вот шаблон, изначально написанный Тимом Папой:

Краткая (не более 50 символов) заглавная

Более подробный пояснительный текст при необходимости. Оберните его примерно до 72 символов или около того. В некоторых контекстах первая строка рассматривается как тема письма, а остальная часть текста - как тело. Пустая строка, отделяющая сводку от тела, имеет решающее значение (если только вы не опускаете тело полностью); такие инструменты, как rebase, могут запутаться, если вы запустите их вместе.

Напишите ваше сообщение о коммите в императиве: "Исправить ошибку", а не "Исправлена ошибка" или "Исправлена ошибка". Это соглашение совпадает с сообщениями коммита, сгенерированными такими командами, как git merge и git revert.

Дальнейшие абзацы идут после пустых строк.

  • Пули тоже хорошо

  • Обычно для маркера используется дефис или звездочка, за которым следует один пробел с пробелами между ними, но здесь соглашения различаются

  • Используйте висячий отступ

Если все ваши сообщения о коммитах будут следовать этой модели, вам и разработчикам, с которыми вы сотрудничаете, будет намного проще. Проект Git имеет хорошо отформатированные сообщения коммита - попробуйте запустить git log --no-merges там, чтобы посмотреть, как выглядит красиво отформатированная история коммитов проекта.