11

私は次の状況にあります:

  1. ローカルリポジトリにいくつかのコミットを行い、次に別のブランチ(〜150コミット)をマスターに大規模にマージしました。そこには多くの対立がありました。

  2. ここで、マージ前に行ったコミットを、プッシュ前のマージ後に移動したいと思います。

普段は使っrebase -iています。

残念ながら、デフォルトの動作は、マスターに150以上のコミットを実際に追加したone-merge-commitを個別のコミットに分割することです(最初にマージではなくリベースを使用した場合のようです)。これは悪い動作です。私にとってはいくつかの理由があります。

-pマージを保持するリベースのフラグを見つけてとてもうれしく思いました。残念ながら、これは実際に同じマージを再度適用し、競合解決における私のハードワークをすべて忘れてしまいました。繰り返しますが、悪い行動です!

私が欲しいものの解決策はありますか?rebase -iマージ後の操作を繰り返すことなく、特定のコミットを並べ替えたり編集したりするためにマージ後に使用しますか?

ありがとう!

4

3 に答える 3

18

コメントで述べたrerere-train.shスクリプトの機能は次のとおりです。基本的に、マージをやり直し、解決策を使用して、rerereに表示させます。必要に応じて、単一のコミットに対してこれを手動で行うことができます。

git checkout <parent of merge commit>
git merge <merged commit>         # if this goes cleanly, we're done
git rerere                        # done automatically if rerere.enabled is true
git checkout <merge commit> -- .  # check out the files from the result of the merge
git rerere                        # done automatically if rerere.enabled is true
git reset --hard                  # wipe away the merge

# and you'd want to follow with git checkout <branch> to return to where you were

ただしrerere.enabled、trueに設定して、への直接呼び出しを除いた手順を実行することもできgit rerereます。将来的には、競合を解決するたびにrerereが自動的に実行されるように設定されます。これが私がしていることです—それは素晴らしいです。

スクリプトを直接実行する場合は、のような引数を使用してスクリプトを実行することをお勧めしますrerere-train.sh ^<commit before the merge> <current branch>。(この^commit表記は「これを通り過ぎて履歴に入れない」ことを意味するため、リポジトリ内のすべてのマージコミットに対してこれを行う必要はありません。)

しかし、あなたはそのことをやり直すことになりますが、あなたは記録された望ましい解像度で終わるはずです。つまり、先に進んで実行することができrebase -i、競合が発生した場合、rerereはREcordedREsolutionを再利用します。ただの注意点:それでも、インデックスで競合としてマークされたファイルが残るので、それらを調べて、それが意味をなさないことを確認できます。完了したらgit add、競合を自分で解決したかのようにチェックインして、通常どおり続行します。

git-rerereマンページには、rerereの通常の使用法についての非常にわかりやすく長い説明が含まれています。これには、実際にrerereを呼び出す必要はなく、すべて自動的に行われます。また、強調されていないことに注意してください。すべて競合ハンクに基づいているため、競合が完全に別の場所で発生した場合でも、同じテキストの競合である限り、解決策を再利用できます。

于 2010-11-11T14:13:34.113 に答える
1

ここでこれを行うためのスクリプトを作成しました。既知の制限については、未解決の問題を参照してください。

rerere-train.sh最初にPATHにインストールする必要があります。Fedoraでは、これは次の方法で実行できます。

    install "$(rpm -ql git|grep '/rerere-train.sh$')" ~/bin
于 2013-04-15T06:24:01.800 に答える
1

rerere-train.shはユーザー@Jefromiの回答から使用しました。しかし、私はこのエラーがありました:

$ ../rerere-train.sh HEAD
C:\Program Files\Git\mingw64/libexec/git-core/git-sh-setup: line 6: .: git-sh-i18n: file not found

このhttp://kernel.opensuse.org/cgit/kernel-source/commit/?h=linux-next&id=d52b9f00588bb18d7f7a0e043eea15e6c27ec40cから私はこれを見ました:

ミハル・マレク

git-sh-setupヘルパーは、git以外のスクリプトで使用されることを意図したものではないようです。これはgit2.10で明らかになりました:

古いバージョン(2.3.4ポータブル)をダウンロードした後、私はなんとかrerere-train.sh仕事をすることができました。

于 2017-02-23T13:11:07.937 に答える