web-dev-qa-db-ja.com

特定のコミットをgitの別のブランチに基づくように移動する方法

状況:

  • マスターは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に属する2つのコミットはありません。

      q2a'--q2b' (quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

Quickfix2の特定のリビジョンからパッチを作成しようとしましたが、そのパッチはコミット履歴を保存しません。コミット履歴を保存する方法はありますが、quickfix1を変更せずにブランチを作成することはできますか?

345
Alex Yarmula

これは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以降

340
VonC

git cherry-pickを使用して、コピーしたいコミットを選ぶことができます。

おそらく最良の方法はmasterからブランチを作成することです、そしてそのブランチであなたが望むquickfix2からの2つのコミットにgit cherry-pickを使用してください。

142
DJ.

あなたができる最も簡単なことはチェリーの範囲を選ぶことです。これはrebase --ontoと同じですが、目には簡単です:)

git cherry-pick quickfix1..quickfix2
128
Christoph

私はそれが信じます:

git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2
25