web-dev-qa-db-ja.com

gitダブルコミット履歴の修正

私は実行しなければなりませんでしたgit filter-branch 他の日。指示に従いました github上 ですが、問題が発生しました。私thinkチームの誰かがローカルブランチでリベースを実行せず、代わりに変更をマージしました。それ以来、コミットログはダブルコミットでいっぱいになります。例:

commit b0c03ec925c0b97150594a99861d8f21fd3ab22d
Author: XXX
Date:   Wed Mar 19 17:01:52 2014 -0400

    Removed most clearfixs in templates

commit f30c21d21b5ea715a99b0844793cb4b5f5df97a1
Author: XXX
Date:   Wed Mar 19 17:01:52 2014 -0400

    Removed most clearfixs in templates

commit 2346be43d0e02d3987331f0a9eeb2f12cd698ede
Author: XXX
Date:   Wed Mar 19 16:40:26 2014 -0400

    new redirect logic

commit 1383070b31bde1aaa9eda7c2a9bcb598dd72247b
Merge: d1e2eb6 94e07fe
Author: XXX
Date:   Wed Mar 19 16:28:41 2014 -0400

    Merge branch 'develop' of github.com:xxx/xxx into develop

commit 79ce7824688cf2a71efd9ff82e3c7a71d53af229
Merge: 6079061 1ed3967
Author: XXX
Date:   Wed Mar 19 16:28:41 2014 -0400

    Merge branch 'develop' of github.com:xxx/xxx into develop

commit d1e2eb645a4fe2a1b3986082d0409b4075a0dbc9
Author: XXX
Date:   Wed Mar 19 16:28:36 2014 -0400

    Fixed broken responsiveness for companies listing page and code refactoring.

commit 6079061f6ef1f856f94d92bc0fdacf18854b8a89
Author: XXX
Date:   Wed Mar 19 16:28:36 2014 -0400

    Fixed broken responsiveness for companies listing page and code refactoring.

奇妙なことに、上記の「新しいリダイレクトロジック」のように、すべてのコミットが2倍になるわけではありません。これを修正するために私にできることはありますか?比較的良性ですが、コミット履歴はがらくたのように見えます。この SO post はそのままにしておくことを提案しましたが、後世のために、クリーンなコミット履歴が必要です。

18
ysimonson

それを達成するためのコマンドは次のとおりです。

git rebase -i HEAD~7

これにより、次のようなエディタが開きます。

pick f392171 Removed most clearfixs in templates
pick ba9dd9a Removed most clearfixs in templates
pick df71a27 Unew redirect logic
pick 79ce782 Merge branch 'develop' of github.com:xxx/xxx into develop
pick 1383070 Merge branch 'develop' of github.com:xxx/xxx into develop
...

これで、各コミットをどうするかをgitに指示できます。機能を追加したコミットf392171を保持しましょう。次の2つのコミットを最初のコミットに押しつぶします-1つはクリーンなままにします。

ファイルを次のように変更します。

pick f392171 Removed most clearfixs in templates
squash ba9dd9a Removed most clearfixs in templates
pick df71a27 Unew redirect logic
pick 79ce782 Merge branch 'develop' of github.com:xxx/xxx into develop
squash 1383070 Merge branch 'develop' of github.com:xxx/xxx into develop

エディターを保存して終了すると、Gitは2つの変更をすべて適用してから、エディターに戻って3つのコミットメッセージをマージします。

# This is a combination of  commits.
# The first commit's message is:
Removed most clearfixs in templates

# This is the 2nd commit message:

Removed most clearfixs in templates

完了したら、エディタを保存して終了します。 Gitはコミットを1つに押しつぶします。出来た!

それからあなたはしなければなりません

git Push Origin your-branch -f

ローカルで変更をリモートブランチに強制的にコミットします。

注:重複するすべてのコミットに対してスカッシュを実行する必要があります。

24
VAIRIX

@VAIRIXによる回答は完璧ですが、重複するコミットが互いに隣接して表示されない複雑なケースがあるため、押しつぶしても役に立ちません。

したがって、以下の履歴を取得すると、(a〜がaの複製であると想定)

 # h
 # g
 # f
 # c~
 # b~
 # a~
 # e
 # d
 # c
 # b
 # a

従うべきコマンド:(マスターでリベースしたい場合は@VAIRIX以下の回答で言われているように)git rebase master -i(頭痛のリベースを避けるためにgit rebase -i HEAD~nに従う方が良い)

今! 1)以下のように繰り返されるコミットを押しつぶします。

 pick h
 pick g
 pick f
 pick c~
 s b~
 s a~
 pick e
 pick d
 pick c
 pick b
 pick a

さて、これはあなたのコミットをcで押しつぶします

 # h
 # g
 # f
 # c~ (having changes of a~ and b~)
 # e
 # d
 # c
 # b
 # a

私の場合、c〜はcのアンチコミットだったので、もう一度プロセスを実行する必要がありましたが、sで押しつぶす代わりに、dでコミットを削除します。

 pick h
 pick g
 pick f
 d c~ (having changes of a~ and b~)
 pick e
 pick d
 pick c
 pick b
 pick a

これで、履歴によって重複するコミットがすべて削除されます。これで、このブランチに対して重複したコミットがあったgit diffを使用していたOriginブランチと比較できます。完璧にやったら、違いはないはずです。

このプロセスは少し長く見えるかもしれませんが、コミットを見逃すことはありません。

5