Скиньте іншу гілку до поточної без оформлення каси


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. Я не хочу впливати на робоче дерево.)

Чи можливо це?


Хтось знає, чи можливо це також в Egit?
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'аргумент, щоб записати причину відображення оновлення по git reflog OtherBranchкоманді, наприклад "синхронізовано з CurrentBranch". Може бути корисним згадати, чому ви це зробили пізніше.
Леві Хаскелл

18
Чому б ви використовували git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchчи git push . CurrentBranch OtherBranchколи ви могли використовувати набагато чистіший засіб (IMO) git branch -f OtherBranch CurrentBranchзамість цього? (Дивіться мою відповідь на відділенні git -f нижче)
Colin D Bennett

1
@BenHymers Отже, сторінка людини для "git push" - проклята брехня. Вона описує команду як "Оновити віддалені реф. ...". насправді він може добре оновити локальні реф.
Каз

228

Встановіть otherbranchкрапку на той самий комікт, що і currentbranchпри запуску

git branch -f otherbranch currentbranch

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

З документації :

-f -
сила

Скиньте, якщо він уже існує. Без -f git гілка відмовляється змінити існуючу гілку.


6
Це найпростіша відповідь. Дякую!
Роберт Карл

Я отримую, fatal: Cannot force update the current branch.коли намагаюся це зробити.
Фуад Сауд

4
@FuadSaud це тому, що ви вже otherbranchперевірили. Це запитання ТА стосується перезавантаження іншої гілки на інший комітет (тобто не скидання відхиленої гілки). Що ви хочете зробити, це скинути поточну гілку, git reset targetbranchщоб змусити вказати поточну гілку targetbranch. Додати, --hardщоб також примусити робоче дерево до цього вмісту. Або --softзалишити індекс в спокої і змінити лише саму гілку.
Колін Д Беннетт

Так, знаю, про скидання. Що я шукав - це спосіб, щоб у рутині завжди вказувати місцевому господареві вище / за течією, незалежно від того, що перевірено. Я думав, що branch -fможна це зробити.
Фуад Сауд

9
Імо, це повинна бути прийнята відповідь. Це настільки покращило мій робочий процес!
летальна гітара

23

Ви можете в будь-який час синхронізувати цю команду з вашими відділеннями

$ git push . CurrentBranch:OtherBranch -f

Також без -як замінить цей набір команд

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

Це може бути корисно, коли вам не потрібно вводити всі свої файли в CurrentBranch, і тому ви не можете переключитися на інші гілки.


Може спричинити "віддалений: помилка: заперечення
нешвидкого перемоги

3
Я б не включав -fваріант, якщо це абсолютно неминуче. Він добре працює без нього в моєму випадку.
Мелебій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.