21

ローカル履歴のどこかに 2 つの結果的なコミットがあり、1 つのファイルが誤って 2 つ目のファイルに追加されました。状況を整えたい。

対話型リベースの使用方法がわかりません。そこからチェックアウトするために、ファイルを使用しgit rebase -i HEAD~10てコミットを編集することを選択しました。私は git guit を使用していますが、コミット領域にファイルが表示されません。以前のコミットを修正することを選択すると、ファイルが表示されます。ただし、最初に現在のコミットにファイルが表示されないため、誤って配置されたファイルを以前のコミットに追加することはできません。

4

5 に答える 5

33

したがって、リベースするときは、誤ってファイルを追加したコミットと、追加したいコミットの両方をその順序で編集することを選択します。ファイルが後のコミットにあるが、以前のコミットにある必要がある場合は、行を並べ替える必要があります。たとえば、私は

pick 8de731b Commit with missing file.
pick bbef925 Commit with too many files.
pick 52490ce More history.

に変更する必要があります

edit bbef925 Commit with too many files.
edit 8de731b Commit with missing file.
pick 52490ce More history.

それで、

# In the commit containing an extra file
git reset HEAD^ badfile.c
git commit --amend
git rebase --continue

# Now in the commit to add it to
git add badfile.c
git commit --amend
git rebase --continue

残念ながら、1 つのブランチで履歴を編集する場合、すべてのブランチで履歴を編集しないようにする方法はわかりません。このような問題を回避するには、リベースをできるだけ早く行う必要があります。ここでの私の単純なケースでは、マスターと他のブランチをマージできますが、コミットはマージされません。次に、マスターでリベースし、次のようにコミットを並べ替えてスカッシュする必要があります。

pick 7cd915f Commit with missing file.
fixup 8de731b Commit with missing file. #This was the higher of the two entries
pick 8b92c5a Commit with too many files.
fixup bbef925 Commit with too many files. #This was the higher of the two entries
pick 94c3f7f More history.
fixup 52490ce More history. #This was the higher of the two entries

後期編集:元の回答からの持ち越しとして、コミット履歴を誤って並べ替えていることに気付きました。リベースの行を入れ替えると、コミットする順序が変わります。編集後、再度リベースして元のコミット順序に戻すことができます。

于 2013-09-02T09:53:41.673 に答える
18

間違っていなければ、commit 2 に含まれていた変更を commit 1 に移動する必要があります。

これを行う最も簡単な方法は、インタラクティブなリベースを 2 回連続して行うことです。

最初のコミットでは、コミット 2 を 2 つのコミットに分割します。最初のコミットには移動する変更のみが含まれ、2 番目のコミットには残りのすべてが含まれます。現在、コミット 1、2.1、および 2.2 があります。

次に、再度リベースし、今回はコミット 2.1 を 1 にスカッシュすることを選択します。

于 2013-09-02T10:08:27.030 に答える
11

私はよくこの問題に出くわすので、このためのスクリプトを書きました。全自動で作動します。Githubで見つけることができます。それをローカル ファイル システムにコピーし、PATH に追加すると、次のように実行できるようになります。

mv-changes <source-commit> <destination-commit> <path>...

Windows の Git-Bash シェルでスクリプトを実行することもできます。

<path>の間の中間コミットで の変更がある場合、機能しないことに注意してください。source-commitdestination-commit

詳細については、こちらを参照してください。

于 2016-02-17T09:49:00.210 に答える