そのため、branchAからの特定のコミットのみが必要な状況が発生しました。これは、そのブランチ内の他のコミットをマージする準備ができていないためです。したがって、commitXをbranchAからmasterにチェリーピックし、後でbranchAをmasterにマージすると(たとえば、間にいくつかのコミットがあります)、gitの履歴に関する限りcommitXはどうなりますか?マスターにすでに存在しているため無視されますか、それとも何らかの重複が発生しますか?
このgit merge
操作では、「マージパス」に沿った個々のコミットは、いわば見られません。代わりに、開始スナップショットと終了スナップショットのみを確認します。ただし、2つの終了スナップショット(および1つの開始)があることに注意してください。
...--o--B--o--...--o--L
\
o--...--o--R
ここで、B
はマージベースコミットでありL
、R
はそれぞれ左(またはローカルまたは--ours
)および右(または他の、リモート、または--theirs
)コミットです。一方、各ラウンドo
は、Gitが見さえしないコミットを表しています。1 Gitは、事実上、単純に次のことを行います。
git diff --find-renames B L # figure out what we did
git diff --find-renames B R # figure out what they did
どのようなあなたのためにこれが意味git cherry-pick
する「私たちがやった」と「彼らがなかった」の一部含まれる可能性のあるISと同じに変更同じファイルを、それは問題ありません、ステップなぜならgit merge
これら二つ取得した後に行いエン一斉差分を変更を結合し、マージの左側と右側の両方に表示される変更のコピーを1つだけ取得します。
ただし、コミットをチェリーピックしてから、1つのパスに沿って再び元に戻すとします。例:
...--o--B--X'--!X'--L
\
X--o--R
(X'
チェックマークが付いている理由は、それがコミットのコピーであるためX
です。コミットをチェリーピックすると、新しいコピーは異なるハッシュIDを取得します。)
ここX
では、ブランチ(グラフの下の行)にcommit inを書き込み、それをメイン行(上の行)にチェリーピックし、準備ができていないか壊れていることに気づき、元に戻し(追加!X'
)、作成しました。L
メインラインの最後のコミット。マージすると、コピーがX
入ってから再び出たという事実は見えません。GitはB
vsL
を比較し、X'--!X'
シーケンスのすべてに兆候が見られません。したがって、commitによって導入された変更のコピーを1つ取得しX
ます。
でX
終わるブランチでコミットの準備ができている場合R
、これは正しいアクションです。
X
それでもコミットが壊れている場合、これは間違ったアクションですが、適切な解決策はX
、マージする前にブランチを元に戻すことです。
1を見つけることを除いてB
、つまり、Gitは両方L
から開始しR
、グラフを逆方向に処理してマージベースを見つける必要があります。これは、Gitが他の点では興味のないコミットノードのいくつかをトラバースする必要があることを意味します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加