Недавно я обнаружил, что Git patch
использует add
команду, и должен сказать, что это действительно фантастическая функция. Я также обнаружил, что большой кусок можно разделить на более мелкие куски, нажавs клавишу, что повышает точность фиксации. Но что, если я хочу еще большей точности, если разделенный кусок не достаточно мал?
Например, рассмотрим этот разделенный кусок:
@@ -34,12 +34,7 @@
width: 440px;
}
-/*#field_teacher_id {
- display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
width: 300px;
}
Как я могу добавить удаление комментариев CSS только к следующему коммиту? s
Опция больше не доступна!
-
символы, и Git пожаловался, что мой патч не применяется.git add -p
и редактировали кусок сe
этим, это должно влиять только на то, что поставлено, а не на ваше рабочее дерево.Допустим, ваша
example.css
внешность выглядит так:Теперь давайте изменим селекторы стиля в среднем блоке, и пока мы на нем, удалим старый закомментированный стиль, который нам больше не нужен.
Это было легко, теперь давайте сделаем коммит. Но подождите, я хочу сохранить логическое разделение изменений в управлении версиями для простого пошагового анализа кода, чтобы моя команда и я могли легко искать в истории коммитов специфические особенности.
Удаление старого кода логически отделено от другого изменения селектора стиля. Нам понадобятся два разных коммита, поэтому давайте добавим фрагменты для патча.
Ой, похоже, изменения слишком близки, так что git объединил их вместе.
Даже попытка разделить его нажатием sприводит к тому же результату, потому что разделение недостаточно детально для наших изменений точности. Неизменные строки требуются между измененными строками, чтобы git мог автоматически разбивать патч.
Итак, давайте вручную отредактируем его, нажавe
Git откроет патч в нашем редакторе выбора.
Давайте рассмотрим цель:
Мы хотим разделить это на два коммита:
Первый коммит включает удаление некоторых строк (удаление комментариев).
Чтобы удалить закомментированные строки, просто оставьте их в покое, они уже отмечены для отслеживания удалений в управлении версиями, как мы хотим.
-/*#field_teacher_id {
- display: block;
-} */
Второй коммит - это изменение, которое отслеживается путем записи как удалений, так и добавлений:
Удаления (старые строки выбора удалены)
Чтобы сохранить старые строки селектора (не удаляйте их во время этого коммита), мы хотим ...
... что буквально означает замену
-
знака минус насимвол пробела .
Итак, эти три строки ...
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
... станет ( обратите внимание на один пробел в первой из всех трех строк):
form.table-form #field_teacher + label,
form.table-form #field_producer_distributor + label {
Дополнения (добавлена новая строка выбора)
Чтобы не обращать внимания на новую строку селектора, добавленную во время этого коммита, мы хотим ...
... что буквально означает удалить всю строку:
+#user-register form.table-form .field-type-checkbox label {
(Бонус: если вы используете vim в качестве редактора, нажмите, ddчтобы удалить строку. Пользователи Nano нажмите Ctrl+ K)
Ваш редактор должен выглядеть так, когда вы сохраняете:
Теперь давайте передадим.
И просто чтобы убедиться, давайте посмотрим на изменения с последнего коммита.
Отлично - вы можете видеть, что в этот атомарный коммит были включены только удаления. Теперь давайте закончим работу и передадим все остальное.
Наконец, вы можете видеть, что последний коммит включает только изменения селектора.
источник
+
на#
. Результат тот же, но, возможно, вам неудобно удалять (и вы не можете вернуться), или вы хотите поэкспериментировать перед сохранением.r
#
больше, чем плюс xDЕсли вы можете использовать git gui, это позволит вам поэтапно вносить изменения. К сожалению, я не знаю, как это сделать из командной строки - или даже если это возможно.
Еще одна опция, которую я использовал в прошлом, - откатить часть изменений (оставить редактор открытым), зафиксировать нужные биты, отменить и повторно сохранить из редактора. Не очень элегантно, но выполняет свою работу. :)
РЕДАКТИРОВАТЬ (использование git-gui):
Я не уверен, что git-gui одинаков в версиях msysgit и linux, я использовал только msysgit. Но при условии, что это то же самое, когда вы запускаете его, есть четыре панели: верхняя левая панель - это ваш рабочий каталог, нижняя левая - ваши этапы, верхний правый - это diff для выбранного файла (будь это рабочий каталог) или в постановке), а справа внизу - описание коммита (подозреваю, что вам это не понадобится). Когда вы нажмете файл в правом верхнем углу, вы увидите diff. Если вы щелкните правой кнопкой мыши на строке различий, вы увидите контекстное меню. Следует отметить два параметра: «Стадия для фиксации» и «Строка для фиксации». Вы продолжаете выбирать «Стадия для фиксации» в строках, которые хотите зафиксировать, и все готово. Вы даже можете выбрать несколько строк и поставить их, если хотите.
Что касается фиксации, вы можете использовать либо графический интерфейс, либо командную строку.
источник
git-gui
но понятия не имею, как добиться того, что вы описываете.Один из способов сделать это - пропустить кусок,
git add
все , что вам нужно, а затемgit add
снова запустить . Если это единственный кусок, вы сможете разделить его.Если вы беспокоитесь о порядке коммитов, просто используйте
git rebase -i
.источник
git add -p
снова, но я не могу разделить это. Я получаю это:Stage this hunk [y,n,q,a,d,/,e,?]?
и затем, нажимая 's', печатает помощь. Кстати, вы имели в видуadd patch
, неpatch add
? Или естьgit patch
плагин, который я должен установить?git rebase -i
. Который является более гибким, чемcommit --amend