Когда я делаю изменения в файле в Git, как я могу зафиксировать только некоторые изменения?
Например, как я могу зафиксировать только 15 строк из 30 строк, которые были изменены в файле?
git
git-commit
freddiefujiwara
источник
источник
git gui
=git add -e
>git add -i -p
; с точки зрения удобства:git gui
>git add -i -p
>git add -e
. Итак: выбирайте,git gui
когда у вас есть доступ к X. Выберитеgit add -i -p
для простых вещей, а когда у вас нет или вы не хотите использовать X.git add -e
для сложной постановки без X.Ответы:
Вы можете использовать
git add --patch <filename>
(или-p
для краткости), и git начнет разбивать ваш файл на то, что он считает разумными "кусочками" (частями файла). Затем он подскажет вам этот вопрос:Вот описание каждой опции:
Если файл еще не в хранилище, вы можете сначала сделать
git add -N <filename>
. После этого вы можете продолжитьgit add -p <filename>
.После этого вы можете использовать:
git diff --staged
чтобы убедиться, что вы поставили правильные измененияgit reset -p
расшатать ошибочно добавленные кускиgit commit -v
чтобы просмотреть ваш коммит во время редактирования сообщения о коммите.Обратите внимание, что это сильно отличается от
git format-patch
команды, целью которой является анализ данных фиксации в.patch
файлы.Ссылка на будущее: Git Tools - Интерактивная постановка
источник
-p/--patch
это ярлык к действию исправления внутри-i/--interactive
команды, запускающий полезный интерактивный режим .git diff
иe
, Вы можете редактировать ломоть вручную путем замены+
или-
по#
git push
это говорит уже в курсе. и если я это сделаю,git diff
я увижу куски, которые я сказалn
. если яgit diff --staged
вижу, я вижу коммит, который я хочу нажать. Если я могу нажать коммит, как я могу удалить фрагменты, которые я сказалno
?Вы можете использовать
git add --interactive
или , а затем ( не ); см. Интерактивный режим на странице руководства git-add или просто следуйте инструкциям.git add -p <file>
git commit
git commit -a
Modern Git также имеет
git commit --interactive
(иgit commit --patch
, который является ярлыком для опции исправления в интерактивном коммите).Если вы предпочитаете делать это из GUI, вы можете использовать git-gui . Вы можете просто пометить чанки, которые хотите включить в коммит. Мне лично это проще, чем пользоваться
git add -i
. Другие графические интерфейсы git, такие как QGit или GitX, также могут иметь эту функцию.источник
Git GUI предоставляет эту функциональность в представлении diff. Просто щелкните правой кнопкой мыши на строке (строках), которая вас интересует, и вы должны увидеть пункт меню «подготовить эту строку для фиксации».
источник
gitk
, но он включен в Git Bash для Windows; Вы должны иметь пункт меню Пуск для него или можете запустить его с помощью командыgit gui
. Там также,stage this hunk
что, вероятно, более полезно, чемstage this line
. Может быть новым, так как этот ответ был создан 10 лет назад.Я считаю, что
git add -e myfile
это самый простой способ (по крайней мере, мои предпочтения), поскольку он просто открывает текстовый редактор и позволяет вам выбрать, какую строку вы хотите поставить, а какую - нет. По поводу команд редактирования:добавленный контент:
удаленный контент:
измененный контент:
Все детали о
git add
доступны наgit --help add
источник
-e
есть--edit
.git --help add
s
в интерактивном режиме патчей.git add -e
) * не * изменяет содержимое файла на диске. Он просто перемещает часть изменений из неустановленных в поэтапные (индекс).Если вы используете vim, вы можете попробовать отличный плагин под названием fugitive .
Вы можете увидеть различие файла между рабочей копией и индексом с помощью
:Gdiff
, а затем добавить строки или фрагменты в индекс, используя классические команды vim diff, напримерdp
. Сохраните изменения в индексе и подтвердите их:Gcommit
, и все готово.Очень хорошие вводные скринкасты здесь (см. Часть 2 ).
источник
:diffget/:diffput
в визуальном режиме, где я могу выбрать определенные строки, которые я хочу сбросить / зафиксировать. Итак, убедитесь еще раз: vim потрясающий.Я настоятельно рекомендую использовать SourceTree от Atlassian. (Это бесплатно.) Это делает это тривиальным. Вы можете быстро и легко создавать отдельные фрагменты кода или отдельные строки кода.
источник
Стоит отметить , что использование
git add --patch
для нового файла необходимо сначала добавить файл индекса сgit add --intent-to-add
:источник
Когда у меня будет много изменений, и в итоге я создам несколько коммитов из этих изменений, я хочу временно сохранить свою начальную точку, прежде чем ставить вещи.
Нравится:
Ответ Whymarrh - то, что я обычно делаю, за исключением того, что иногда происходит много изменений, и я могу сказать, что могу ошибиться при постановке вещей, и я хочу зафиксированное состояние, к которому я могу прибегнуть для второго прохода.
источник
Если вы используете emacs, взгляните на Magit , который предоставляет интерфейс git для emacs. Он поддерживает постановку фрагментов (частей файлов) довольно хорошо.
источник
Intellij IDEA (и, я думаю, все остальные продукты серии) имеет встроенную поддержку частичных коммитов начиная с v2018.1
источник
Для тех, кто использует Git Extensions :
В окне «Фиксация» выберите файл, который вы хотите частично зафиксировать, затем выделите текст, который вы хотите зафиксировать, на правой панели, затем щелкните правой кнопкой мыши выделенную область и выберите «Поместить выделенные строки» в контекстном меню.
источник
s
- очень полезно для быстрого размещения частей файлов для фиксации.Как и в ответе jdsumsion, вы также можете спрятать свою текущую работу, но затем использовать difftool, такой как meld, чтобы извлечь выбранные изменения из тайника. Таким образом, вы даже можете легко редактировать фрагменты вручную, что немного неприятно, когда
git add -p
:Использование метода stash дает вам возможность проверить, работает ли ваш код, до того, как вы его подтвердите.
источник
git commit --amend
, кажется, что вы не можете открыть тайник впоследствии, или есть способ сделать это?Добавление предыдущего ответа, если вы предпочитаете использовать командную строку, ввод
git add -e myfile
дает вам возможность выбирать построчно то, что вы хотите зафиксировать, потому что эта команда откроет редактор с различиями, например так:Как вы, возможно, знаете, строки, начинающиеся с
+
добавления, строки, начинающиеся с-
удаления. Так:-
пробелом.
Вот что
git add -h
говорит о добавлении файлов таким образом (исправление файлов):Внимание: не изменяйте содержимое файла, это не очень хорошее место для этого. Просто поменяйте операторы удаленных или добавленных строк.
источник
Плагин vim-gitgutter может ставить фрагменты, не выходя из редактора vim с помощью
Помимо этого, он предоставляет другие интересные функции, такие как столбец различий, как в некоторых современных средах разработки.
Если только часть ломоть должна быть организована vim-беглец
позволяет визуальный выбор диапазона затем
:'<,'>diffput
или:'<,'>diffget
для постановки / возврата отдельных изменений линий.источник
Пробовал
git add -p filename.x
, но на Mac я обнаружил, что gitx ( http://gitx.frim.nl/ или https://github.com/pieter/gitx ) гораздо проще зафиксировать именно те строки, которые я хотел.источник
С TortoiseGit:
источник
Прошло 10 лет с тех пор, как этот вопрос был задан. И я надеюсь, что этот ответ будет кому-то полезен. Как уже упоминалось в ответе здесь , где GUI не вариант, расширение Crecord Эндрю Шадуры помогает окно ncurses, в котором мы можем выбрать строки для фиксации.
Настройте расширение следующим образом:
Перейдите к вашему git-репо и вызовите его следующим образом:
Это вызовет интерфейс ncurses, который можно использовать, как показано ниже. Нажатие следующих клавиш в окне ncurses выполнит определенные действия:
Скриншот, показывающий пример использования
источник
Для пользователей Atom пакет github включает в себя интерактивную постановку в стиле
git gui
. Для ярлыков см. Документацию пакета .Использование Atom позволяет работать с темой с темным фоном (по умолчанию
git gui
белый фон).источник
Для Emacs есть также Gitsum
источник
git-meld-index - цитирование с сайта:
git-meld-index запускает meld - или любой другой git difftool (kdiff3, diffuse и т. д.) - чтобы вы могли интерактивно вносить изменения в индекс git (также известный как область подготовки git).
Это похоже на функциональность git add -p и git add --interactive. В некоторых случаях meld легче / быстрее использовать, чем git add -p. Это потому, что соединение позволяет вам, например,:
Применение
В репозитории git запустите:
Вы увидите, что meld (или ваш сконфигурированный git difftool) всплывает с:
LEFT : временные файлы, содержащие каталоги, скопированные из вашего рабочего дерева
ВПРАВО : временный каталог с содержимым индекса. Сюда также входят файлы, которых еще нет в индексе, но которые изменены или не отслежены в рабочей копии - в этом случае вы увидите содержимое файла из HEAD.
Отредактируйте указатель (с правой стороны), пока не будете довольны. Не забудьте сохранить при необходимости.
Когда вы закончите, закройте meld, и git-meld-index обновит индекс, чтобы он соответствовал содержимому временного каталога с правой стороны от только что отредактированного meld.
источник
Если это на
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 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 и т. д.), для выбора строк, которые будут включены в коммит.
источник
git add -p filename.txt
" помимо того, что меньше места для ошибок? Если вы испортили частичное изменение файла, отмена добавления лучше, чем отмена фиксации.Git-Cola - это отличный графический интерфейс, который также имеет встроенную функцию. Просто выберите линии для сцены и нажмите S. Если выбор не сделан, весь блок ставится.
источник