6

私は次のことをしました:

git fetch upstream
git cherry-pick xyz

選択されたコミットは、ファイルの1つで、前のコミットですでに行ったのとまったく同じ変更があったため、これらの変更が再適用されなかったことを除いて、きれいに適用されました。

コードに関してはすべて問題ありませんが、履歴にコミットハッシュを含めたいと思います。私の歴史では、それは新しい名前で表示されます。これも可能ですか?私がgitmergeの「私たちの」戦略を読んでいる限り、それは一般的に可能であるように思われますが、単一のコミットに対してそれを行う方法は?

私はこれが欲しいので、後でコミットが私が持っていないものを持っていることを簡単に識別upstreamできます。現時点では、githubnetworkビューで、厳選されたコミットは、私が持っていない別のものであると考えています。

追加情報:@CharlesBの言うことは私には理にかなっています。merge -s oursしかし、魔法はどのようになりますか?この場合、私にとって重要ではありませんでしたcherry-pick。私が取りたかった変更は1つだけであり、の先端にあるためupstream/masterです。だから私はそれを試してみるために:git merge -s ours upstream/master

今やっているgit log --graph --pretty=oneline --abbrev-commitと、次のようなものが表示されます。

*   9e8108b Merge remote-tracking branch 'mgencur/master' for better github netw
|\  
| * aa7117d Fix displaying watchers/watching for incorrect user // this commit magically appeared after merge -s ours
* | ff05f8c Fix displaying watchers/watching for incorrect user // this is commit from cherry-pick of aa7117d
* | b7ca8ec older commit in my fork
* | <more commits in my fork>
|/  
* 94d6870 Fix obtaining available users for testing purposes
* <older commits of upstream/master>

以前 の同じコマンドgit merge -s oursは次のようになりました。

* ff05f8c Fix displaying watchers/watching for incorrect user // this is commit from cherry-pick of aa7117d
* b7ca8ec older commit in my fork
* <more commits in my fork>
* 94d6870 Fix obtaining available users for testing purposes
* <older commits of upstream/master>

コミットaa7117dのチェリーピッキングの後でわかるように、aa7117dがすでに私のフォークリポジトリに適用されているという兆候はありませんでした。しかし、マージ後、ファイル内に何も変更されていなくても、そこにあることが示されます。

そのため、アップストリームに適用されたとおりに正確に適用されていなくても、ブランチに含まれるいくつかのコミットを宣言することは確かに可能であると思います。

update2:Gitで特定のコミットをマージする方法とそのベストアンサーの質問が表示されます。ですから、なぜそれが不可能なのか、あるいは実装されていないのかについての説明もいただければ幸いです。

4

2 に答える 2

4

コミット ハッシュは、定義上、各コミットに固有です。

チェリーピッキングの場合、同じ変更を適用しても、別の親コミットがあるため、新しいコミットを作成しています。

ただし、 ask git を追加して、cherry-picked コミット メッセージにメッセージを入れることができます。

コミットからチェリーピック<original-sha1>

ドキュメントから:

-バツ

コミットを記録するときは、元のコミット メッセージに "(cherry picked from commit ...)" という行を追加して、この変更がどのコミットからチェリー ピックされたかを示します。これは、競合のないチェリー ピックに対してのみ行われます。情報が受信者にとって役に立たないため、プライベートブランチからチェリーピッキングする場合は、このオプションを使用しないでください。一方、公開されている 2 つのブランチの間でチェリー ピッキングを行っている場合 (たとえば、開発ブランチから古いリリースのメンテナンス ブランチに修正をバックポートする場合)、この情報を追加すると便利です。

于 2013-03-05T09:54:21.233 に答える
3

Git ではそれができません。Git ハッシュは、コミットとそのすべての履歴を一意に識別します。つまり、コミットをチェリーピックすると、別の履歴にパッチが適用されるため、ハッシュが同じになる方法はありません (ハッシュが衝突する異常な場合を除く)。

マージを実行しても元のハッシュ番号が表示される理由は、ここでは状況がまったく異なるためです。マージは、単一の親コミットを持つ通常のコミットではありません。代わりに、2 つ (またはそれ以上) の親コミットがあり、別々の開発ストランドをまとめています。したがって、マージされたヘッドの元の履歴が保持されます。

于 2013-03-05T19:51:51.323 に答える