7

私はすでにこれらの以前の質問を見てきました:

ただし、特定の問題に正確に対処しているわけではありません。インデックスには他の変更があります。コマンドを実行するrebaseと、git は次のように文句を言います。Cannot rebase: You have unstaged changes.

シナリオ:

最後のコミットの前のコミット (「2 HEAD 前」と呼んでいますか?) はリファクタリング コミットでした。現在、インデックスにはステージングされていない多くの変更がありますが、前のコミットから最後のコミットに追加したいのはその一部だけです。

これを行う方法は次のようになると想像しています。

  1. stash現在のすべての変更
  2. rebase -i前のコミットから最後のコミットまで (インデックスを変更し、ヘッドを移動しますよね?)
  3. ヘッドを変更せずにスタッシュをインデックスにロードします (どのように?)
  4. 使用add -pcommit --amendて、この古いコミットを選択的に変更します
  5. rebase --continue終了する (子を更新し、Head を最初の場所に戻します。インデックスはどうなりますか?)
  6. 次に、スタッシュをポップ/クリアします(インデックスを開始した場所に戻します)。

これは正しいです?そうである場合、ステップ 3 を行うにはどうすればよいですか? そうでない場合、代わりに何をすべきですか?

また、私はまだ git について学んでおり、git 内のもの (Head、index、stash など) を適切に参照しているとはまだ 100% 確信が持てないことに注意してください。


解決:

これが役立つ可能性がある他の人にとって、これらは私が実際に行った手順です。

  1. git stash現在のすべての変更
  2. git rebase -i <ID>前から最後のコミットの親へ、インデックスを変更してヘッドを移動
  3. git stash applyヘッドを変更せずにスタッシュをインデックスにロードする
    • 競合がある場合は、git reset HEAD <file>ファイルのステージングをアンロードします。ステージングが明確であることを確認してください。
  4. add -pおよびを使用して、commit --amend変更を選択的にステージングし、コミットする
  5. git reset --hardヘッドに一致するようにインデックスを破棄する
  6. git rebase --continue終わる。子を更新し、頭を最初に戻しますが、変更があります
    • history は現在、2 つのバージョンに分岐しています。もう一方のブランチは、以前に隠しておいた WIP で終了します。
  7. 次に、スタッシュをポップして、インデックスを開始した場所に戻します。もう一方のブランチもクリアされます。
4

4 に答える 4

4

あなたが何をしたいのか理解できれば、最初のリンクの答えと大差ありません。古いコミットに追加したくない変更を隠しておくだけです。次のように実行できます。

  1. 最後から 2 番目のコミットに追加する変更をコミットします。長くは続かないので、「これを追加してください」のような簡単なコミット メッセージを与えるだけです。
  2. コミットに追加したくない残りの変更を隠します。
  3. 追加するコミットのを検索します。たとえば、変更するコミットの SHA1 が でaaaaaaa、その親がbbbbbbbである場合は、 bbbbbbb.
  4. 実行しますgit rebase -i bbbbbbb(手順 3 で決定した正しいコミットに置き換えます)。最新のコミット (「これを追加」) を変更中のコミットのすぐ下に移動し、 からpickに変更しfixupます。これにより、そのコミットのメッセージを変更せずにそのコミットに追加されます。
  5. ステップ 1 の変更を unstash し、そこから変更を実行します。
于 2012-12-14T00:41:29.027 に答える
3

あなたの計画は良さそうですね。git stash applyorはgit stash pop作業ツリーやインデックスを変更しますが、HEAD は変更しないため、リベース編集中に実行できるはずです。

于 2012-12-14T00:28:49.827 に答える
0
`git stash`
`git checkout <COMMIT HASH from 2 commits ago>`
`git stash pop`
`git add` (selectively--one file at a time)
`git commit --amend`
`git stash` (to re-stash all the changes you didn't commit)
`git branch temp`
`git checkout master`
`git rebase temp -i`

これにより、コミットのリスト (行ごとに 1 つのコミット) を含むテキスト エディターが開きます。置き換えたい古いコミットである最初の行を削除します。保存して閉じます。

`git branch -d temp` (to clean up the branch you created)
于 2012-12-14T00:37:19.860 に答える