0

新しいコミットを からmasterに取り込みたいのですが、変更が の上に再生されるtopicような方法ではなく、その逆です。からの新しい変更をの上で再生し、その結果を新しいヘッドとしてインストールします。topicmastermastertopictopic

masterにリベースすると、正確に正しいオブジェクトを取得できます。唯一の問題は、オブジェクトがではなくtopicの新しいヘッドとしてインストールされることです。mastertopic

一時的なヘッドポインタを手動でシャッフルせずにこれを行う良い方法はありますか?

編集:

一時的なブランチ ヘッドを使用して実現する方法を次に示しますが、扱いにくいです。

git checkout master
git checkout -b temp   # temp points to master
git rebase topic       # topic is brought into temp, temp changes played on top

これで目的のオブジェクトが得られ、 によってポイントされtempます。

git checkout topic
git reset --hard temp

topicそれを持っています。あとは、temp を削除して整理するだけです。

git branch -d temp

もう 1 つの方法は、を廃止しtempて単にリベースmasterし、次に にリセットtopicすることmasterです。最後にmaster、reflog またはカット アンド ペースト バッファから古いヘッドを引っ張って元の状態に戻します。これにより、6 つのステップに削減されますが、それでも厄介です。

git checkout master
git rebase topic  # solve conflicts, git rebase --continue, if necessary
git checkout topic
git reset --hard master  # topic and master same now
git checkout master
git reset --hard HEAD@{13}

reflog を探し回るよりも、最後のステップで保存されたコミット ハッシュに依存する方が適切です。

これが役立つ理由

ブランチに取り組んでいる何人かの人々が、 から分離されmasterているが定期的に統合されている開発に協力しているとします。このようにリベースを行うことで、ブランチでの早送り以外の変更 (ブランチ履歴の書き換え) を回避できます。masterブランチを統合するときにどのように扱われるかは別の話です。ただし、の非早送り操作を回避するシナリオなど、オプションがありますmaster

4

2 に答える 2

1

たとえば、次のようになります。

A - B - C - D - E    <-- master
          \
            F - G    <-- topic

そしてあなたが望む:

A - B - C - D - E             <-- master
          \
            F - G - D' - E'   <-- topic

D'とはとE'のコピーですか? (これがあなたの望むものかどうかはまったくわかりません。あなたが持っているものと欲しいものとのグラフを描くと、大いに役立つでしょう。)DE

これを行う簡単な方法は、 を使用することですgit cherry-pick。がオンtopicになっている間、master の新しいすべてをチェリーピックします—コミット以上ですがDEプログラムで簡単に取得できます。

git cherry-pick topic..master
于 2013-10-24T03:17:48.857 に答える
0

あなたが求めていることを誤解しているかもしれませんが、試してみgit merge master --squashましたgit commitか?masterこれにより、追加の squash コミットを使用して の最新の状態が移動し、topic探している状態にするためにマージが行われたことが指定されます。

ただし、これはコミット グラフを変更する方法とは異なる場合があります。

于 2013-10-24T03:16:46.083 に答える