Удалить изменения в файле в старом, уже загруженном, git commit? - PullRequest
1 голос
/ 11 ноября 2019

У меня есть старый коммит, A. Когда я зафиксировал A, я изменил 2 файла: F1 и F2. Я хочу изменить A, поэтому он изменяет только файл F1. Я хочу совершить F2 отдельно. Я не хочу удалить F1 из моего репозитория git.

Я попытался сделать это с помощью

git rebase -i HEAD~3 // The exact number doesn't matter, I just change "pick" to "edit" next to A
git reset HEAD^ // unstage all changes
git add F1 // don't add F2, we want to commit it separately
git rebase --continue

Однако это выдает ошибку

F2: needs update
You must edit all merge conflicts and then
mark them as resolved using git add

Я решаю проблему, выполняя git rebase --skip

Однако это полностью удаляет коммит A из истории git.

Что я делаю не так?

Я посмотрел другие посты на SO и попробовал решения, но они не сработали.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Вот как я бы это сделал:

git rebase -i HEAD~3 //Change "pick" to "edit" for commit to change
git reset HEAD^ -- F2 //reset F2 to previous version in staging area
git commit --amend //replace current commit with F1 change only
git add F2 // add new F2 back to staging area
git commit //commit F2 in a separate commit
git rebase --continue

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

0 голосов
/ 11 ноября 2019

Я почти сделал то, что предложил пост @Tim, за исключением того, что мне пришлось добавить в 1 команду. Вот что я сделал:

git rebase -i HEAD~3 // The exact number doesn't matter, I just change "pick" to "edit" next to A
git reset HEAD^ // unstage all changes
git add F2
git commit -m "Add F2"
git add F1
git commit -m "Add F1"
git rebase --continue

git reset HEAD^ не упоминалось в связанном посте.

...