Git слить, но отменить все локальные изменения

У меня есть ситуация, когда у меня есть две ветки. Ветка good и ветка bad. Я хочу сделать что-то вроде слияния. Но слияние не совсем правильно. По сути, я хочу быть в плохой ветке, и я хочу, чтобы файлы в плохой ветке стали копией или клоном файлов в хорошей ветке. Я хочу запустить какое-то слияние, чтобы все файлы в плохой ветке стали идентичны файлам в хорошей ветке. Но не стоит портить историю. Это должен быть только один новый коммит поверх истории от bad.

Я старался

git checkout bad
git merge -X theirs good

Но это не совсем правильно, это удерживает некоторые изменения от плохих. Я могу исправить это, выполнив

git diff bad good

И вручную удаляя каждый diff. По сути, я продолжаю удалять вещи, пока diff не станет пустым. Затем операция завершена, и ветка bad теперь идентична ветке good. Наверняка должен быть лучший способ? Я хочу сделать слияние, при котором он просто полностью копирует файлы других ветвей, а не объединяет их.

Любая помощь будет оценена по достоинству. Я пробовал искать такие вещи, как copy other branch git, но ничего не подходит.


1
109
3

Ответы:

git checkout bad
git reset --hard good

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


проблема (если вы хотите так это называть) с выполнением git reset --hard заключается в том, что вы не просто устанавливаете файлы как в другой ветке... вы устанавливаете все как в другой ветке... и это также покрывает история плохой ветки. Если вы хотите сохранить плохую историю и иметь новую ревизию, где все будет выглядеть как на хорошей ветке, тогда это поможет:

git checkout --detach good
git reset --soft bad # moving HEAD to bad, but all files will stay as they are in good, all differences will be on index, ready to be committed
git commit -m "New revision, everything is like it is on good branch"
git branch -f bad # move bad branch pointer to new revision
git checkout bad

Но все зависит от того, хотите ли вы сохранить плохую историю веток или нет.


Решено
git reset --hard good       # set work tree, index and parent
git reset --soft bad        # undo the parent switch
git commit

или

git read-tree -um good      # set work tree and index
git commit