2016-05-04 3 views
2

У меня есть две ветви: branchA, branchBРазница между мерзавца дифференциала и мерзавца вишни

Следующие возвращает нет вывода (не включая никаких различий, по крайней мере, для команды git diff):

git cherry branchA branchB 
git diff branchA branchB 
git diff branchB branchA 

Когда я бегу это, однако:

git cherry branchB branchA 

Я получаю список всех совершить IDS со знаком плюс перед ними:

например.

+ c5f84105c242939a9d18fb9d6355534a80735277 
+ 41acd0a40bfeaf3d68185a540c131838651cd889 
+ 4859fd89c5dafeed6a68f0881ea6ad081a53fd68 
+ 7226c9e5acf5a9d2d33b6aef3e5abf9b040f0b76 
+ 4fc3206508d6ce7a19477e4c006608c78bb28801 
+ 8816c66ed72da762b9b34858eec5b52a16d0ea99 
+ 692d271ab07d4b92e54e72bcda09ee067654acee 

Может кто-нибудь объяснить, что это значит? Глядя, чтобы понять, почему git diff не показывает различий, но git cherry показывает различия.

ответ

1

Это означает, что содержание branchA и branchB одинаково, но по какой-либо причине на ветке B есть фиксации, которые не находятся на ветке A.

Эти коммиты отображаются. Однако общая сумма этих коммитов приводит к одному и тому же контенту, поэтому вы не увидите никакой разницы. Вы ничего не увидите с git cherry branchA branchB, потому что на branchB нет коммитов, которых нет на branchA.

+0

Хорошо, что я получу. Я действительно хочу знать, каковы реальные причины, по которым в одной ветви больше коммитов, а не с другой. Я верю, что выбор вишни из одной ветки в другую сделает это, так как это создаст новую фиксацию. – BestPractices

+0

'git cherry' не приносит никаких коммитов. В нем перечислены коммиты, которые можно было бы скопировать с помощью 'git cherry-pick'. Однако 'git cherry-pick' более полезен для отдельных конкретных коммитов. Чтобы выполнить кучу коммитов, просто используйте 'git rebase'. В вашей ситуации, поскольку одна из ветвей является просто быстрой перемоткой другой, 'git merge -ff-only' является самой простой, если вы не хотите слияния. –

1

Git diff не показывает вывод, так как файлы в обеих ветках идентичны по содержанию. Однако идентификатор фиксации (строка SHA) может отличаться.

git cherry branchA branxhB не дает выходных данных, поскольку все цепочки (SHA, а не содержимое файла) в ветви B присутствует в ветви A. Однако наоборот. В ветви А есть некоторые коммиты, которые не находятся в ветви В и, следовательно, вывод ветви ветви гитарной ветви. Это очень хорошо объясняется здесь. http://jafrog.com/2012/03/22/git-cherry.html

+0

Vishal, предложите вам извлечь детали этой статьи в свой ответ. Сделает ответ более удобным для использования всеми (если вы не возражаете) – BestPractices

0

Я совсем не уверен, откуда возникла ваша путаница, тем более что и 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 
$ 

Это невозможно сказать, как вы получили, где вы сейчас без дополнительной информации, но это то, что выход вы видели средства.