3

git ブランチを持っていて、それを共有する前の最終レビューで、スペルミスなどの小さなエラーを見つけたとします。私がやりたいのは、その 1 つのパッチを「修正」として適用することですが、実際には多くのコミットに影響を与えるので、最終的な履歴にエラーの兆候はありません。

つまり、あるコミットで行 A を変更し、別のコミットで行 B を変更してから、行 A と B の両方に影響するパッチがある場合、行 A を変更するコミットが修正されるリベースを実行したいと考えています。そのパッチの一部と行 B を変更するコミットは、それらがどのコミットであるかを手動で把握することなく、B 部分を取得します。これを行う簡単な方法はありますか?

擬似コード スクリプトは次のようになると思います。

collect all hunks from the fixup
for commit in the history we are rebasing:
    check out commit
    for hunk in fixups:
        try:
            apply hunk to the working tree
        except:
            continue
        remove hunk from fixups
    commit the working tree.
4

2 に答える 2

1

この機能のほとんどをgit rebase --autosquash提供しているようです: で始まるコミットがある場合、そのコミットの順序を変更し、fixup!それgit rebase --autosquashを修正してマージします。

さらに、これは私が求めていた残りの機能を提供しているようです!: https://github.com/torbiak/git-autofixup

を使用git autofixupすると、作業中の変更を取得し、その変更のどの部分が何と一致するかを検出し、場合によっては複数のfixup!コミットを自動的に作成します。そう...

  1. フィックスアップの変更を行います。
  2. 実行git autofixup masterすると、作業中の変更が適用され、1 つ以上のfixup!コミットが自動的に行われます。
  3. 最後に行うgit rebase --autosquash masterと、fixup!コミットは所定の位置に並べ替えられます。
于 2021-06-18T11:21:22.667 に答える
0

ここに部分的な答えがあります。醜いですが、単純なケースでは機能します。

ce580feいくつかの場所で何かの名前を変更するコミットがあります。元の名前がファイルに表示されないようにしたい。これは、少なくとも1つのケースで機能しています:

git rebase -i 0881a5a --exec "git diff ce580fe^ ce580fe | git apply --reject; git add -u; git commit --amend -C HEAD"
git diff ce580fe | git apply; git add -u git commit --amend -C HEAD # Apply any changes that got missed.

つまり、各リベース ステップで、diff を適用し、diff のce580fe一部を拒否できるようにします。すべての変更を既知のファイルに追加し、同じコミット メッセージでコミットを修正します。最後に、残っている と の差を適用ce580feして、ツリーが のように見えるようにしce580feます。

.rej生成されたファイルに対して何もしないのは厄介ですgit apply --reject。実際の名前変更についてgit rebase -i --execは、検索と置換の行で使用する方がおそらく良いでしょう。

于 2015-02-11T17:21:49.360 に答える