私は自分の歴史を一掃し、それにいくつかの変更を加えたいと思っています。問題は、2つの無関係な変更を伴うコミットがあり、このコミットがローカル(プッシュされていない)履歴の他のいくつかの変更に囲まれていることです。
このコミットをプッシュする前に分割したいのですが、私が目にしているガイドのほとんどは、最新のコミットまたはコミットされていないローカル変更の分割に関係しています。それ以降、自分のコミットを「再実行」する必要なく、少し歴史に埋もれているコミットに対してこれを行うことは可能ですか?
私は自分の歴史を一掃し、それにいくつかの変更を加えたいと思っています。問題は、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
して、分割されたコミットの後でコミットの適用を続行します。
git rebase -i <sha1_of_the_commit_to_split>^ branch
。またgit gui
、分割タスクの優れたツールであり、ファイルのさまざまな部分をさまざまなコミットに追加するために使用できます。
git add -p
。これはgit gui
、この部門でできる以上のことを実行できます(特に、ハンクの編集、現在のハンクから始まるすべてのステージング、正規表現によるハンクの検索)。
変更したいのはed417aeコミットだと言ってください。2つの無関係な変更が含まれており、1つ以上のコミットの下に埋もれています。ヒットll
してログを表示し、ed417aeに移動します。
次に、ヒットr
してリベースポップアップを開きます
そしてm
時点でコミット変更します。
@
分割したいコミットがどのようになっているのかに注意してください。つまり、HEADは現在そのコミットにいます。
HEADを親に移動したいので、親(47e18b3)に移動し、x
(magit-reset-quickly
、o
使用している場合にバインドされているevil-magit
)を押して、「はい、ポイントでのコミットを意味します」と入力します。ログは次のようになります。
さて、ヒットq
後、定期的なunstage使用し、定期的なMagit状態に行くためにu
、最初のコミットに行くコミットしていないものをunstageにコマンドをc
いつものように残りの部分を、その後、s
田下とc
OMMITで何が起こっ二コミット、および完了時:ヒットr
してリベースポップアップを開く
もう1つr
続行すると、完了です。ll
今示しています:
コミットを分割して、このコミットの前に新しいコミット<commit>
を追加し、作成者の日付を保存するには、以下の手順に従います。<commit>
前にコミットを編集 <commit>
git rebase -i <commit>^^
注:おそらく編集も必要になります<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
1つのファイルのみからコンテンツを抽出する場合は、より高速なバージョンがあります。インタラクティブなリベースは実際にはインタラクティブではないため、より高速です(もちろん、最後のコミットから抽出したい場合はさらに高速になり、リベースする必要がまったくありません)。
the_file
。閉じるthe_file
。それだけが必要なエディションで、残りはすべてgitコマンドです。インデックスでその削除をステージングします。
git add the_file
インデックスに影響を与えずに、削除した行をファイルに復元します。
git show HEAD:./the_file > the_file
「SHA1」は、行を抽出するコミットです。
git commit -m 'fixup! SHA1'
ステップ3で復元された抽出するコンテンツを使用して、2番目の新しいコミットを作成します。
git commit -m 'second and new commit' the_file
編集しないでください、停止/続行しないでください-すべてを受け入れてください:
git rebase --autosquash -i SHA1~1
もちろん、抽出するコミットが最後のコミットである場合はさらに速くなります。
4. git commit -C HEAD --amend
5. git commit -m 'second and new commit' thefile
6. no rebase, nothing
使用する場合magit
、ステップ4、5、6は単一のアクションです:コミット、即時修正
まだプッシュしていない場合は、を使用してくださいgit rebase
。さらに、git rebase -i
コミットをインタラクティブに移動するために使用します。問題のコミットを前面に移動してから、必要に応じて分割し、必要に応じてパッチを元に戻すことができます。