Удалить все коммиты, но сохранить все изменения файла - PullRequest
0 голосов
/ 20 июня 2019

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

Значит Теперь я хочу 15 изменений файла за один коммит.

git reset --hard commit_id
git push --force

Приведенная выше команда нам не поможет.

Редактировать:

Я хочу переместить мою ветку в один конкретный коммит с сохранением всех изменений файла, которые произошли в текущих коммитах. Затем хотите добавить все unstash изменения в один коммит.

Возможно ли это?

Ответы [ 3 ]

4 голосов
/ 20 июня 2019

Позвольте мне предоставить ответ, который я разместил в качестве комментария, когда вопрос был помечен как дубликат (и перед ответом Тима):

git reset --soft HEAD~10
git commit -m "there, my 10 commits squashed"

Форсирование (что хорошо), как добавленоТим необходим, если вы разместите эту ветку в других удаленных ветках, если вы уже добавили туда удаленные ревизии.

2 голосов
/ 20 июня 2019

Пожалуй, самым простым подходом здесь было бы просто выполнить программный сброс, вернуться назад на 10 коммитов и затем повторить:

git reset --soft HEAD~10
git commit -m 'squash 10 commits into just one commit'
git push --force origin your_branch

Идея этого трюка с программным сбросом заключается в том, что мы перемещаем указатель HEAD назад на 10 коммитов. Это помещает все изменения из ваших 10 коммитов в стадию, оставляя рабочий каталог таким же. Затем при повторной фиксации вы эффективно создаете коммит, содержащий работу из всех 10 коммитов.

Обратите внимание, что обычно требуется принудительное нажатие, поскольку этот параметр перезаписывает историю вашей ветви.

Другим подходом будет использование интерактивной перебазировки и выбор squash для коммитов, которые вы хотите раздавить. Эта опция также переписывает историю.

1 голос
/ 11 июля 2019

Это создает новую ветку "your-branch-3" и затем проверяет каждый файл из другой ветки "your-branch-2":

git checkout master
git checkout -b your-branch-3
git diff your-branch-2 --name-only | xargs -I{} git checkout your-branch-2 -- {}

--name-only

  • выводить только пути к файлам

xargs -I

  • Заменить вхождения {} в исходных аргументах именами, считанными из стандартного ввода.

git-checkout branch --

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