2009-10-19 2 views
79

Я пишу несколько сценариев для рабочего процесса Git.Git: перезагрузите другую ветку до текущей без выписки

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

До:

CurrentBranch: commit A 
OtherBranch: commit B 

После:

CurrentBranch: commit A 
OtherBranch: commit A 

Эквивалент

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

(Примечание --Мягкая: Я не хочу, чтобы повлиять на рабочее дерево.)

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

+0

Кто-нибудь знает, если это возможно в EGit? – zedoo

ответ

59

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

Что вам нужно

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch 
+0

Хорошо, спасибо. Я не хочу влиять на рабочее дерево. –

+2

Человек, я бы хотел, чтобы это сработало без лишних 'refs/heads /' ... – ELLIOTTCABLE

+32

Гораздо лучший способ сделать это - git push. ток: other'. Это работает без 'refs/heads' (/ cc @elliottcable), а также не позволяет вам обновлять выделенную ветку. Обратите внимание, что вам может понадобиться передать -f (или использовать '+ current: other'), если обновление не является быстрой перемоткой вперед. –

15

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

$ git push . CurrentBranch:OtherBranch -f 

Кроме того, не -f он заменить этот набор команд

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

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

+0

Может вызвать «remote: error: dening non-fast-forward» – Basilevs

+0

Я бы не включил опцию '-f', если это абсолютно неизбежно. Это хорошо работает без этого в моем случае. – Melebius

140

otherbranch Установить, чтобы указать на то передай, как currentbranch, запустив

git branch -f otherbranch currentbranch 

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

От documentation:

-f
--force

Reset to if exists already. Without -f git branch refuses to change an existing branch.

+2

Это самый простой ответ. Благодаря! –

+0

Я получаю «фатальный: не могу заставить обновить текущую ветвь» при попытке сделать это. –

+3

@FuadSaud, потому что у вас уже есть «otherbranch». Этот вопрос SO специально предназначен для сброса * другой * ветки на другую фиксацию (т. Е. Не сбрасывает выделенную ветку). То, что вы хотите сделать, - это сбросить текущую ветвь с помощью «git reset targetbranch», чтобы заставить текущую ветку указывать на «targetbranch». Добавьте '--hard', чтобы заставить дерево работы к этому контенту. Или '--soft' оставить индекс в покое и изменить только ветвь. –

Смежные вопросы