過去のコミットを変更して欠落ファイルを含めるにはどうすればよいですか?


98

変更をコミットしましたが、変更セットにファイルを追加するのを忘れていました。他のコミットの後、ファイルがHEAD^4コミットこと。

不足しているファイルを含めるように以前のコミットを書き換えるにはどうすればよいですか?


これらの4つのコミットをプッシュしましたか?
mvp 2013年

@mvpいいえ、私のローカルgitリポジトリのみにあります。
kolrie 2013年

回答:


53

修正したいコミットのオプションを使用git rebase --interactive HEAD~4して設定しeditます。

この方法でリモートリポジトリにプッシュされたコミットを変更しないでください。その場合は、ファイルが不足している新しいコミットを追加することをお勧めします。


ありがとう。私がリモートリポジトリの唯一のユーザーである場合でも、それは事実ですか?git push -fアップストリームが変更されなかったと確信している場合は、それが可能になりますか?
kolrie 2013年

1
あなたがリモートリポジトリの唯一のユーザーである場合、強制プッシュを実行しても問題ありません。
ラファウRawicki

7
これらの指示は十分に詳細ではないと思います。「リベースできません:インデックスにコミットされていない変更が含まれています」と初めて言われたときに、それを試してみました。add不足しているファイルをすでに削除したので、メッセージとして「xxx」を使用してコミットしました。次に、rebaseコマンドを実行して、「xxx」のコミットを「選択」から「編集」に変更しました。次に、「git rebase --continue」を実行しました。履歴を見ると、最新のコミットとして「xxx」があり、それらを追加したい以前のコミットは変更されていません。私の間違いはどこだったのかしら?
ダレン・クック

2
最後のコミットを押しつぶしても、ファイルはHEAD〜4に配置されません。
ジャスティン

1
git add addedFiles; git commit -m "Blah"; git rebase -i HEAD〜5; //新しいコミットが追加されたため、4ではなく5でリベースする必要がありました。「Blah」コミットを2行目に移動し、「Pick」から「s」(スカッシュ)に変更して、HEAD〜でコミットをスカッシュしますコマンドが上から下に実行されると5
zstring

273

私は人々がググってもっと簡単な答えを見つけるためにここに来ることができることに気づきます:それがちょうど最後のコミットだったとしたら? (OPの質問は、履歴の4番目のコミットを修正することです)

コミットしてすぐにファイルを追加するのを忘れた場合は、次のようにしてください:

# edited file-that-i-remember.txt
git add file-that-i-remember.txt
git commit

# realize you forgot a file
git add file-that-i-forgot.txt
git commit --amend --no-edit

どこ --no-edit同じコミットメッセージをに保管する。

かんたん簡単!


21
これが答えです。
Adam Bittlingmayer

5
コミットがリモートにプッシュされない場合、言及する価値があります。
Ram Patra 2017

1
はい、ここでコメントで言及する価値があります:pushの前に使用するためです。それを指摘してくれてありがとう。
Beco博士、2017

2
1つの通知は、前後のコミットでハッシュ--amend異なることです
sonlexqt 2017

5
ありがとうございます。ただし、OPはを要求しましたHEAD^4。参照用の補遺と同じように、問題ありません。;)
Beco博士、2017

11

これらの4つのコミットをプッシュしていない場合は、次のように実行できます。

これらすべてのコミットのパッチファイルを作成します。

git format-patch -4

4コミット分巻き戻します。

git reset --hard HEAD~4

不足しているファイルを追加:

git add missing-file

コミットする--amend

git commit --amend

保存したすべてのパッチを元に戻します。

git am *.patch

プッシュした場合は、このメソッドを使用しないでください。代わりに、あなたの失敗を認めて、この問題を修正するHEADの上にもう1つのコミットを作成してください。


これを段階的に実行したい場合は、パッチとしてエクスポートするよりも、変更後のコミットを簡単に選択する方が簡単です。
ラファウRawicki

1
これは好みの問題です。私はgit format-patch/ git amより良いです。最も重要なのは、何かを台無しにした場合の信頼性が高まることです。物理ファイルにパッチとして保存されたコミットは、最善の安全策です。
mvp 2013年

本当の自信は実際にあります。gitリポジトリで操作するときは、ものを削除することはありません。あなたが実行するまで、旧コミットが用意されていますgit gc:)
ラファウRawicki

これはあなたにとっても私にとっても些細で明白なことです。しかし、始めたばかりで、おそらくgitについて何も理解していないユーザーにとっては、この事実はまったく明らかではありません。
mvp 2013年

2
これらの手順は時間がかかるように見えましたが、非常にシンプルでわかりやすかったです。ありがとう。(私は最後のステップを追加します:rm *.patch
Darren Cook

9

受け入れられた答えは正しいですが、リベースプロセス中にコミットの編集を実行する方法に関する詳細な説明が欠けています。

  • まず、リベースプロセスを開始します。

    git rebase --interactive HEAD~4
    
  • コミットのリストが表示されるので、単語pickを変更して編集するコミットを選択しedit、ファイルを保存します。

  • コードに必要な変更を加えます(git add新しいファイルを呼び出すことを忘れないでください)

  • すべての変更が完了したら、発行しますgit commit --amend-これにより、次のようにマークされたコミットが修正されますedit

  • git rebase --continueプロセスを完了する呼び出しを実行します(としてマークされているコミットがさらにある場合edit、上記の手順を繰り返す必要があります)

重要なメモ:

  • pick編集したくない行は削除せず、そのままにしておきます。これらの行を削除すると、関連するコミットが削除されます

  • GITはあなたに stash作業ディレクトリがクリーンでない場合、前に。ただしgit stash pop / git stash apply、リベース中にこれらの変更(つまり、リベースプロセスを開始する前に隠された変更)を、次のようにマークされたコミットに修正することができます。edit

  • 問題が発生し、リベースプロセス中に行われた変更を完了する前に元に戻したい場合(つまり、リベースを開始する前の時点に戻したい場合)は、次git rebase --abortも使用します。 --abort doesnの」の場合、対話型リベースを中止する方法働く?

  • 受け入れられた答えで述べたように:

    この方法でリモートリポジトリにプッシュされたコミットを変更しないでください。その場合は、ファイルが不足している新しいコミットを追加することをお勧めします。

    理由は、Gitブックにあります(「リベースの危険というタイトルの段落」)にあります。

    リポジトリの外部に存在するコミットをリベースしないでください。

    そのガイドラインに従えば、大丈夫です。そうしないと、人々はあなたを憎み、あなたは友人や家族に軽蔑されるでしょう。

    何かをリベースするときは、既存のコミットを破棄し、似ているが異なるコミットを新しく作成します。コミットをどこかにプッシュし、他のユーザーがそれらをプルダウンして作業をベースにし、その後それらのコミットをgit rebaseで書き直して再度プッシュすると、共同編集者は作業を再マージする必要があり、しようとすると事態が複雑になります彼らの仕事をあなたのものに戻しなさい。

    [...]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.