Я совсем не уверен, откуда возникла ваша путаница, тем более что и git cherry
делают очень разные вещи.
Возможно, это поможет (как это почти всегда верно в Git) нарисовать граф фиксации или, по крайней мере, соответствующую часть, например, запустить git log --graph --oneline --all --decorate
, или отрезать какое-либо изображение в окне с gitk
или (это только документация предложение снизу, модифицировано в соответствии с вашими именами ветвей, но это покажет только то, что нам нужно):
git log --oneline --graph --boundary branchA...branchB
(в некоторых случаях, выходя из --boundary
может сделать это значительно яснее, когда есть очень много фиксаций, которые лежат на граница симметричной разности, но для большинства простых случаев она просто добавляет фиксацию слияния и, таким образом, помогает в чтении результата.)
Теперь давайте также взглянем на the git cherry documentation, который имеет хороший пример того, как мы используем три-точка симметричная разность нотацию, чтобы понять вывод git cherry
:
В ситуации, когда [филиал ] topic
состоял из трех фиксаций и сопровождающий применяются два из них, ситуация может выглядеть следующим образом:
$ git log --graph --oneline --decorate --boundary origin/master...topic
* 7654321 (origin/master) upstream tip commit
[... snip some other commits ...]
* cccc111 cherry-pick of C
* aaaa111 cherry-pick of A
[... snip a lot more that has happened ...]
| * cccc000 (topic) commit C
| * bbbb000 commit B
| * aaaa000 commit A
|/
o 1234567 branch point
Здесь совершают 1234567
- тот, который включен --boundary
. Обычно три-точечная нотация бы выбрали только origin/master
(левая сторона) совершает как 7654321
, cccc1111
и aaaa111
для левой половины ...
, и master
(правая сторона) совершает как cccc000
, bbbb000
и aaaa000
фиксаций для правая половина. Добавление --boundary
добавляет общую фиксацию, которая, по сути, отделяет эти левую и правую половинки.
Посмотрите на то, что наш сопровождающий парень вверх сделал: он принял наш commit A
и наш commit C
, копируя их изменить в обмен на изменения в его master
, которые мы видим в нашем origin/master
. Он не согласился с нашим commit B
, или, по крайней мере, не изменил для изменения (мы не можем сказать из этого, ни с git cherry
, если он взял альтернативную версию нашего изменения).
Теперь посмотрим на примере вывода из работы git cherry
:
В таких случаях, ГИТ-вишневый показывает краткое изложение того, что до сих пор не применяется:
$ git cherry origin/master topic
- cccc000... commit C
+ bbbb000... commit B
- aaaa000... commit A
Этот показывает нам все три совершает с правой стороны (topic
), пока не показывает нам любое фиксируется на левой стороне (origin/master
), нашего log [flags] origin/master...topic
листинга.
Для фиксаций это делает шоу-те, исключительно на правом он отмечает каждый из них с -
(взятыми) или +
(не приняты).
У нас нет фрагмента графика, поэтому давайте работать с тем, что у нас есть на данный момент.
git cherry branchA branchB
[пусто, но]
git cherry branchB branchA
(включает в себя, по крайней мере)
+ c5f84105c242939a9d18fb9d6355534a80735277
+ 41acd0a40bfeaf3d68185a540c131838651cd889
+ 4859fd89c5dafeed6a68f0881ea6ad081a53fd68
+ 7226c9e5acf5a9d2d33b6aef3e5abf9b040f0b76
+ 4fc3206508d6ce7a19477e4c006608c78bb28801
+ 8816c66ed72da762b9b34858eec5b52a16d0ea99
+ 692d271ab07d4b92e54e72bcda09ee067654acee
Это означает, что нет нет фиксаций на branchB, которые не являются также на ветке А, в то время как есть много (по крайней мере, 7, перечисленных выше), совершается на br anchA, что не на ветке B. Фактически, все перечисленные 7 тоже не скопированы, - неудивительно, что ни одна из прав на branchA
коммитов не могла быть скопирована, если нет исключений из-за левой стороны (branchB
) совершает вообще.
Это означает, что мы можем сделать приближение графика мы получили бы, если бы мы попросили один (я, возможно, неправильно сокращенные хэшей здесь):
* 692d271 (branchB) commit 7
* ....... commit 6
* ....... commit 5
* ....... commit 4
* ....... commit 3
* ....... commit 2
* c5f8410 commit 1
* xxxxxxx (branchA) branch point
Это способ, вероятно, только способ получения вывода, который вы видели.
В то же время:
git diff branchA branchB
git diff branchB branchA
(оба не производят никакого вывода вообще.)
Это просто означает, что исходное дерево прилагается к branchA
соответствует дерево источник прикрепленный к branchB
(после, возможно, любой фильтрации, которую вы выбрали при выполнении diff). Есть множество способов для достижения этой цели, и трудно сказать, какой из них (ы) могут быть использованы, но вот пример того, что бы сделать это:
$ git branch remember-where-we-parked-kids
$ echo new file > new-file && git add new-file
$ echo add another line >> existing-file && git add existing-file
$ git commit -m 'commit a change'
[master 643b37e] commit a change
2 files changed, 2 insertions(+)
create mode 100644 new-file
$ git revert --no-edit HEAD
[master 0af7c6a] Revert "commit a change"
2 files changed, 2 deletions(-)
delete mode 100644 new-file
Первый фиксации содержит изменения, добавляет файл и изменяет файл. Второй (возврат) фиксации содержит изменение, которое удаляет добавленный файл new-file
и ставит старый файл existing-file
так, как это было всего лишь минуту назад, удаляя добавленную строку. Сравнивая текущую фиксацию с фиксацией, сделанную двумя шагами назад, не будет видно никаких различий, так как общая сумма этих двух коммитов должна была ничего не делать.
Использование git cherry
на ветви remember-where-we-parked-kids
, мы видим, что ни один из двух добавленных фиксаций (модификации и его Revert) находятся в «другой» ветви (который находится позади всего два коммита, где мы находимся сейчас):
$ git cherry remember-where-we-parked-kids master
+ 643b37ef242fdc35dfdd4551b42393af3eb91a85
+ 0af7c6a3cf5e49928de132c341c848be80ab84c7
(это наши два обязательства, возврат, 0af7c6a
и начальное изменение, 643b37e
). Реверсивный аргументы git-cherry
, мы не получим ничего, и, конечно, git diff
одинаково пусто:
$ git cherry master remember-where-we-parked-kids
$ git diff master remember-where-we-parked-kids
$
Это невозможно сказать, как вы получили, где вы сейчас без дополнительной информации, но это то, что выход вы видели средства.
Хорошо, что я получу. Я действительно хочу знать, каковы реальные причины, по которым в одной ветви больше коммитов, а не с другой. Я верю, что выбор вишни из одной ветки в другую сделает это, так как это создаст новую фиксацию. – BestPractices
'git cherry' не приносит никаких коммитов. В нем перечислены коммиты, которые можно было бы скопировать с помощью 'git cherry-pick'. Однако 'git cherry-pick' более полезен для отдельных конкретных коммитов. Чтобы выполнить кучу коммитов, просто используйте 'git rebase'. В вашей ситуации, поскольку одна из ветвей является просто быстрой перемоткой другой, 'git merge -ff-only' является самой простой, если вы не хотите слияния. –