Git вернуть несколько файлов массового коммита - PullRequest
0 голосов
/ 21 февраля 2011

Я нахожусь в процессе знакомства с GIT, просто бросив svn и продолжив GIT. Теперь я испачкал руки:
Я создал ветку и изменил кучу файлов с помощью макроса emacs и зафиксировал их все с помощью commit -a. Я также сделал некоторые другие изменения в некоторых других файлах. Прежде чем объединить все с мастером, я протестировал несколько вещей, и в макросах emacs не было нескольких важных деталей. Так что теперь большая часть общего коммита должна быть отменена, но не все. И коммиты после массового коммита также являются твердыми. Какой самый простой способ восстановить большую часть коммита? Есть ли утилита для сбора вишни? В настоящее время я использую командную строку git и emacs vcs (git-el). Я купил книгу и просмотрел несколько сайтов, но пока не нашел удовлетворительного ответа.

С уважением,
Йерун.

1 Ответ

1 голос
/ 21 февраля 2011

git revert -n <hash of bulk commit> попытается отменить изменения в массовом коммите в вашем рабочем дереве. Как только это будет сделано, вы можете запустить git reset HEAD -- <paths to keep changes in>, возможно, с --patch (для интерактивного выбора сохраняемых изменений). Затем вы делаете это, как и любой другой.

Является ли ваш репозиторий приватным / не выдвинутым? Если так, у вас есть еще один вариант, хотя я не советую его для чего-то подобного. git rebase -i <hash of commit before bulk>. Отредактируйте первую строку (должна иметь первую строку массовой фиксации), чтобы начать с e или edit.

В этот момент вы можете использовать git reset <hash of commit before bulk> -- <paths to revert>, а затем git commit --amend, чтобы исправить ваш объемный коммит, чтобы исключить изменения в некоторых файлах. Затем git rebase --continue перепишет всю оставшуюся историю поверх скорректированного коммита; вам, возможно, придется разрешать конфликты и продолжать снова, если они касаются обращенных битов файлов. После этого ваша история будет выглядеть так, будто вы никогда не вносили некоторые плохие изменения; для частного проекта это может быть хорошо, но просто имейте в виду, что после перебазирования становится довольно трудно вернуться к любому из промежуточных состояний, из которых вы переписываете. Вы можете сделать это с git reflog на некоторое время, но со временем старые версии коммитов истекают и удаляются из хранилища.

В любом случае, я бы посоветовал использовать git diff --name-only и некоторое редактирование, чтобы собрать вместе пути, содержащие список текстовых файлов, изменения которых вы хотите / не хотите отменять, а затем использовать конструкцию оболочки, такую ​​как $(< badfiles) в места, где я говорю об использовании списков путей в командной строке для извлечения этого файла. Один на строку или разделенный пробелами будет хорошо работать для такого рода вещей. Да, и если у вас есть пробелы в ваших путях, вам нужно поместить кавычки вокруг путей в файле, чтобы он работал.

...