Зафиксировать только часть файла в Git
когда я делаю изменения в файле в Git, как я могу зафиксировать только некоторые изменения?
например, как я могу зафиксировать только 15 строк из 30 строк, которые были изменены в файле?
22 ответов
можно использовать git add --patch <filename>
(или -p
для краткости), и git начнет разбивать ваш файл на то, что он считает разумными "кусками" (частями файла). Затем он предложит вам этот вопрос:
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
Вот описание каждого варианта:
- y этап этот кусок для следующего коммита
- n не ставьте этот кусок для следующего коммита
- q выход; не этап этот ломоть или любой из оставшихся ломоть
- a этап этот кусок и все последующие куски в файле
- d не ставьте этот кусок или любой из более поздних кусков в файле
- g выберите кусок, чтобы перейти к
- / поиск ломоть, соответствующий данному regex
- j оставьте этот кусок нерешенным, см. Следующий нерешенный Ханк!--18-->
- J оставьте этот кусок нерешенным, см. следующий кусок
- k оставьте этот кусок нерешенным, см. предыдущий нерешенный кусок
- K оставьте этот кусок нерешенным, см. предыдущий кусок
- s разделить текущий кусок на меньшие куски
- e вручную редактировать текущий ломоть
- ? печать красавчик помогите!--18-->
если файл еще не находится в репозитории, вы можете сначала сделать git add -N <filename>
. После этого вы можете продолжить с git add -p <filename>
.
после этого вы можете использовать:git diff --staged
чтобы проверить, что вы устроили правильного измененияgit reset -p
к unstage ошибочно добавлены кускиgit commit -v
для просмотра фиксации во время редактирования сообщения фиксации.
обратите внимание, что это сильно отличается, чем git format-patch
команда, целью которой является анализ данных фиксации в .patch
файлы.
ссылка на будущее:https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging
можно использовать git add --interactive
или git add -p <file>
, а потом git commit
(не git commit -a
); см. интерактивный режим на git-add manpage, или просто следуйте инструкциям.
современный Git также git commit --interactive
(и git commit --patch
, который является ярлыком для опции исправления в интерактивной фиксации).
если вы предпочитаете делать это из GUI, вы можете использовать git-gui. Вы можете просто пометить куски, которые вы хотите включить в commit. Я лично найти его проще, чем с помощью git add -i
. Другие Git GUIs, такие как QGit или GitX, также могут иметь эту функциональность.
git графический интерфейс предоставляет эту функциональность в представлении diff. Просто щелкните правой кнопкой мыши строку(ы), которые вас интересуют, и вы должны увидеть пункт меню "stage this line to commit".
Я считаю, что git add -e myfile
Это самый простой способ (мои предпочтения, по крайней мере), так как он просто открывает текстовый редактор и позволяет выбрать, какую строку вы хотите поставить, а какую нет.
Относительно команд редактирования:
добавлены содержания:
добавленное содержимое представлено строками, начинающимися с"+". Вы можете предотвратить промежуточное размещение любых строк добавления, удалив их.
удалены содержания:
отображается удаленное содержимое строками, начинающимися с" -". Вы можете предотвратить их удаление путем преобразования "-" в "" (пробел).
изменен содержания:
измененный контент представлен строками " - "(удаление старого контента), за которыми следуют строки " + " (добавление заменяющего контента). Вы можете предотвратить промежуточную модификацию, преобразовав " - "строки В ""и удалив" +" русло. Остерегайтесь, что изменение только половины пары, вероятно, приведет к путанице изменения индекса.
все подробности о git add
доступны git --help add
Если вы используете Vim, вы можете попробовать отличный плагин под названием беглец.
вы можете увидеть разницу файла между рабочей копией и индексом с помощью :Gdiff
, а затем добавьте строки или куски в индекс, используя классические команды Vim diff, такие как dp
. Сохраните изменения в индексе и зафиксируйте с помощью :Gcommit
, а вы закончите.
Я настоятельно рекомендую использовать SourceTree от компании Atlassian. (Это бесплатно.) Это делает это тривиальным. Вы можете быстро и легко создавать отдельные куски кода или отдельные строки кода.
стоит отметить, что использовать git add --patch
на новый файл нужно сначала добавить файл в индекс с git add --intent-to-add
:
git add -N file
git add -p file
когда у меня много изменений и в конечном итоге будет создано несколько коммитов из изменений, я хочу временно сохранить начальную точку перед постановкой вещей.
такой:
$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop
Whymarrh - это то, что я обычно делаю, за исключением того, что иногда есть много изменений, и я могу сказать, что могу сделать ошибку при постановке вещей, и я хочу, чтобы зафиксированное состояние я мог вернуться на второй проход.Если вы используете emacs, взгляните на Magit, который предоставляет интерфейс git для emacs. Он поддерживает постановка скряга (части файлов) довольно хорошо.
Как и ответ jdsumsion, вы также можете спрятать свою текущую работу, но затем использовать difftool как meld, чтобы вытащить выбранные изменения из тайника. Таким образом, вы даже можете редактировать куски вручную очень легко, что немного боли, когда в git add -p
:
$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop
использование метода stash дает вам возможность протестировать, если ваш код все еще работает, перед его фиксацией.
для тех, кто использует Расширения Git:
в окне фиксация выберите файл, который вы хотите частично зафиксировать, затем выберите текст, который вы хотите зафиксировать в правой панели, затем щелкните правой кнопкой мыши на выделении и выберите "этап выбранных строк" из контекстного меню.
Intellij IDEA (и я думаю, что все другие продукты серии) встроены в поддержку частичных коммитов с v2018.1
ВИМ-gitgutter плагин может этап куски, не выходя из редактора vim с помощью
:GitGutterStageHunk
кроме этого, он предоставляет другие интересные функции, такие как столбец знака diff, как в некоторых современных IDEs
если только часть ломоть должен быть поставлен ВИМ-беглец
:Gdiff
позволяет выбор визуального диапазона, то :'<,'>diffput
или :'<,'>diffget
для стадии / возврата отдельных изменений строки.
пробовал git add -p filename.x
, но на mac я нашел gitx (http://gitx.frim.nl/ или https://github.com/pieter/gitx), чтобы было намного проще совершать именно те строки, которые я хотел.
С TortoiseGit:
щелкните правой кнопкой мыши на файл и использовать
Context Menu → Restore after commit
. Это создаст копию файла, как он есть. Затем вы можете отредактировать файл, например, в TortoiseGitMerge и отменить все изменения, которые вы не хотите совершать. После сохранения этих изменений вы можете зафиксировать файл.
git-meld-index - цитирую с сайта:
git-meld-index запускает meld-или любой другой git difftool(kdiff3, diffuse и т. д.) -- чтобы вы могли интерактивно вносить изменения в индекс git (также известный как промежуточная область git).
это похоже на функциональность git add-p и git add --interactive. В некоторых случаях meld проще / быстрее использовать, чем git add-p. Это потому, что meld позволяет вам, например, кому:
- Посмотреть больше контекста
- посмотреть внутрилинейные различия
- редактировать вручную и посмотреть "live" diff обновления (обновляется после каждого нажатия клавиши)
- перейдите к изменению, не говоря " n " к каждому изменению, которое вы хотите пропустить
использование
в репозитории git запустите:
git meld-index
вы увидите, что meld (или ваш настроенный git difftool) всплывает с:
левый: временные файлы contining каталог, скопированный с вашего рабочего дерева
право: временный каталог с содержимым индекса. Это также включает файлы, которые еще не включены в индекс, но изменены или не отслежены в рабочей копии-в этом случае вы увидите содержимое файла из HEAD.
редактировать индекс (правая сторона)до счастливого. Не забудьте сохранить, когда это необходимо.
когда вы закончите, закройте meld, и Git-meld-index обновит индекс, соответствующий содержимому временного каталога в правой части meld, который вы только что отредактировали.
As один ответ выше показывает, Вы можете использовать
git add --patch filename.txt
или короткая форма
git add -p filename.txt
... но для файлов, уже находящихся в вашем репозитории, есть, в s намного лучше использовать флаг --patch непосредственно в команде commit (если вы используете достаточно недавнюю версию git):
git commit --patch filename.txt
... или, опять же, короткая форма
git commit -p filename.txt
... и затем, используя упомянутые ключи (y/n и т. д.), Для выбора строк, которые будут включены в совершать.
на Атом пользователи, пакет github включает интерактивную постановку, в стиле git gui
. Для ярлыков см. пакет документация.
использование Atom позволяет работать с темой, которая имеет темный фон (по умолчанию,git gui
имеет белый фон).
добавление предыдущего ответа, если вы предпочитаете использовать командную строку, введите git add -e myfile
дает вам возможность выбрать построчно, что вы хотите совершить, потому что эта команда откроет редактор с различиями, например, так:
как вы можете знать строки, которые начинаются с +
будут использованы, строки, которые начинаются с -
несколько удалений. Итак:
- чтобы не создавать добавление, просто удалите это линия.
- не удаления просто заменить
-
С места.
This is what git add -h
говорит о добавлении файлов таким образом (патчинг файлов):
добавленный контент Добавленный контент представлен строками, начинающимися с"+". Вы можете предотвратите постановку любых строк добавления, удалив их.
удалены содержания: Удаленное содержимое представлено строками, начинающимися с" -". Вы можете предотвратите их удаление путем преобразования "-" в a " " (пространство.)
изменен содержания: Измененное содержимое представлено строками " - " (удаление старого content), за которым следуют строки " + " (добавление содержимого замены). Вы можете предотвратить промежуточную модификацию, преобразовав строки " - " в ""и удаление "+" строк. Помните, что изменение только половина пара, вероятно, представит запутанные изменения индекса.
внимание: не изменяйте содержимое файла, это не лучшее место для этого. Просто измените операторы удаленных или добавленных строк.
если это на мой взгляд git gui
лучший инструмент stage
/commit
несколько строк из
1. Ломоть мудрый:
- Выберите файл
unstagged Changes
раздел - Правой Кнопкой Мыши кусок кода, который должен быть поставлен
- выберите
Stage Hunk for commit
2. Линия мудрая:
- Выберите файл
- выберите строку / строки должны быть расположены
- выберите
Stage Lines for commit
3. Если вы хотите поместить полный файл, кроме пары строк:
- Выберите файл
unstagged Changes
раздел - нажмите
Ctrl+T (Stage file to commit)
- выбранный файл теперь перемещается в
Staged Changes
раздел - выберите строку / строки должны быть расположены
- выберите
UnStage Lines for commit
ГИТ-Кола является отличным GUI, а также имеет эту встроенную функцию. Просто выберите строки для этапа и нажмите S. Если выбор не сделан,то полный кусок поставлен.