2012-03-12 2 views
1

Я сделал кучу изменений в своей ветке, в нескольких файлах. Теперь я решил, что хочу внести незначительные изменения почти во все эти изменения. Есть ли простой способ получить имена файлов и номера строк изменений (например, от git diff), а затем открыть мой редактор выбора (vim, но взять на себя любой редактор, который может открыть файл по определенной строке) на каждой из этих позиций в очереди? Единственный способ, с помощью которого я могу придумать верхнюю часть моей головы, - запустить выход diff через какой-то скрипт, но похоже, что он может стать довольно уродливым.Изменить все изменения git?

Уточнение: на этом этапе я не совершал никаких коммитов.

ответ

2

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

Что я рекомендую использовать git add -p, который подскажет вам git add каждого отдельного патча. Один из ваших вариантов для каждого патча - edit, который выведет вас в редактор с diff. Если вам нужно только изменить строку, вы можете просто изменить текст на добавленной строке (с пометкой +) и сохранить. Немного сложнее добавить или удалить строки (хотя это и говорит вам, как).

Когда вы закончите, git diff --cached покажет вам ваши новые изменения (по мере их совершения), в то время как git diff покажет, что ваша рабочая копия по-прежнему выглядит так, как было, когда вы запустили git add -p. Затем вы можете сделать git commit необходимые изменения, а затем сбросить ненужные git reset --hard или отсортировать git checkout, как обычно.

+0

Это очень мило. Для справки [интерактивное добавление] (http://book.git-scm.com/4_interactive_adding.html) (спасибо carleeto за исходную ссылку) – naught101

+0

Собственно, это немного другая вещь. Слишком поспешно! Я также замечаю, что вы можете использовать 'git commit -interactive' как ярлык для' git add -p; git commit -a' – naught101

+1

@ naught101: Вы можете перейти прямо к 'git commit -interactive', но я предпочитаю' git add -p', потому что у вас много шансов на него. Вы можете использовать 'git reset ', чтобы отключить патчи из файла и повторите попытку. Вы можете просмотреть свою работу с помощью 'git diff --cached'. –

1

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

git rebase -i lastcommitsha1^ 

и отметьте те, которые нужно изменить.

Если есть тонна и изменения скриптов, используйте git filter-branch --tree-filter

1

Что вы, вероятно, ищете называется interactive rebase:

git rebase -i <last_commit_you_want_to_keep> 

Разница заключается в том, что когда вы делаете интерактивную Rebase , вы захотите «отредактировать» каждую фиксацию в диапазоне. Затем вы продолжите переустановку и, когда будет предложено, вы внесете изменения в фиксацию, которую хотите, зафиксируете и продолжите rebase. Продолжайте, пока не закончите.

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

+0

приятно, но я не думаю, что это сработает, поскольку я говорю о коде, который я еще не совершил. – naught101

Смежные вопросы