web-dev-qa-db-ja.com

マージコミットがgit rebase --interactiveに表示されない

git logは以下を明らかにします:

commit 1abcd[...]
Author: [...]
Date: [...]

    [Useful commit]

commit 2abcd[...]
Author: [...]
Date: [...]

    Merge branch [...] of [etc. etc.]

commit 3abcd[...]
Author: [...]
Date: [...]

    [Useful commit]

そのマージコミットは私には役に立たない-ブランチの意味のある状態を表すものではなく、リモートプルから生成されたので、リモート履歴の実際のコミットがある-プルしたという事実をマークするためのコミットは不要。このマージコミットを押しつぶしたいと思います。スカッシュを行うための私の通常のテクニックは次のとおりです。

git rebase --interactive HEAD~2(または、どこまで行かなければならないか)

そして、私はそれを隣接するコミットに押しつぶします。たとえば、コミットを行って、重要な詳細(単一のファイル、またはいずれかのファイルの行を変更していなかった)を見逃したことに気付いた場合、これを何度か行い、基本的には迅速な処理である別のコミットを行います。そうすることで、変更をリモートにプッシュして戻すと、すべてが素晴らしくクリーンであり、まとまりのある物語を伝えます。

ただし、この場合、git rebase ...コマンドを実行すると、コミット2abcdが表示されません。 2abcdをスキップして、代わりに1abcd3abcdが表示されます。マージコミットについて、git rebase --interactiveに表示されないようにする特別なものはありますか?マージコミットを押しつぶすために他にどのようなテクニックを使用できますか?

[〜#〜] update [〜#〜] @Cupcakeのリクエストごと:

git log --graph --oneline --decorateの出力は次のようになります。

* 1abcd (useful commit)
* 2abcd (merge)
|  \ <-- from remote
|   * 3abcd (useful commit)
|   |

役に立ちましたか?

29
NWard

Rebaseは通常、--preserve-mergesなしでマージコミットを保持しません

わかりましたので、--preserve-mergesを使用してインタラクティブなリベースを使用してマージコミットを押しつぶそうとした場合にどうなるかは正確にはわかりませんが、これはあなたのケースでマージコミットを削除して履歴を作成する方法です線形:

  1. マージコミットの前にすべてをリモートブランチの上にリベースします。

  2. 以前にリベースされたコミットの上にマージコミット後のすべてをチェリーピックまたはリベースします。

マージコミット後にコミットが1つしかない場合

したがって、コマンドに関しては、次のようになります。

# Reset to commit before merge commit
git reset --hard <merge>^

# Rebase onto the remote branch
git rebase <remote>/<branch>

# Cherry-pick the last commit
git cherry-pick 1abcd 

マージコミットの後に複数のコミットがある場合

# Leave a temporary branch at your current commit
git branch temp

# Reset to commit before merge commit
git reset --hard <merge>^

# Rebase onto the remote branch
git rebase <remote>/<branch>

# Cherry-pick the last commits using a commit range.
# The start of the range is exclusive (not included)
git cherry-pick <merge>..temp

# Alternatively to the cherry-pick above, you can instead rebase everything
# from the merge commit to the tip of the temp branch onto the other
# newly rebased commits.
#
# You can also use --preserve-merges to preserve merge commits following
# the first merge commit that you want to get rid of...but if there were
# any conflicts in those merge commits, you'll need to re-resolve them again.
git rebase --preserve-merges --onto <currentBranch> <merge> temp

# These next steps are only necessary if you did the rebase above,
# instead of using the cherry-pick range.
#
# Fast-forward your previous branch and delete temp
git checkout <previousBranch>
git merge temp
git branch -d temp

ドキュメンテーション

32
user456814