Подтвердить что ты не робот

Как переместить фиксацию в другую ветку?

Я хотел бы переместить мои последние несколько коммитов из мастера в отдельную ветвь.

Дерево на моем ПК выглядит так:

   W (some branch)
  /       
X1--X2--X3--X4--Y--Z1--Z2 (master)

Я хотел бы, чтобы это выглядело так:

   W (some branch)
  /       
X1--X2--X3--X4 (master)
             \
              Y--Z1--Z2 (my new branch)

Однако дерево в GitHub выглядит так:

   W (some branch)
  /       
X1--X2--X3--X4--Y (master)

То, что я видел как решение для переноса последнего, фиксируется в другой ветке:

git checkout master
git branch my_new_branch
git reset <commit_id>

Мой вопрос: смогу ли я успешно нажать на GitHub после перемещения коммитов в новую ветку, и если это потребует сделать что-то еще, чем эти три команды?

4b9b3361

Ответ 1

(Я предполагаю, что <commit_id> - это имя объекта X4...)

Эти команды действительно окажут вам то, что вы хотите локально. (Возможно, вы захотите использовать git reset --hard, чтобы сохранить рабочее дерево и индексировать то же самое, что и фиксация, на которую вы сбросили, но, как обычно, будьте очень осторожны, чтобы git status был чистым, прежде чем использовать эту команду.)

Если вы попробуете нажать мастер на GitHub, он скажет вам, что все уже обновлено, потому что master на GitHub - это один шаг вперед. Вы можете заставить push, так что мастер reset в GitHub, но это переписывает публичную историю, поэтому вы должны делать это только тогда, когда (a) вы единственный, кто выберет master из GitHub или (b), вы можете сообщить своим сотрудникам, что делать, чтобы они случайно не объединили Y. Если это нормально, вы можете сделать:

 git push --force origin master

... и затем master в GitHub будет такой же, как ваша локальная версия.

Ответ 2

Он должен работать, но вам нужно:

  • to push -f origin master (принудительно нажмите, что вызовет проблему, если кто-либо еще клонирует ваше репо)
  • чтобы нажать на вашу новую ветку (которая затем найдет X4 sha1, поверх которой будет установлена ​​новая ветвь).

Ответ 3

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

Просто скопируйте идентификатор ревизии вашей фиксации, которую хотите переместить. git log --oneline

Затем создайте новую ветку поверх первой фиксации и измените ее: git checkout -b "$newBranchName" HEAD~$n (HEAD ~ $n означает n-й фиксатор) или git checkout -b "$newBranchName" $formerRevsion

Теперь вам просто нужно, чтобы вишня выбрала требуемую фиксацию: git cherry-pick $revision

Старый фиксатор останется в другой ветке, но вы можете исправить это с помощью rebase. Вернитесь к своей старой ветке и используйте rebase: git rebase -i HEAD~$n

Просто удалите строку фиксации выбранного вами вишенки, и ваша ветка будет переустановлена. Вы должны использовать git push -f, потому что изменения всех измененных коммитов изменились.