Как перемещаться git фиксирует от мастера к другой существующей ветке

Я проверил несколько коммитов на master, которые должны были быть отмечены в develop. Какие команды git я использовал для удаления этих коммитов из главной ветки и их включить в ветку разработки?

Ответы

Ответ 1

Если я не ошибаюсь, у вас было две синхронизированные ветки, master и dev, и просто забыл переключить ветвь, перед вашими фиксациями.

Если это так, мы имеем:

----------------
git log in dev

xxx
yyy
...
----------------

и

----------------
git log in master

ccc
bbb
aaa
        <---- here you forgot to switch branch
xxx
yyy
...
----------------

Решение:

Сначала убедитесь, что:

git status -s

возвращает пустые результаты.

Затем получите все свои новые коммиты от master до dev с помощью:

git checkout dev
git merge master

Теперь вернемся к вам master:

git checkout master

Удалите ненужные коммиты:

git reset --hard HEAD~3

Число ~3 - это количество коммитов, которые вы хотите удалить.

Помните: git status -s должны возвращать пустые результаты. В противном случае git reset --hard может привести к потере данных.

Ответ 2

Для справки в другую ветку вы можете использовать выбор вишни:

git cherry-pick <commit>

Удаление не так просто. Вы можете использовать rebase и squash или редактировать фиксацию:

git rebase -i <commit>~1

Но я не уверен, когда вы редактируете редактирование во время rebase, если вы можете редактировать файлы также, а не только сообщение commit.

Ответ 3

Вы можете cherry-pick выполнить свои обязательства перед develop, а затем в интерактивном режиме rebase ветвь master:

  • git checkout develop
  • git cherry-pick aabbcc
  • git cherry-pick ddeeff
  • ....
  • git checkout master
  • git rebase 123456 -i

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

Ответ 4

Обычно существует несколько способов сделать одно и то же в git одним из возможных способов:

git checkout develop
git cherry-pick XXX // XXX being the sha1 of the commit you want to grab
git checkout master
git rebase --interactive HEAD~IDX // IDX being the position of the last "good" commit compared to HEAD

Последняя команда отобразит весь обзор от HEAD до последнего хорошего коммита, и все, что вам нужно сделать, - это удалить строку фиксации для перехода в ветвь