2011-08-04 8 views
10

途中のコミットに新しい変更を追加する方法は、トップコミットに追加しないことです。Gitの途中でコミットに変更を加える

git log 
commit1 <--- HEAD 
commit2 
commit3 

commit3に直接変更を追加するには、commit1とcommit2を削除してからcommit3に変更を加えないでください。

stashを使用する必要がありますか?

可能であれば、リンクをご提供ください。

+0

も参照のhttp:/ /stackoverflow.com/questions/179123/how-do-i-edit-an-incorrect-commit-message-in-git –

答えて

2

commit3のコピーである新しいブランチを作成します。変更を加えてコミットします。次に、そのブランチにcommit2とcommit1をマージします。

12

対話型のリベースを行う必要があります。詳細は、git rebaseのヘルプページを参照してください。短い答えは、あなたが先に進んでいつものように "中"の変更をコミットし、次にgit rebase -i HEAD~4を実行することです。最後の3つのコミットのリストがテキストエディタに表示されます。最新のコミットが途中に置かれたコミットを並べ替えるだけで、エディターを保存して終了します。 Gitは新しい順序で履歴を再構築しようとします。それは紛争で止まるかもしれません。その場合は、マージ競合の場合と同様に修正し、すべて修正して追加した後にgit rebase --continueを実行してください。それは紛争が発生したときにこれをすべて伝えるので、エラーメッセージを読んだだけで大丈夫です。

EDIT:実際には、既存のコミットを編集するように見えます。その場合は、エディタが起動したとき、あなたの新しい一時はcommit3し、「選択」から「スカッシュ」にコマンドを変更することが次のようにコミット移動:

pick 123456 commit3 
squash 541343 tmpcommit 
pick 654321 commit2 
pick 431523 commit1 

EDIT2を:ブランチとcommit1、commit2場合コミット3はすでに公開されているので、リベースしないでください。それでは、やはり、とにかくコミットを変更するべきではないので、全体的な疑問は気にならないでしょう。私は、これが民間の支店であると仮定しています。あるいは、他の人がリベースして巻き戻すことを期待しているものです。

5

あなたはgit-rebaseでこれを行うことができます、ポップアップするファイルで

git rebase -i commit3^ 

edit commit3pick commit3を変更します。保存して終了し、変更を加えます。通常どおりにコミットしてからgit rebase --continueを使用してください。作業が完了すると、commit3とcommit2の間に新しい変更が表示されます。

(これはSjoerdの答えと同じように動作します。それはそれについて考えてのちょうど別の方法ですcommit2と変更が競合した場合、あなたはどちらの方法であることを処理する必要があります。。)

+0

'git commit --amend'を実行すべきではありません。変更を追加した後でも 'git rebase --continue'で十分です(メッセージを編集しない限り)。 – siride

+0

あなたはおそらく正しいでしょう。 –

+1

変更が既に作業ツリーにある場合、この方法は機能しません。もちろん、彼は変更を隠し、rebaseを行い、私の答えのようにスカッシュをするのではなく、コミット3を編集するときにアンスタッシュすることができます。 – siride

関連する問題