0

はじめに、私は git を初めて使用しますが、ドキュメントや、 thisthisなどのトピックに関する同様の問題を食い尽くしています(この後者の質問については、記事の後半で参照します)。

概要:あるブランチから別のブランチへのコミットをチェリー ピッキングしていました。あるブランチでコミットを行った後、それらをマージしようとすると、競合が発生しました。何が起こっていると思うかについては、以下の私の回答を参照してください。

シナリオ: 2 つのファイルがあり、1 つは "master" ブランチにあり、もう 1 つは "secondary" ブランチにあります。"secondary" ブランチには、master に含めたくないファイルがいくつか含まれており、少数の人しか使用していませんが、"master" と "secondary" の両方にあるほとんどのファイルは一貫している必要があります (master のすべてはただし、セカンダリのすべてがマスターにあるわけではありません)。これを達成するために、「マスター」で行われた変更をコミットしgit checkout secondary、「セカンダリ」ブランチをチェックアウトしてから実行していgit merge masterます。残念なことに、私は一度対立を引き起こしました。そして今、私の脳は対立が何であるかを理解しようとして急いでいます.

試みられた解決策:最初は、私が持っていた「セカンダリ」と「マスター」の両方でファイルを変更したためだと思いました。これを解決するためgit cherry-pick [commit]に、セカンダリ ブランチで行った変更をマスター ブランチにプルしていました。ただし、マスター ブランチをセカンダリ ブランチにマージすることはできませんでした。Git は、git add/rm(おそらくgit addまたはgit rm、理解するのに少し時間がかかりました) を使用して、必要なものをマークすることを提案しました。そこで、 git rm コマンドを使用して、「セカンダリ」のインデックスと作業ツリーのバージョンを削除しました。この後、「マスター」ブランチに戻り、マージしたいファイルを「セカンダリ」に再コミットし、「セカンダリ」に戻ってから、git merge master再度実行しました。残念なことに、対立します。

質問:率直に言って、何が起こっているのかわかりません。git merge master(セカンダリ ブランチで実行すると) git master commit で行われたすべての変更が取得され、それらの変更がセカンダリ ブランチに配置されると思いました。それが起こっているのなら、私は問題を理解していません。セカンダリからファイルを削除し、変更をマスターにコミットしました。なぜマージできないのですか?先に言及した後者の質問に対する解決策は、共通の祖先に何か他のものが含まれているためである可能性があることを示唆していますが、私はそれをgit cherry-pick [commit]処理しただろうと思いました. 問題は、cherry-pickが新しいマージ ベースを作成しないため、問題のファイルが の後は同じであったとしても、マージ ベースとはcherry-pick異なる可能性があるということですか?

この質問の長さをお詫び申し上げます。理解しようと一生懸命努力しており、円を描いているように感じます。どんなアドバイスも素晴らしいでしょう。

編集:なぜgitがブランチを変更してこの問題を解決しようとしないのか理解できないので、私も混乱していると思います。今試しgit checkout secondaryてみると、おそらくcherry-pickコミットがセカンダリに変更され、error: you need to resolve your current index first. gitがこの動作を許可しない理由があるに違いないと思いますが、それが何であるかわかりません。

4

2 に答える 2

1

最初の最後のポイント - あなたのレポは辺鄙な状態にあります。競合を手動で編集してマージ コミットを完了するか、元に戻すことができます

マスター上の 1 つ以上のコミットには、マスター上にのみ存在するファイルが含まれていると思います。存在しないファイルの変更が含まれているため、Git はこれらのコミットをマージできません。

「git status」を試して、現在の場所を確認してください。「変更された両方」のファイルを探します。次に、「git rm」でファイルをマージから外すか、ファイル内の問題 (競合) を解決して「git add」でコミットに戻すことができます。次に「git commit」してマージを終了します。

于 2013-12-11T23:38:26.243 に答える
0

解決策を見つけました!何が起こっているかというと、は新しいマージ ベースを作成cherry-pickしないということです(そのため、両方とも共通の祖先を共有していますが、現在の両方の状態とは異なっていました)。したがって、 の後に master を変更するcherry-pickと、3 つのファイルすべてが異なっていました。視覚化するには:

共通祖先: File.txt: this is the common ancestor.

次に、セカンダリ ブランチに変更を加えてコミットします。

セカンダリ: File.txt: now I've modified this file to be this!

それから私git checkout mastergit cherry-pick [commit made on secondary]

主人: File.txt: now I've modified this file to be this!

ただし、共通の祖先はまだですFile.txt: this is the common ancestor.master にコミットして に変更すると、 !File.txt: now this is the new master!の 3 つの異なるバージョンが作成されます。File.txtしたがって、マージしようとすると、2 つの異なるファイルを結合する方法がわからないため、git は競合について不平を言いました。これを解決するには、master で whileのgit merge secondary 直後に実行するだけです! cherry-pickしたがって、このマージを今実行すると、次のようになります。

共通祖先: File.txt: now I've modified this file to be this!

マスターとセカンダリの間のマージは、この時点では同一であるため、実際にはファイルに何もしないため、直感的ではないようです。ただし、いずれかのブランチに変更を加える前に、このマージを実行して共通の祖先を作成する必要があります。これが誰かを助けることを願っています!

于 2013-12-13T17:42:06.423 に答える