web-dev-qa-db-ja.com

git mergeそうでないときは、すでに最新です

Gitとbitbucket.comを使用してプロジェクトに取り組んでいる間、次のブランチがあります。

master
development
uat
production

プロジェクトの作業を開始したとき、開発のgitクローンを作成しました(当然、最先端のコードが含まれていると思いました)。数か月後の作業で、本番ブランチ(現在本番ブランチで実行されている)のコードのバージョンが、開発ブランチで開始したコードよりも新しいことが判明しました。

私がしようとすると:

git checkout development
git merge production

「すでに最新です」と表示されます。私が行くとき:

git diff production..development

それは、本番ブランチに開発ブランチにないコードがあるという多くの変更を吐き出します。何ヶ月もの作業を消去せずに、本番コードを開発コードとマージするにはどうすればよいですか?

11
Warwick Hall

mergeではなく、rebaseにしたい場合があります。つまり、行ったコミット、ブランチdevelopmentに追加されたコミットyou、つまり、あなたが行ったときに存在しなかったコミットを取得します。最初にcloneを実行しましたが、現在は存在し、それぞれが順番にどのような変更を加えたかを確認します。そして、これらの変更をブランチproductionの上に順番に適用します。

(それらのいくつかはおそらくうまくいきません:productionに存在しないdevelopmentへの変更は、あなたが行った変更のいくつか、おそらく多くは、適合するように変更する必要があることを意味します。さらに悪いことに、変更の1つを変更すると、ほぼ確実に多くの変更に影響するため、このリベースは困難になる可能性があります。)

とはいえ...「最新」とは、コードが同じであることを意味するものではありません。これは、コミットグラフが、新しいものが何もないことを示していることを意味します。つまり、あなた(または他の誰か)がすでにマージ。最終的なマージ(マージの結果)に添付されたtreeはあなたが望むものではありませんが、gitが見ることができるのはマージが完了しました。たとえば、git revertを含む例については、 マージ後、GITが「すでに最新」と表示するのにブランチ間の違いがまだ存在するのはなぜですか? を参照してください。

11
torek