私は自分の歴史をほのめかし、それにいくつかの変更を加えたいと思います。問題は、2つの無関係な変更を含むコミットがあり、このコミットがローカル(プッシュされていない)履歴の他の変更に囲まれていることです。
プッシュする前にこのコミットを分割したいのですが、私が見ているガイドのほとんどは、最新のコミットまたはコミットされていないローカルの変更を分割することに関係しています。それ以降のコミットを「やり直す」必要なく、歴史に少し埋もれたコミットに対してこれを実行することは可能ですか?
コミットを分割するためのガイドがあります リベースマンページ内 。簡単な要約は次のとおりです。
ターゲットコミット(git rebase -i <commit-to-split>^ branch
など)を含むインタラクティブなリベースを実行し、編集対象としてマークします。
リベースがそのコミットに達したら、git reset HEAD^
を使用してコミット前にリセットしますが、作業ツリーはそのままにしておきます。
変更を段階的に追加してコミットし、必要な数のコミットを行います。 add -p
は、特定のファイルに一部の変更のみを追加するのに役立ちます。特定のコミットで元のコミットメッセージを再利用する場合は、 commit -c ORIG_HEAD
を使用します。
コミットしているものをテストする(良いアイデア!)場合は、git stash
を使用して、コミットしていない部分(またはコミットする前にstash --keep-index
)を非表示にし、テストしてから、git stash pop
を使用して残りを作業ツリーに戻します。すべての変更をコミットするまで、つまりクリーンな作業ツリーができるまで、コミットを続けます。
git rebase --continue
を実行して、分割されたコミットの後にコミットの適用を続行します。
Magit でこれを行う方法は次のとおりです。
Ed417aeをコミットすると、変更したいものになります。 2つの無関係な変更が含まれ、1つ以上のコミットに埋もれています。 ll
を押してログを表示し、ed417aeに移動します。
次に、r
を押して、リベースポップアップを開きます
およびm
は、ポイントでコミットを変更します。
分割したいコミットに@
があることに注意してください。つまり、HEADがそのコミットにあることになります。
HEADを親に移動したいので、親(47e18b3)に移動し、x
(magit-reset-quickly
、evil-magit
を使用している場合はo
にバインド)を押して、「ポイントでコミットすることを意味します」と入力します「。ログは次のようになります。
ここで、q
を押して通常のMagitステータスに移動し、通常のunstage u
コマンドを使用して、最初のコミットで実行されないものをステージング解除し、通常どおりc
をコミットしてから、2番目のコミットで実行されるs
tageおよびc
ommitを実行し、完了したら、r
を押してリベースポップアップを開きます
続行する別のr
で、完了です! ll
は次を示します。
コミット<commit>
を分割してこのコミットの前に新しいコミットを追加し、<commit>
の作成者日付を保存するには、次の手順に従います。
コミットを編集しますbefore<commit>
git rebase -i <commit>^^
NB:<commit>
も編集する必要があるかもしれません。
チェリーピック<commit>
インデックスに
git cherry-pick -n <commit>
インデックスから不要な変更を対話的にリセットし、作業ツリーをリセットします
git reset -p && git checkout-index -f -a
代わりに、不要な変更をインタラクティブに隠しておくだけです:git stash Push -p -m "tmp other changes"
他の変更(ある場合)を行い、新しいコミットを作成します
git commit -m "upd something" .
必要に応じて、項目2〜4を繰り返して、さらに中間コミットを追加します。
リベースを続行
git rebase --continue