だから、ブランチ内の他のコミットがマージする準備ができていないため、branchAからの特定のコミットだけが必要な状況があります。だから、もし私がbranchAからmasterにcommitXを選んだら、後でbranchAをmasterにマージすると(その間にいくつかのコミットがあります)、gitの履歴に関するcommitXはどうなりますか?すでにマスターに存在するので無視されるのですか、何らかの重複が発生しますか?私はブランチからコミットを選んだ後、ブランチ全体をマージしてからgitの履歴に何が起こるのですか?
答えて
git merge
操作は、「マージパス」に沿って個々のコミットを見ていません。代わりに、開始スナップショットと終了スナップショットだけが表示されます。 端のスナップショット(一のスタート)があること、しかし、注意:ここ
...--o--B--o--...--o--L
\
o--...--o--R
、B
マージベースがコミットされ、L
とR
が残っている(または、ローカルまたは--ours
)と右(またはリモート、または--theirs
)がそれぞれコミットします。一方、各ラウンドo
は、Gitが見ていないコミットを表しています。 Gitは単に効果で、行います。これはあなたのgit cherry-pick
するための手段は何
git diff --find-renames B L # figure out what we did
git diff --find-renames B R # figure out what they did
は、「彼らが何をしたか」に同じ変更の一部が含まれる可能性がある「私たちがやった」ということで、同じファイルですが、これらの2つのファイルを取得した後にが実行するステップはになります。の変更をマージの左右の両方のサイドに表示される変更。
あなたはチェリー選ぶ例えば、コミットして、一つの経路に沿って、再びそれを元に戻すことは、しかし、と仮定します。
...--o--B--X'--!X'--L
\
X--o--R
(X'
は目盛りを持っている理由は、それがコミットのコピーだということですX
:コミットをチェリーすると、新しいコピーは別のハッシュIDを取得します。
ここでは、ブランチ(グラフの下の行)にコミットを書き、メインにチェリーピックしましたライン(上のライン)は、準備ができていなかったか、 をに戻し(!X'
を追加)、メインラインに最終コミットL
を作成しました。今すぐマージすると、X
のコピーが入ってからもう一度出てしまったという事実は見えません。ギフトはB
とL
を比較し、X'--!X'
シークエンスには何も表示されません。したがって、依然としてコミットX
によって導入された変更のコピーが1つ必要です。
R
で終わるブランチでコミットX
が準備完了になった場合、これが正しい動作です。
コミットX
が依然として壊れている場合、これは間違った処置ですが、合併する前にブランチのX
を元に戻すことをお勧めします。B
を見つけるため除き
、それは次のようになります。GitはL
とR
の両方で開始し、マージベースを検索し、グラフを逆方向に働かなければなりません。これは、Gitが他の面白いコミットノードのいくつかを横断しなければならないことを意味します。特に
何も起こりませんが、のは、それを打破しましょう。
M
-o---o---o master
\
\----o--o--o branchA
X
あなたはあなたのチェリーピックをします。次に、状況は次のとおりです。
M MX
-o---o---o--o master
\
\----o--o--o branchA
X
これまでのところとても良いです。そして、あなたはいくつかのより多くのコミット...今
M MX
-o---o---o---o---o---o---o master
\
\----o---o---o---o---o---o branchA
X
マージ...
M MX
-o---o---o---o---o---o---o-----o master
\ /
\----o---o---o---o---o---o branchA
X
を行い、このすべてがいつものようにちょうどビジネスです。 Gitはコミットがチェリーピックの結果であるという事実を保存しておらず、必要もありません。チェリーピック操作が選んだのX
と新しいコミットMX
をコミットすることで、マージとは異なり全く、互いに無関係にあります。 (マージして)、「親子」の関係は終わりにmaster
ががbranchA
のすべて歴史は、ない唯一の変更は、単一のコミット導入含まれていることを意味上の持っているので、彼らは、いずれか、することはできません。あなたがそれらを手動で編集されたかのよう
実際の変更は、ファイルレベルで、ちょうど仕事します。つまり、チェリーピックによって導入された変更がmaster
にある場合、gitは気付くでしょう(簡単な例では、関連する行のマージ中に違いを気付かずに)、物事がマージされます。
編集:コメント欄でご質問については...
は私commitXがメッセージ "Foobarbaz" を持っていたと言うことができます。シナリオを考えると、私はコミットメッセージ「Foorbarbaz」または単に1
各コミットと私のマスターブランチに今2つのコミットをしていますコミットレベルでメッセージおよびファイルレベルでいくつかコンテンツを持っています。チェリーピックはのみコンテンツレベルで動作します。つまり、あるコミットからファイルの変更を受け取り、現在の作業ディレクトリにあるものに適用します。紛らわしいのは、実際にはコマンドgit cherry-pick
がその変更を適用した後に新しいコミットを作成するということです(この例ではMX
)。これは、新しいコミット単なる古いとはいえ、コミットされて - それは決して元に関連している利便性などgit cherry-pick
コピー(編集可能)古いコミットメッセージを除いて、X
をコミットします。
git cherry-pick -n
を実行してgit
をコミットすることを避けることができます。これにより、チェリーピックが行ったことを自分でコミットする前に編集することができます。
したがって、チェリーピックは文字通り、あなた自身の変更を編集して自分でコミットした場合のように機能する便利なメソッドです。新しいコミットメッセージが古いものと似ているかもしれないという事実は、後でマージする際にgitには関係ありません。
は、ファイルレベルの変更に同意した、それは多くの意味があります。しかし、私のコミットXには "Foobarbaz"というメッセージがありました。このシナリオを考えると、マスターブランチにコミットメッセージ "Foorbarbaz"またはちょうど1つのコミットが2つありますか?私は少なくとも機能的には、私が提案していることは何の害も生じませんが、私はまだ興味があることを認識しています歴史はどのように見えますか。あなたのダイアグラムからは、マスターには1つのコミットしか存在しないようです。 – sreya
@sreya:ブランチの "in"コミットはブランチ名から到達可能なものです。コミットに達することができるかどうかを確認するには、各マージコミットのすべての親を追跡する必要があります。したがって、 'master'からは、(その方向でのマージからの接続のために)トップラインのコミットと(そこの2番目のコネクションのため)ボトムラインを見直します。したがって、MXとXの両方が 'master'に含まれていることがわかります。これにより、Gitは他の多くのVCSとは根本的に異なります。ここでは、コミットは元々Gitで行ったブランチ上だけであり、コミットを含むブランチのセットは変更されます* – torek
- 1. マージ後のGitブランチとコミット履歴
- 2. 私のブランチからスパンしたgitブランチをマージするには?
- 3. コミットされた履歴のない別のブランチからブランチを作成する
- 4. 履歴なしのgitブランチ
- 5. Squash GITでのマージ後のブランチのコミット
- 6. GITリポジトリ間のブランチ上のコミットの履歴を見つける
- 7. 履歴をマージしてブランチを削除しますか?
- 8. スカッシュgitは、マスターの履歴を維持しながらブランチでコミットしますか?
- 9. git履歴をブランチに分割する
- 10. gitブランチがさらにコミット/マージするのを防ぐ方法
- 11. git pushクロスブランチ、あるブランチから別のブランチへコミットをフェッチ
- 12. gitでコミットの履歴からコミットする方法は?
- 13. gitリポジトリからブランチ全体を削除できますか?
- 14. 私がコミットしているgitブランチからファイルリストを取得するには
- 15. gitを使ってブランチをクリア履歴と順番にマージするには?
- 16. マージの前にコミットからブランチを作成するには?
- 17. 全体gitの履歴は
- 18. 完全な履歴を持つサブバージョンから水銀へのブランチをクローン化する(ブランチを越えても)
- 19. マージ後のGit push(force)は別のブランチにコミットします
- 20. ブランチから別のブランチに1つのコミットをマージする方法
- 21. リモートのすべてのブランチにコミットの履歴を表示できますか?
- 22. CVSリポジトリ全体を検索するには(すべてのブランチ/履歴/コメント)?
- 23. ブランチ全体のブランチを作成してからの差分を表示する
- 24. あるブランチから別のブランチへのコミットを含まずにGitをマージする
- 25. TFS(2015)から履歴とブランチを使用したGITへの移行
- 26. ブランチを削除した後、svnブランチの履歴を見ることはできますか?
- 27. 他のブランチからのコミットをスカッシュすることは安全ですか
- 28. 特定の順序でブランチからコミットをマージする方法
- 29. 特定のコミットからブランチを強制的にマージする
- 30. Git - マージされたブランチで新しいコミット - これらの新しいコミットをマージする方法?
元のコミットはチェリーピックドのものと全く異なるコミットです。 –
@ChrisRasysこれは私が疑問に思っていたものです。コミットIDが異なる場合、gitの履歴は実際には同じ変更である2つのコミットで構成されます。 1つはチェリーピックされたコミット、その後は後でマージされるオリジナルのコミットです。 – sreya
@ChrisRasys:done。 @sreya:はい。これは、同じ変更を再度行うなど、他の手段でコミットをコピーした場合にも発生します。コミットをグラフの行に沿って表示するビューア( 'gitk'のように、ほとんどのGUIはそうですが、私が上で行ったことです)は、2つのコミットが後でマージされる異なる開発行にあったことを示します。 – torek