Когда я вношу изменения в файл в Git, как я могу выполнить только некоторые из изменений?
Например, как я могу выполнить только 15 строк из 30 строк, которые были изменены в файле?
Когда я вношу изменения в файл в Git, как я могу выполнить только некоторые из изменений?
Например, как я могу выполнить только 15 строк из 30 строк, которые были изменены в файле?
Вы можете использовать git add --patch <filename>
(или -p
для краткости), и git начнет разбивать ваш файл на то, что он считает разумными "порциями" (частями файла). Затем он подскажет вам этот вопрос:
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
Вот описание каждой опции:
Если файл еще не находится в хранилище, вы можете сначала сделать git add -N <filename>
. После этого вы можете продолжить с помощью git add -p <filename>
.
После этого вы можете использовать:
git diff --staged
чтобы убедиться, что вы поставили правильные измененияgit reset -p
чтобы расстегнуть ошибочно добавленные фрагментыgit commit -v
для просмотра вашего коммита во время редактирования сообщения коммита. Обратите внимание, что это сильно отличается от команды git format-patch
, целью которой является анализ данных .patch
файлах .patch
.
Ссылка на будущее: Git Tools - Интерактивная постановка
Вы можете использовать git add --interactive
или git add -p <file>
, а затем git commit
( не git commit -a
); см. интерактивный режим в git-add manpage или просто следуйте инструкциям.
Современный Git также имеет git commit --interactive
(и git commit --patch
, который является ярлыком для параметра патча в интерактивной фиксации).
Если вы предпочитаете делать это из графического интерфейса, вы можете использовать git-gui. Вы можете просто отметить куски, которые вы хотите включить в фиксацию. Мне лично легче, чем использовать git add -i
. Другие Git GUI, такие как QGit или GitX, также могут иметь эту функциональность.
git gui предоставляет эту функциональность под видом diff. Просто щелкните правой кнопкой мыши интересующую вас линию, и вы увидите пункт меню "Эта строка для фиксации".
Я считаю, что git add -e myfile
- самый простой способ (по крайней мере, мое предпочтение), поскольку он просто открывает текстовый редактор и позволяет вам выбрать, какую строку вы хотите выполнить, а какая строка у вас нет.
Что касается команд редактирования:
добавленный контент:
Добавленное содержимое представлено строками, начинающимися с "+". Вы можете предотвратить создание любых линий сложения, удалив их.
удаленный контент:
Удаленное содержимое представлено строками, начинающимися с "-". Вы можете предотвратить их удаление путем преобразования "-" в "" (пробел).
измененное содержимое:
Измененное содержимое представлено линиями "-" (удаление старого содержимого), за которым следуют строки "+" (добавление замещающего содержимого). Вы можете предотвратить установку модификации путем преобразования строк "-" в "" и удаления "+", линий. Помните, что изменение только половины пары, скорее всего, приведет к запутывающим изменениям индекса.
Каждая информация о git add
доступна на git --help add
Если вы используете vim, вы можете попробовать отличный плагин под названием fugitive.
Вы можете увидеть diff файла между рабочей копией и индексом с помощью :Gdiff
, а затем добавить строки или столбцы в индекс, используя классические команды vim diff, такие как dp
. Сохраните изменения в индексе и скопируйте с помощью :Gcommit
, и все готово.
Очень хорошие вступительные видеоролики здесь (см. часть 2).
Я настоятельно рекомендую использовать 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
Ответ Whymarh - это то, что я обычно делаю, за исключением того, что иногда происходит множество изменений, и я могу сказать, что могу совершить ошибку во время постановки вещей, и я хочу, чтобы какое-то состояние я мог отступить на второй проход.
Если вы используете emacs, посмотрите Magit, который предоставляет интерфейс git для emacs. Он хорошо поддерживает промежуточных фрагментов (части файлов).
Как и в случае с jdsumsion, вы также можете спрятать свою текущую работу, но затем используйте difffool, например 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
vim-gitgutter плагин может создавать ханки, не выходя из редактора vim, используя
:GitGutterStageHunk
Помимо этого, он предоставляет другие интересные функции, такие как столбец с разным знаком, как в некоторых современных IDE
Если только часть hunk должна быть поставлена vim-fugitive
: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 и отмените все изменения, которые вы не хотите совершать. После сохранения этих изменений вы можете зафиксировать файл.
Для emacs также есть gitsum
git-meld-index - цитирование с веб-сайта:
git -meld-index запускает meld - или любой другой git diffftool (kdiff3, diffuse и т.д.) - чтобы вы могли интерактивно изменять изменения индекса git (также известного как git).
Это похоже на функциональность git add -p и git add --interactive. В некоторых случаях meld легче/быстрее использовать, чем git add -p. Это потому, что meld позволяет вам, например,:
Использование
В репозитории git запустите:
git meld-index
Вы увидите, что meld (или настроенный git diffftool) появляется с помощью
LEFT: файлы временного каталога, скопированные из рабочего дерева
ВПРАВО: временный каталог с содержимым индекса. Это также включает файлы, которые еще не находятся в индексе, но изменены или не проверены в рабочей копии - в этом случае вы увидите содержимое файла из HEAD.
Отредактируйте индекс (справа) до тех пор, пока он не станет счастливым. Не забудьте сохранить при необходимости.
Когда вы закончите, закройте meld и git -meld-index обновит индекс, чтобы он соответствовал содержимому временного каталога в правой части команды meld, которую вы только что отредактировали.
Как один ответ выше показывает, вы можете использовать
git add --patch filename.txt
или короткая форма
git add -p filename.txt
... но для файлов, уже находящихся в вашем репозитории, есть намного лучше использовать флаг -patch для команды commit (если вы используете достаточно недавнюю версию git):
git commit --patch filename.txt
... или, опять же, короткая форма
git commit -p filename.txt
... и затем используя указанные ключи (y/n и т.д.), для выбора строк, которые должны быть включены в фиксацию.
Для пользователей Atom пакет github включает интерактивную постановку в стиле git gui
. Для ярлыков см. Документацию к упаковке.
Использование Atom позволяет работать с темой с темным фоном (по умолчанию git gui
имеет белый фон).
Добавляя предыдущий ответ, если вы предпочитаете использовать командную строку, введите git add -e myfile
дает вам выбор, чтобы выбрать строку за строкой, которую вы хотите зафиксировать, потому что эта команда откроет редактор с различиями, например:
Как вы можете видеть, строки, начинающиеся с +
- это addtions, строки, которые начинаются с -
это удаления. Так:
-
пробелом
, Это то, что git add -h
говорит о добавлении файлов таким образом (файлы исправлений):
добавленный контент Добавленный контент представлен строками, начинающимися с "+". Вы можете предотвратить установку любых линий сложения, удалив их.
Удаленный контент: Удаленное содержимое представлено строками, начинающимися с "-". Вы можете предотвратить их удаление путем преобразования "-" в "" (пробел).
измененное содержимое. Измененный контент представлен линиями "-" (удаление старого содержимого), а затем строки "+" (добавление замещающего содержимого). Вы можете предотвратить установку модификации путем преобразования строк "-" в "" и удаления строк "+". Помните, что изменение только половины пары, вероятно, приведет к запутывающим изменениям индекса.
Внимание: не изменяйте содержимое файла, это нехорошее место для этого. Просто измените операторы удаленных или добавленных строк.
Если на платформе Windows
, на мой взгляд, git gui
- лучший инструмент для stage
/commit
нескольких строк из unstaged
файла
1. Хенк мудрый:
unstagged Changes
Stage Hunk for commit
2. Строка:
unstagged Changes
Stage Lines for commit
3. Если вы хотите создать полный файл, кроме пары строк:
unstagged Changes
Ctrl+T (Stage file to commit)
Staged Changes
РазделUnStage Lines for commit
git-cola - отличный графический интерфейс, а также встроенная функция. Просто выберите линии для сцены и нажмите S. Если выбор не производится, выполняется полный кусок.