53

git リポジトリがあり、master で作業しているとします。さかのぼってブランチを作成できますか。例えば:

A - B - C - A1 - D - A2 - E

私はそれを次のようにしたい:

A - A1 - A2   
\           \   
B - C - D - E

特定の使用例は、古いバージョンのブランチに大量のコミットをチェリー ピックし、それを複数の古いバージョンに移動する必要があり、それらすべてのリビジョンでチェリー ピックを繰り返したくない場合です。

本質的には、そもそもフィーチャーまたはトピック ブランチとして優れていたはずのものですが、そのように作成されたわけではありません。

4

5 に答える 5

119

リビジョン XXX 以降のすべてのコミットをブランチで行いたい場合は、他の提案された方法よりもはるかに簡単です。

$ git branch fixes       # copies master to new branch
$ git reset --hard XXX   # resets master to XXX

コミットは現在、「修正」ブランチにのみあります。

この手順は、git のヘルプ ページのreset「コミットを取り消して、トピック ブランチにする」で説明されています。

于 2011-01-20T18:11:17.417 に答える
23

もちろんできます。(Git では、とにかくできないことはあまりありません。:)

git checkout -b new-branch hash-of-A
git cherry-pick hash-of-A1
git cherry-pick hash-of-A2

これにより、 commit から始まる新しいブランチが作成されますA。その後、もう一度同じコミットに戻り、別のブランチを作成します。

git checkout -b new-branch2 hash-of-A
git cherry-pick hash-of-B
git cherry-pick hash-of-C
git cherry-pick hash-of-D
git cherry-pick hash-of-E
git merge new-branch

これで、マージnew-branchnew-branch2て必要な構造を取得し、古いブランチを削除するだけです。

もちろん、Dustin が言ったことはまだ有効です: コミットのハッシュは変更されるので、まだ変更を公開していない場合にのみそれを行うべきです。

于 2008-12-13T12:55:14.307 に答える
5

ハッシュを変更する必要があるため、透過的に行うことはできませんが、基本的には HEAD を分岐し、両方の分岐を rebase -i して、それぞれの変更をドロップするだけです。

于 2008-12-13T08:26:21.200 に答える
0

あなたがやりたいことは、実際に歴史を書き換えることです。コミットの識別子が変更され、場合によってはコミットによって与えられる変更セットが変更されます。したがって、変更したいブランチの古いバージョンに基づいて誰かが作業を行う可能性がある場合は、これを行わない方がよいでしょう。ただし、このブランチを公開していない場合は、お気軽に。

変更したいブランチの名前が「master」で、新しいブランチを開始したいポイントの名前が「A」であると仮定します (この例では、使用できる名前の 1 つが「master~6」です)。

まず、コミット 'A' から新しいブランチを作成し、'fixes' という名前を付けましょう。

$ git checkout -b fixes A

これにより、ブランチの「修正」も最新になります。チェリーピックを解除したいコミットはわずかしかないため、ブランチの「修正」でそれらをチェリーピックできます。

$ git cherry-pick A1
$ git cherry-pick A2

次に、コミット 'A1' と 'A2' をブランチ 'master' から削除します。削除したいコミットはほんのわずかしかなく、保持したいコミットはさらに多くある可能性があるため、そのために「git rebase --interactive」を使用する必要があります。

$ git rebase -i fixes master

エディターは、コミット 'A' の後に 'master' 内のすべてのコミットで起動されます (これは一般的なコミットです。つまり、ブランチ 'master' とブランチ 'fixes' のベースをマージします)。リストは次のようになります。

pick deadbee B
pick fa1afe1 C
pick a98d4ba A1
...

コミット 'A1' と 'A2' を含む行を削除し、変更を保存し、エディターを閉じます (または変更を intractive rebase に送信します)。git は、削除したものを除くすべてのコミットを再適用します。

次に、で終了できます

$ git merge fixes

(git-rebase は、書き換えられたブランチ 'master' を残しました)。

于 2008-12-15T00:52:48.210 に答える
0

そのチェリーピッキングをすべて忘れてください。rebase -i を 2 回実行して変更を省略し、毎回新しいブランチを作成してから 2 つをマージします。

于 2011-01-20T20:20:32.600 に答える