Для создания раба совершить, сделайте следующее:
git checkout <b-sha1> --orphan slave
git commit -C <b-sha1>
Затем, чтобы удалить старый б совершить, сделайте следующее:
git rebase --onto <a-sha1> <b-sha1> master
Обратите внимание, что вы можете сделать только второй шаг, если не нажаты b-sha1
, так как вы никогда не должны переписывать историю для толкаемых коммитов.
Также обратите внимание, что содержимое моментального снимка commit c теперь будет другим, потому что он больше не будет иметь никаких изменений с фиксацией b (технически в вашем примере их не было бы, поскольку вы делаете пустые совершает, но если бы они были «реальными», то они были бы). Если это не то, что вы хотите, то вместо того, чтобы делать git rebase --onto
, сделать интерактивный перебазироваться:
git checkout master
git rebase -i <a-sha1>
Ваш редактор появится что-то вроде следующего:
pick <b-sha1> Commit message for B
pick <c-sha1> Commit message for C
Скопируйте коммита для C и изменять содержимое файла в:
r <b-sha1> Commit message for B
f <c-sha1> Commit message for C
Закройте редактор, и новый редактор выскочит с сообщением фиксации для B; замените это сообщением фиксации для C и закройте редактор. Тогда все готово.
Благодарим за сообщение. Можете ли вы уточнить 1) почему вы выбираете 'git commit -C' вместо' git cherry-pick', 2) почему в случае интерактивной rebase мне нужно использовать 'r для B, f для C', а не' f, p 'соответственно, чтобы исключить B, а не C? – user2418306
@ user2418306 - Я использовал 'git commit -C', потому что это заставит« новый b »содержать тот же снимок, что и« старый b ». Выполнение вишневой подборки применимо только к изменениям * b, но применение изменений в сиротской ветви не имеет большого смысла. –
Вы правы в отношении интерактивной rebase, если commit A еще не нажат. Кроме того, чтобы сделать это по-своему, вам нужно будет выполнить 'git rebase -i ^' (обратите внимание на символ '^'). –