Как переместить определенные коммиты в другую ветку в git?
ситуация:
- мастер находится на X
- quickfix1 находится на X + 2 коммитов
такое, что:
o-o-X (master HEAD)
q1a--q1b (quickfix1 HEAD)
затем я начал работать над quickfix2, но случайно взял quickfix1 в качестве исходной ветви для копирования, а не мастера. Теперь quickfix2 находится в X + 2 commits + 2 соответствующих коммитов.
o-o-X (master HEAD)
q1a--q1b (quickfix1 HEAD)
q2a--q2b (quickfix2 HEAD)
Теперь я хочу иметь ветку с quickfix2, но без 2 коммитов, которые принадлежат quickfix1.
q2a'--q2b' (quickfix2 HEAD)
/
o-o-X (master HEAD)
q1a--q1b (quickfix1 HEAD)
Я попытался создать патч из определенной ревизии в quickfix2, но патч не сохраняет историю фиксации. Есть ли способ сохранить историю фиксации, но иметь ветку без изменений в quickfix1?
5 ответов
Это классический случай rebase --onto
:
# let's go to current master (X, where quickfix2 should begin)
git checkout master
# replay every commit *after* quickfix1 up to quickfix2 HEAD.
git rebase --onto master quickfix1 quickfix2
так что вы должны пойти от
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
\
q2a--q2b (quickfix2 HEAD)
в:
q2a'--q2b' (new quickfix2 HEAD)
/
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
это лучше всего сделать на чистом рабочем дереве.
посмотреть git config --global rebase.autostash true
, особенно после Git 2.10.
можно использовать git cherry-pick
чтобы просто выбрать фиксацию,которую вы хотите скопировать.
вероятно, лучший способ-создать ветвь из master, а затем в этой ветви использовать git cherry-pick
на 2 коммитов из quickfix2, которые вы хотите.
самое простое, что вы можете сделать, это выбрать нужный ассортимент. Он делает то же самое, что и rebase --onto
но легче для глаз :)
git cherry-pick quickfix1..quickfix2
Я считаю, что это:
git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2
единственный рабочий способ, который я нашел:
git show>~/some_file.txt
git checkout master
git checkout -b new_branch
git apply -stat ~/some_file.txt
git apply -check ~/some_file.txt
git apply ~/some_file.txt
затем вам нужно снова зафиксировать изменения, но это намного проще, чем делать это вручную...