Переместить коммит в другую ветку - PullRequest
0 голосов
/ 28 июня 2018

Мне интересно, есть ли простой способ переместить коммит из ветви A в ветку B.

Я работал над "разработкой" ветки, затем создал новую, скажем, "featureA" начать разработку новой функции. Я сделал 2 коммита, но сначала нужно было «разработать» вместо «featureA», потому что это было небольшое исправление, но я забыл изменить ветку, так что я могу просто переместить коммит 1 в ветку «развернуть» и удалить его от "featureA"?

Изменения еще не переданы, только локальные.

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

В данном конкретном случае это просто. Чтобы понять почему, нарисуйте (часть) граф фиксации.

Вы начали с чего-то вроде этого:

...--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.

0 голосов
/ 28 июня 2018

Вы можете использовать git cherry-pick <commit> из целевой ветви, чтобы скопировать туда коммит (<commit> может быть именем ветви, если это последний коммит).

Вы можете использовать git reset --hard HEAD^, чтобы стереть последний коммит из исходной ветви.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...