歴史に埋もれたgitコミットを分割するにはどうすればよいですか?
-
29-09-2019 - |
質問
私は自分の歴史を叩き、それにいくつかの変更をしたいと思っています。問題は、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
現在、スプリットのコミットの後にコミットを適用するため。
他のヒント
これがどのようにそれを行うかです マジット.
ED417AEをコミットすることはあなたが変えたいものだとします。 2つの無関係な変更が含まれており、1つ以上のコミットの下に埋葬されています。打つ ll
ログを表示し、ED417AEに移動するには:
その後、ヒットします r
リベースポップアップを開くには
と m
ポイントでコミットを変更します。
方法に注意してください @
今、あなたが分割したいコミットにあります - つまり、頭がそのコミットにあることを意味します:
私たちは親に頭を動かしたいので、親(47E18B3)に移動してヒットします x
(magit-reset-quickly
, 、縛られています o
使用している場合 evil-magit
)そして、「はい、私はポイントでコミットを意味していました」と言います。あなたのログは次のように見えるはずです:
今、ヒットします q
通常のMAGITステータスに移動するには、通常のUNSTAGEを使用します u
最初のコミットで何が起こらないかを舞台に導くコマンド、コミット c
残りはいつものように s
Tageと c
2番目のコミットで何が起こるか、そして完了したら:ヒット r
リベースポップアップを開くには
そして別の r
続けるために、そしてあなたは終わった! ll
今示しています:
コミットを分割する <commit>
追加します これの前に新しいコミット, 、そして著者の日付を保存します <commit>
, 、 - ステップは次のとおりです。
コミットを編集します 前
<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
まだプッシュしていない場合は、使用してください git rebase
. 。さらに良いことに、使用してください git rebase -i
インタラクティブにコミットを移動する。違反のコミットを正面に移動し、好きなように分割してパッチを戻すことができます(必要に応じて)。