25

現在の状況:

origin/mybranch --- A1 --- B1 --- A2 --- B2 --- A3 --- B3   mybranch

その履歴(A1からB3)、特にをクリーンアップしたいと思います。まだどこにもプッシュしていないので、B*だけのパッチを作りたいからです。

私が欲しいのは:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3   mybranch

私はおそらくこれをまったくプッシュしません(または、合計されたB *のみをプッシュする場合は、A *コミットを完全に削除する必要があります)。これにさらに取り組んでいる間、追加のそのようなコミットを取得する可能性があります。

origin/mybranch --- A1+A2+A3 --- B1+B2+B3 --- A4 --- B4   mybranch

そして、それを上記のように書き直したいと思います。

私はこれを行う方法を知りたいだけではありません(私はややハッキーな方法でsthを取得できるため)、私は特にそうです。これを行うための正しい/最良/最もクリーン/最も簡単な方法をここで求めます。


私がしていること、特に。は:私は公式のxorg-xserver-1.7ブランチに取り組んでおり、パッチ(B *)を準備したいと思っています。簡単なテストのために、自己コンパイルしたxserverをシステムのものに置き換えたいので、Debian / Ubuntuパッチ(A *)をたくさん適用しました。ただし、そのパッチをどこかに投稿する場合は、それらを除外したいと思います。

4

1 に答える 1

30

インタラクティブなリベースを実行したい。

gitコマンドを試すときに最初にやりたいことは、ブランチのバックアップコピーを作成することです。

$ git branch my-backup-branch

A1コミットのハッシュが。であるとしましょう152274b。これを試して:

$ git rebase -i 152274b^

このコマンドを実行すると、エディター(通常はvim)が次のように表示されます。

pick 152274b A1
pick 14b0838 B1
pick 661b993 A2
pick a6510db B2
pick 557e171 A3
pick 85da0e4 B3

# Rebase 39a47e4..85da0e4 onto 39a47e4
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

ここから、コミットの順序を変更したり、完全に削除したり、押しつぶしたりすることができます。この例では、おそらく次のように移動して押しつぶしたいと思うでしょう。

pick 152274b A1
squash 661b993 A2
squash 557e171 A3
pick 14b0838 B1
squash a6510db B2
squash 85da0e4 B3

試してみる。望まない状態になってしまった場合は、いつでもバックアップブランチに保存した状態に戻ることができます。

$ git reset --hard my-backup-branch
于 2010-09-02T12:05:54.483 に答える