web-dev-qa-db-ja.com

歴史に埋もれたGitコミットを分割するにはどうすればよいですか?

私は自分の歴史をほのめかし、それにいくつかの変更を加えたいと思います。問題は、2つの無関係な変更を含むコミットがあり、このコミットがローカル(プッシュされていない)履歴の他の変更に囲まれていることです。

プッシュする前にこのコミットを分割したいのですが、私が見ているガイドのほとんどは、最新のコミットまたはコミットされていないローカルの変更を分割することに関係しています。それ以降のコミットを「やり直す」必要なく、歴史に少し埋もれたコミットに対してこれを実行することは可能ですか?

288
Ben

コミットを分割するためのガイドがあります リベースマンページ内 。簡単な要約は次のとおりです。

  • ターゲットコミット(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を実行して、分割されたコミットの後にコミットの適用を続行します。

440
Cascabel

Magit でこれを行う方法は次のとおりです。

Ed417aeをコミットすると、変更したいものになります。 2つの無関係な変更が含まれ、1つ以上のコミットに埋もれています。 llを押してログを表示し、ed417aeに移動します。

initial log

次に、rを押して、リベースポップアップを開きます

rebase popup

およびmは、ポイントでコミットを変更します。

分割したいコミットに@があることに注意してください。つまり、HEADがそのコミットにあることになります。

modifying a commit

HEADを親に移動したいので、親(47e18b3)に移動し、xmagit-reset-quicklyevil-magitを使用している場合はoにバインド)を押して、「ポイントでコミットすることを意味します」と入力します「。ログは次のようになります。

log after resetting

ここで、qを押して通常のMagitステータスに移動し、通常のunstage uコマンドを使用して、最初のコミットで実行されないものをステージング解除し、通常どおりcをコミットしてから、2番目のコミットで実行されるstageおよびcommitを実行し、完了したら、rを押してリベースポップアップを開きます

rebase popup

続行する別のrで、完了です! llは次を示します。

all done log

2
unhammer

コミット<commit>を分割してこのコミットの前に新しいコミットを追加し、<commit>の作成者日付を保存するには、次の手順に従います。

  1. コミットを編集しますbefore<commit>

    git rebase -i <commit>^^
    

    NB:<commit>も編集する必要があるかもしれません。

  2. チェリーピック<commit>インデックスに

    git cherry-pick -n <commit>
    
  3. インデックスから不要な変更を対話的にリセットし、作業ツリーをリセットします

    git reset -p && git checkout-index -f -a
    

    代わりに、不要な変更をインタラクティブに隠しておくだけです:git stash Push -p -m "tmp other changes"

  4. 他の変更(ある場合)を行い、新しいコミットを作成します

    git commit -m "upd something" .
    

    必要に応じて、項目2〜4を繰り返して、さらに中間コミットを追加します。

  5. リベースを続行

    git rebase --continue
    
1
ruvim