Git: отменить все изменения в другой локальной ветке

117

У меня есть локальная тематическая ветка, отслеживающая удаленную ветку. В качестве аргумента предположим, что истории коммитов выглядят так:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

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

A--B--C--O1--O2--O3 (phobos origin/phobos)

Мне действительно не нужны локальные изменения в phobosветке, и я действительно не хочу, чтобы впоследствии в исходном репозитории отображались какие-либо слияния. (Так что просто слияние - это не то, что я имею в виду.)

Кажется, это должно быть очень просто, но мой гугл-фу меня подвел. Как мне это сделать?

Electrons_Ahoy
источник

Ответы:

79

Удалите ветку, затем создайте заново:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos
mipadi
источник
37
Проблема с этим подходом по сравнению с сбросом заголовка ветки заключается в том, что удаление ветки сдувает журнал ссылок ветки. С другой стороны, сброс ветки не только сохраняет журнал ссылок, но и записывает сброс в журнал ссылок. Это делает операцию легко обратимой позже, если потребуется.
Дэн Молдинг
9
@Electrons_Ahoy Предлагаю вам изменить здесь принятый ответ на ответ Дэна (чтобы люди вроде меня, которые искали в Google, как это сделать, скорее всего, выберут более безопасный метод).
Стив Чемберс,
4
Ответ @ DanMoulding не включает удаление локальной ветки, когда это не нужно. Это намного безопаснее.
brma
@brma: Как так? Он все еще просто указывает ветку на новый коммит.
mipadi
5
Ответ Дэна Молдинга безопаснее. Думаю, тебе стоит выбрать именно его.
Daniel Apt
331
git checkout phobos
git reset --hard origin/phobos

Это говорит Git, что нужно сбросить заголовок phobosдо той же фиксации origin/phobos, что и, и обновить рабочее дерево для соответствия.

Дэн Молдинг
источник
35
ИМО, это должен быть принятый ответ; он выдает команду «сбросить» для трансплантации указателя ветки вместо выполнения операции с удалением / воссозданием.
vdboor
На самом деле, я сначала попробовал это, и он вызвал массу ошибок, из-за которых локальная копия почти не использовалась. Удаление / воссоздание могло быть менее элегантным, но мне не пришлось задавать дополнительных вопросов.
Electrons_Ahoy
3
@Electrons_Ahoy: Хм, это определенно ненормально. Выполнение этого сброса обычно должно быть беспроблемной операцией, если ваше репо находится в хорошем рабочем состоянии.
Дэн Молдинг
или даже если это забавно. Используйте git reflog, чтобы найти дорогу домой, если вы «случайно» запустили эту команду, не читая, что она делает. :)
dbn
Также это работает, если вы находитесь в ветке и испортили его локально.
slott