Сбросить другую ветку в текущее состояние без оформления заказа

110

Я пишу сценарии для рабочего процесса Git.

Мне нужно сбросить другую (существующую) ветку на текущую без проверки.

Перед:

 CurrentBranch: commit A
 OtherBranch: commit B

После:

 CurrentBranch: commit A
 OtherBranch: commit A

Эквивалент

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(Примечание --soft: я не хочу влиять на рабочее дерево.)

Это возможно?

Александр Гладыш
источник
Кто-нибудь знает, возможно ли это и в Эгите?
zedoo

Ответы:

84

Описанные вами рабочие процессы не эквивалентны: при выполнении reset --hardвы теряете все изменения в рабочем дереве (вы можете захотеть внести это reset --soft).

Вам нужно

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch
П Швед
источник
3
Чувак, я бы хотел, чтобы это работало без лишнего refs/heads/
ELLIOTTCABLE
41
Намного более приятный способ сделать это git push . current:other. Это работает без refs/heads(/ cc @elliottcable), а также не дает вам обновить извлеченную ветку. Обратите внимание, что вам может потребоваться передать -f (или использовать +current:other), если обновление не является перемоткой вперед.
Лили Баллард
4
Вы также можете использовать -m 'some text'аргумент для записи причины, по которой обновление ref будет отображаться git reflog OtherBranchкомандой, например «синхронизировано с CurrentBranch». Может быть, позже будет полезно вспомнить, зачем вы это сделали.
Леви Хаскелл
18
Зачем вам использовать git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchили git push . CurrentBranch OtherBranchкогда вы могли бы использовать git branch -f OtherBranch CurrentBranchвместо этого намного более чистый (IMO) ? (См. Мой ответ на git branch -f ниже)
Колин Д. Беннетт
1
@BenHymers Итак, страница руководства для "git push" - чертова ложь. Он описывает команду как «Обновить удаленные ссылки ...». когда на самом деле он может нормально обновлять локальные ссылки.
Kaz
228

Установите otherbranchточку в той же фиксации, что и currentbranchпри запуске

git branch -f otherbranch currentbranch

Опция -f(force) говорит git branch да, я действительно хочу перезаписать любую существующую otherbranchссылку новой .

Из документации :

-f
--force

Восстановить, если уже существует. Без -f ветка git отказывается изменять существующую ветку.

Колин Д. Беннетт
источник
6
Это самый простой ответ. Спасибо!
Роберт Карл
Я получаю fatal: Cannot force update the current branch.при попытке это сделать.
Fuad Saud
4
@FuadSaud, потому что вы уже otherbranchвыписались. Этот вопрос SO конкретно касается сброса другой ветки на другую фиксацию (т.е. не сброса извлеченной ветки). Что вы хотите сделать, так это сбросить текущую ветку с git reset targetbranchпомощью, чтобы указать текущую ветку targetbranch. Добавьте, --hardчтобы принудительно добавить дерево работ к этому содержимому. Или --softоставить индекс в покое и изменить только саму ветку.
Colin D Bennett
Итак, я знаю о сбросе. Я искал способ внутри процедуры всегда указывать локальный мастер на восходящий / главный, независимо от того, что проверено. Я думал branch -f, что смогу это сделать.
Fuad Saud
9
Имо, это должен быть принятый ответ. Это настолько улучшило мой рабочий процесс!
lethal-guitar
23

Вы можете синхронизировать с этой командой свои ветки в любое время

$ git push . CurrentBranch:OtherBranch -f

Также без -f он заменяет этот набор команд

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

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

Денис Кузнецов
источник
Может вызвать «удаленный: ошибка: отказ от перемотки вперед»
Базилев
3
Я бы не стал включать -fвариант, если он не является абсолютно неизбежным. В моем случае он хорошо работает без него.
Melebius