2017-05-13 14 views
0

私は2つのブランチを持っています。コミットは1つのブランチからもう1つのブランチにチェリーピックされています。この段階でgit cherry/git log - マージによって混乱している修理

> git init 
Initialized empty Git repository in foo/.git/ 
> touch foobar; git add foobar; git commit -m "initial commit" 
[master (root-commit) d109ffc] initial commit 
1 file changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 foobar 
> git branch somebranch 
> echo a >> foobar; git add foobar; git commit -m "add a" 
[master 1527212] add a 
1 file changed, 1 insertion(+) 
> touch anotherfile; git add anotherfile; git commit -m "add blank anotherfile" 
[master 84821fc] add blank anotherfile 
1 file changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 anotherfile 
> git checkout somebranch; git cherry-pick -x 1527212 
Switched to branch 'somebranch' 
[somebranch b59ad0a] add a 
Date: Sat May 13 15:41:16 2017 +0800 
1 file changed, 1 insertion(+) 
> git tree somebranch master 
* b59ad0a (somebranch) add a 
| * 84821fc (HEAD -> master) add blank anotherfile 
| * 1527212 add a 
|/ 
* d109ffc initial commit 

、私が期待するものgit cherrygit log --cherry --oneline表示::そうのように、私は戻って一緒に二つのブランチをマージする場合

> git cherry somebranch master 
- 1527212b9047f882c7438d083505941c47ea9a5b 
+ 84821fcb3d33d41b64dddcc56728dd3e22466e4a 
> git log --cherry --oneline somebranch...master 
+ 84821fc (HEAD -> master) add blank anotherfile 
= 1527212 add a 

は、しかし、私はこの出力を失う - の両方git cherrygit log --cherryは桜厳選されたが、同じようにコミット認識に失敗:

> git checkout master 
Already on 'master' 
> git merge somebranch 
Merge made by the 'recursive' strategy. 
> git tree 
* 90810f6 (HEAD -> master) Merge branch 'somebranch' 
|\ 
| * b59ad0a (somebranch) add a 
* | 84821fc add blank anotherfile 
* | 1527212 add a 
|/ 
* d109ffc initial commit 
> git cherry somebranch master 
+ 1527212b9047f882c7438d083505941c47ea9a5b 
+ 84821fcb3d33d41b64dddcc56728dd3e22466e4a 
> git log --cherry --oneline somebranch...master 
+ 84821fc add blank anotherfile 
+ 1527212 add a 

は、私はgitのがSHOするために得ることができる方法はありますこれらのコミットは同じになっていますが、一緒に結合されても同じですか?

答えて

1

問題はGitがもうコミットの1つを見ていないために起こります。

git log --cherry A...Bの場合は、明示的なgit cherry A Bの場合には、暗黙の)3ドット構文は対称差を取ることを意味していることを忘れないでください:いずれかAまたはBから到達可能なコミット両方からではありません。

(私はここでgit treegit log --all --decorate --oneline --graphの別名です:)

> git tree 
* 90810f6 (HEAD -> master) Merge branch 'somebranch' 
|\ 
| * b59ad0a (somebranch) add a 
* | 84821fc add blank anotherfile 
* | 1527212 add a 
|/ 
* d109ffc initial commit 

master90810f6を意味し、名前somebranchb59ad0aを意味想定しています。

  • 90810f6::私たちがしなければならない最初の事は、我々はそれらに達し、どれだけを念頭に置いて、これらの二つのコミットから到達可能なコミットを見つけることです90810f6
  • b59ad0aから到達:両方b59ad0aから到達90810f6
  • 84821fcを捨てる:90810f6
  • 1527212から到達:到達84821fc
  • d109ffcから:また、両側から到達:私たちは、興味深いものを投げてきた

を破棄(桜相当)b59ad0aはすでにコミットので、我々はそれを見ることはありません。

the documentationを教えてくれると、--cherryは次のとおりです。

--right-only --cherry-mark --no-mergesの同義語...

このように3つの未処分のコミットの一覧から、90810f6も併せて投げます。 2つのコミットを残すと、と表示されます。

これらのコミットが同じであることを示すためにgitを入手する方法はありますか?

マージのすぐ下から検査を開始する必要があります。マージの最初の親からリストを開始する(これを綴るために多くの方法についてthe gitrevisions documentationを参照)のいずれかの方法を使用してコミットすることmaster識別し、例えば:

我々はグラフを見ているので、我々は唯一知っている
git log --cherry --oneline somebranch...master~1 

masterがマージされたことがわかりました)。それぞれが戻って一歩を移動すると言うことから、

git log --cherry --oneline master^2...master^1 

master^1master~1が正確に同じことを意味表記:我々は^1^2接尾辞を使用してマージを与え2つのコミットの両方を指定することができることに注意してください最初の親にmaster^2master~2の場合はありません。前者は「第2の親」を意味し、後者は「第1の親の最初の親」を意味します。


Aは常にそれが漠然と暗示に聞こえる場合でも、自分自身に達するコミット。 :-)

+0

私はちょうど3ドットシンタックスについて学んだだけで、もっと知りました。下から検査を開始することは、マージです! – Zanchey

関連する問題