2016-02-17 6 views
0

Дано:Git шаг совершить в orpan ветви

git init 
git commit --allow-empty -m a 
git commit --allow-empty -m b 
git commit --allow-empty -m c 

У меня есть:

$ git log --oneline 
<c-sha1> c 
<b-sha1> b 
<a-sha1> a 

Я хочу:

$ git log --oneline master 
<c-sha1> c 
<a-sha1> a 

$ git log --online slave 
<?-sha1> b 

Я tried:

git checkout --orphan slave 
git rebase --keep-empty --onto slave <b-sha1> 

ответ

1

Для создания раба совершить, сделайте следующее:

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 и закройте редактор. Тогда все готово.

+0

Благодарим за сообщение. Можете ли вы уточнить 1) почему вы выбираете 'git commit -C' вместо' git cherry-pick', 2) почему в случае интерактивной rebase мне нужно использовать 'r для B, f для C', а не' f, p 'соответственно, чтобы исключить B, а не C? – user2418306

+1

@ user2418306 - Я использовал 'git commit -C', потому что это заставит« новый b »содержать тот же снимок, что и« старый b ». Выполнение вишневой подборки применимо только к изменениям * b, но применение изменений в сиротской ветви не имеет большого смысла. –

+1

Вы правы в отношении интерактивной rebase, если commit A еще не нажат. Кроме того, чтобы сделать это по-своему, вам нужно будет выполнить 'git rebase -i ^' (обратите внимание на символ '^'). –

Смежные вопросы