В данном конкретном случае это просто. Чтобы понять почему, нарисуйте (часть) граф фиксации.
Вы начали с чего-то вроде этого:
...--o--* <-- develop (HEAD), origin/develop
Затем вы создали новое имя ветки feature
, указывающее на тот же самый наконечник develop
commit *
. Вы прикрепили HEAD
к новой ветке, получив:
...--o--* <-- develop, feature (HEAD), origin/develop
Теперь вы сделали два новых коммита. Давайте назовем их A
и B
вместо того, чтобы использовать их настоящие хеш-идентификаторы, которые являются большими, безобразными и забываемыми. Коммит A
имеет в качестве родителя коммит *
, а коммит B
имеет коммит A
в качестве родителя, а имя feature
теперь указывает на коммит *
:
...--o--* <-- develop, origin/develop
\
A--B <-- feature (HEAD)
Оставив feature
в покое, давайте скажем Git переместить имя develop
, чтобы оно указывало на фиксацию A
, незначительное исправление, которое вы хотите иметь в своем develop
:
...--o--* <-- origin/develop
\
A <-- develop
\
B <-- feature
Я временно удалил прикрепленный HEAD
, так как есть несколько способов настроить develop
, как это, и HEAD
может повторно присоединиться, как и мы. Это последняя картинка, которую вы хотите: ни один коммит не изменился вообще, но ваше локальное имя develop
теперь указывает на первый коммит, а feature
указывает на второй.
Итак: как нам это сделать?
Один довольно безопасный метод (не может потерять работу) - это сначала git checkout develop
, а затем git merge --ff-only
для быстрой перемотки вперед develop
до правильного коммита. Это коммит A
, который является шагом назад от feature
, поэтому мы можем сделать это:
git checkout develop
git merge --ff-only feature~1
Это оставит вас с develop
, указывающим на коммит A
(а ваш HEAD
, связанный с develop
, так что вам нужно git checkout feature
, чтобы продолжить).
Другой способ - проверить develop
и использовать git reset --hard
, чтобы переместить метку develop
к любому произвольному коммиту (при одновременном обновлении индекса / промежуточной области и вашего рабочего дерева). По сути, это то же самое, что и выше, но оно позволяет вам перемещать имя куда угодно, даже если это не разумный ход, поэтому приведенное выше, вероятно, предпочтительнее.
Еще один способ - использовать git branch -f
, чтобы принудительно переместить имя в нужное место:
git branch -f develop feature~1
Это оставляет ваш HEAD
подключенным к feature
, так что вам не нужно git checkout feature
, чтобы продолжать работать. Однако, как и метод git reset
, он не очень безопасен, поскольку позволяет переместить имя в любой коммит, даже если это не имеет смысла.
Наконец, есть очень хитрый способ обновления develop
в ускоренном режиме (а-ля git merge --ff-only
) без проверки develop
- на самом деле нужно , чтобы остаться на какой-то другой филиал, чтобы сделать это:
git push . feature~1:develop
Это заставляет ваш Git вызывать ваш собственный Git и предлагать себе переместить имя develop
, чтобы указать на коммит, чей ID хеша был получен при разборе feature~1
. Ваш Git будет подчиняться вашему Git тогда и только тогда, когда это ускоренная перемотка вперед, поскольку здесь нет флага силы.
Используйте то, что вам нравится; все они достигают одного и того же результата в конце, за исключением того, где прикреплен ваш HEAD
.