Как переместить определенные коммиты в другую ветку в 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

затем вам нужно снова зафиксировать изменения, но это намного проще, чем делать это вручную...