1

次の git 履歴を検討してください。

* 21f05f9 - Fifth commit
* 0534049 - Fourth commit
* 738ae0a - Third commit
* 288ffd2 - Second commit
* 2535dca - First commit

21f05f9 738ae0a2535dcaを 1 つのコミットに結合するにはどうすればよいですか?

git rebase -i 2535dcapicking 2535dcasquashing 21f05f9、を試し738ae0aましたが、次のエラーが表示されました。

error: could not apply 21f05f9 ... Fifth commit

0534049コミットをスキップする方法があり288ffd2、リベースのインタラクティブ モード内にあるかどうかはわかりません。

私がしていることを行うためのより良い方法はありますか? 落とし穴はありますか?

編集:

私が理解し始めているのは、特にそれらのコミットがすべて1つのファイルに関連している場合、非線形コミットが必要な場所に自分自身を置くべきではないということです。コミットによってコードが壊れたり、競合が発生したりする例が見られました。

4

3 に答える 3

2

コミットが同じファイルに影響を与える場合、これはそれほど単純ではないかもしれません。あなたが試すことができます:

言及された最初のコミット ID から新しいブランチをチェックアウトします。

git checkout -b new_branch 2535dca

次に、追加するコミットをチェリーピックします。

git cherry-pick 738ae0a

git cherry-pick 21f05f9
于 2014-03-06T02:22:15.647 に答える
1

あなたは雇用の物語で正しいですgit rebase -i。(また、 run を実行した可能性が高いですgit rebase -i 2535dca^。そうしないと、そのコミットはリベース リストに含まれていませんでした。)

できることの 1 つは、フローを単純化するために並べ替えとスカッシュを別々に実行することです。2 つのリベースを実行しますが、基本的には、指示に従ってリベースが失敗するたびにすべてのマージの失敗を解決する以外にできることはあまりありません。 2 つのリベース。

すべてをリベースすることとは別に、次のフローが少し明確になり、特定のケースでより直感的になることがあります。(これは、rebase が舞台裏で行っていることとほとんど同じです。) 必要に応じて、希望する順序で変更を明示的にチェリー ピックし、スカッシュする一時的なブランチで作業できます。

$ git checkout -b tmp-topic 2535dca
$ git cherry-pick 738ae0a 21f05f9 
    ... will most likely have to resolve conflicts for each cherry-picked change
$ git rebase -i 2535dca
     … squash the two commits you just cherry-picked
$ git cherry-pick 288ffd2 0534049
    ... will most likely have to resolve conflicts for each cherry-picked change

これで、元のブランチトピックと新しいtmp-topicブランチができました。順序は適切ですが、トピックは作業を終えたばかりのコミットの新しいグラフを指す必要があります。

$ git update-ref refs/heads/topic tmp-topic
于 2014-03-06T08:57:39.537 に答える
1

コミットを任意に並べ替えることができるという保証はありません。を適用できないため21f05f9、以前のコミットで導入されたコードが、おそらく2535dca. この場合、競合として扱い、一致するようにファイルを手動で編集するだけです。

ゆっくり始めます。まず、4 番目と 5 番目のコミットを交換するのと同じくらい遅いものでも、単純にコミットの順序を変更してみてください。これにより、各ステップで可能な限り少ない変更を加えながら、履歴を変更できます。5 つのコミットが適切な順序になったら、新しい履歴で連続する 3 つのコミットを 1 つにマージするのは簡単なことです。

于 2014-03-06T02:20:53.593 に答える