Могу ли я сохранить коммит, но удалить все изменения? - PullRequest
0 голосов
/ 18 июня 2019

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

Таким образом, очевидный способ сделать это состоит в том, чтобы git rm эти файлы и git сбросили те, которые не являются новыми файлами.Но есть ли более быстрый способ сделать это?Если я создам новый коммит в другой ветви и скопирую идентификатор изменения, станет ли он еще одним патчем для того же коммита?

Редактировать: Чтобы уточнить, я просто хочу отменить изменения, внесенные в текущий коммит, без проверкиновый коммит или создание нового.Я сам опубликовал ответ, который берет разницу с предыдущим коммитом и либо удаляет файлы, либо отменяет их в зависимости от того, были ли они недавно созданы или изменены.Однако может быть лучшее решение, но оно подходит для моего варианта использования.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Я нашел достойное решение.Выполнение этих двух команд восстановит все изменения в коммите, не удаляя коммит.

git diff-tree -no-commit-id --name-status -r HEAD | grep -oP '(?<=A).*' | xargs git rm

git diff-tree -no-commit-id --name-status -r HEAD | grep -oP '(?<=M).*' | xargs git checkout HEAD~1

В первой строке удаляются все добавленные файлы ивторая строка восстанавливает изменения, внесенные в уже существующие файлы.

Первая команда git diff-tree возвращает изменения в коммите, опция --no-commit-id удаляет идентификатор, а --name-status возвращает только имя файлов исимвол, который указывает, является ли это новый файл, измененный или удаленный файл.Результат передается в команду grep, которая ищет A или M (добавленные или измененные файлы) и возвращает строку, исключающую этот символ.Наконец, xargs преобразует вывод в аргументы, а затем я выполняю необходимую команду git для файлов, git rm для добавленных файлов и git checkout HEAD~1 для измененных файлов.

0 голосов
/ 18 июня 2019

В случае, если вы не хотите фиксировать измененные файлы.Вы можете принять во внимание git stash.

  • git stash для сброса всех файлов, которые были изменены или добавлены в git.
  • git stash pop, когда я хочу, чтобы восстановленные файлы имелибыл спрятан.

С другой стороны, если вы зафиксировали эти файлы, вы можете использовать git checkout, git reset или git revert

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...