Ситуация:
- мастер в X
- quickfix1 в X + 2 коммитов
Такой что:
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
Затем я начал работать с quickfix2, но случайно взял в качестве источника ветку quickfix1, а не мастер. Теперь quickfix2 находится на X + 2 коммитов + 2 соответствующих коммитов.
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
\
q2a--q2b (quickfix2 HEAD)
Теперь я хочу иметь ветку с quickfix2, но без двух коммитов, которые относятся к quickfix1.
q2a'--q2b' (quickfix2 HEAD)
/
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
Я пытался создать патч из определенной ревизии в quickfix2, но патч не сохраняет историю коммитов. Есть ли способ сохранить мою историю коммитов, но иметь ветку без изменений в quickfix1?
quickfix1
. (Обратите внимание также на разницу в ответах.)Ответы:
Это классический случай
rebase --onto
:Так что вы должны идти от
чтобы:
Лучше всего это делать на чистом рабочем дереве.
Смотрите
git config --global rebase.autostash true
, особенно после Git 2.10 .источник
q2a
наX
и выберите Rebase 2 commits из вариантов появившегося диалога.git rebase --onto
.rebase.autostash
конфигурацию: это позволит избежать потери выполняемой работы в рабочем дереве при выполнении ребазирования.Вы можете использовать,
git cherry-pick
чтобы просто выбрать коммит, который вы хотите скопировать.Вероятно, лучший способ - создать ветку из master, а затем использовать в этой ветке
git cherry-pick
2 коммита из quickfix2, которые вы хотите.источник
Самое простое, что вы можете сделать, это выбрать диапазон вишни. Он делает то же самое, что и
rebase --onto
для глаз:источник
rebase --onto
также сохраняет оригинальные изменения?rebase
иcherry-pick
дать вам новые ключи SHA. Это потому, что каждый коммит является уникальным снимком репозитория.cherry-pick
диапазон, как в этом ответе, и это смутило мой репо. Я должен был сделать отдельныеcherry-pick
s для каждого коммита. (И, может быть, само собой разумеется, но в случае, если кто-то борется, вы должныcherry-pick
в хронологическом порядке, что ваши коммиты были применены.)git checkout
имеет решающее значение здесь. какая у тебя ГОЛОВА :)?Я считаю, что это:
источник
cherry-pick
работает с хешами коммитов, поэтому, если вы просто хотите взять коммит из какого-то места и поместить его в другое место, это путь. Просто убедитесь, что вы делаетеcheckout <branch>
правильную ветку в первую очередь.Другие более полезные команды здесь с объяснением: Git Guide
источник