Как переместить коммиты в другую ветку? - PullRequest
20 голосов
/ 17 мая 2011

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

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

   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 после перемещения коммитов в новую ветку и, если да, потребуется ли что-то еще, кроме этих трех команд?

Ответы [ 3 ]

18 голосов
/ 17 мая 2011

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

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

Если впоследствии вы попытаетесь отправить master на GitHub, он скажет вам, что все уже обновлено, потому что master на GitHub - это один коммит вперед. Вы можете принудительно нажать, чтобы мастер сбросился на GitHub, но это переписывает публичную историю, поэтому вы должны делать это только в том случае, если (а) вы единственный, кто получил master с GitHub или (б) вы можете сообщить сотрудникам, что делать, чтобы они случайно не слились Y обратно. Если все в порядке, вы можете сделать:

 git push --force origin master

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

3 голосов
/ 17 мая 2011

Это должно сработать, но вам понадобится:

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

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

Просто скопируйте идентификатор ревизии вашего коммита, который вы хотите переместить.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, потому что ревизии всех перебазированных коммитов изменились.

...