2013-03-05 6 views
3

я сделал следующее:как мерзавец вишневого выбор совершить декларирование наша история содержит его

git fetch upstream 
git cherry-pick xyz 

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

Все с точки зрения кода в порядке, но я хотел бы иметь хеш фиксации в своей истории. В моей истории появляется новое имя. Возможно ли это? Насколько я читаю стратегию git merge «ours», кажется, что это вообще возможно, но как это сделать для одной фиксации?

Я хочу, чтобы это стало легче идентифицировать позже, что совершает upstream, что у меня нет. На данный момент в github network вид Я вижу, что выбранная вишня фиксация является чем-то отдельным, что у меня нет.

Дополнительная информация: Что говорит @CharlesB, имеет смысл для меня. Но как же делает merge -s ours волшебство? В этом случае для меня не было cherry-pick. Потому что изменение, которое я хотел принять, это только один и на конце 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 уже применяется к моему реплику fork. Но после слияния указано, что он там, хотя ничего в моих файлах не изменилось.

Это заставляет меня думать, что действительно возможно объявить ряд коммитов, включенных в ветку, хотя они не применяются точно, поскольку они были применены вверх по течению.

update2: Я вижу вопрос How to merge a specific commit in Git и его лучший ответ. Таким образом, объяснение, почему это невозможно или оно не реализовано, также было бы оценено.

+0

Вы, кажется, смущены тем, что такое вишня и слияние. Первый применяет указанный фиксат к вашей текущей ветке. Это как сокращение для экспорта патча-файла, а затем его применения. Больше ничего. Последний также создает новую фиксацию, но у нее есть ** две родительские коммиты **. Таким образом, никакая фиксация не будет * исправлена ​​* поверх другой ветки, это больше похоже на привлечение к разработке нитей вместе в один. Вот почему вы видите исходные хеш-строки в истории, но это только потому, что они на самом деле все еще существуют, неизмененные из их исходного состояния. –

+0

@ Michael-Wild, да, я бы хотел какую-то комбинацию слияния/вишни. – akostadinov

+1

, который никогда не будет работать. Это просто не то, как работает Гит. Хэши однозначно идентифицируют фиксацию, и если вы измените ее фиксацию родителя, хэш должен измениться. Вот почему хеши фиксации считаются * криптографически безопасными * в Git. Если вы можете проверить хэш ветви ветви, вы эффективно проверили всю ее историю. Любая операция, которая изменяет эту историю, изменит хеши. Период. –

ответ

2

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

Причина, по которой вы все еще видите исходные хеш-номера при выполнении слияния, заключается в том, что здесь ситуация совсем иная. Слияние не является нормальным фиксацией с одним родительским фиксатором. Вместо этого он имеет двух (или даже более) родительских коммитов, объединяющих отдельные ветви разработки. Таким образом, сохранилась первоначальная история объединенных голов.

3

Commit хэши уникальны для каждого фиксации по определению.

При наборе вишни вы создаете новую фиксацию, даже если вы применяете те же самые модификации, потому что она имеет другое родительское commit.

Однако вы можете добавить спросить мерзавец, чтобы поместить сообщение в вишневом подобранном фиксации сообщения:

вишни от совершения <original-sha1>

От documentation:

-x

При записи фиксации ppend строка, которая гласит: «(вишня выбрала из фиксации ...) "в исходное сообщение фиксации, чтобы указать , которые фиксируют это изменение, выбрано из вишни. Это делается только для вишневых кирков без конфликтов. Не используйте эту опцию, если вы используете вишневый сбор из вашей частной ветви, потому что информация бесполезна для получателя. Если, с другой стороны, вы выбрали вишню между двумя видимыми видимыми ветвями (например, обратная привязка к отделению обслуживания для более старой версии из ветки развития), при добавлении этой информации

+0

См. «Дополнительная информация» в моем вопросе. Мне представляется возможным объявить определенные коммиты применительно к текущей ветке, хотя они не совсем то же самое. Возможно, не команда вишневого выбора? – akostadinov

+0

Я не могу понять, что вы подразумеваете под «объявлять коммиты для применения к текущей ветке». Вы хотите сказать, что вы хотите выбрать коммиты, которые хотите включить/исключить при операции слияния? – CharlesB

+0

См. Объяснение стратегии слияния 'ours'. Я хочу, чтобы они отображались как применяемые, как операция слияния. Я предполагаю, что это может быть достигнуто с помощью некоторой операции ветвления и слияния. Но было бы здорово, если бы команда «cherry-pick» сделала это автоматически. – akostadinov