Объедините некоторые файлы сейчас, а некоторые позже

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

Все предлагаемые решения для этого теряют историю этих изменений и вызывают большую проблему, когда я позже хочу объединить B с A, но некоторые изменения B уже там. Я хочу решение, позволяющее избежать этого.

В черепахе я могу просмотреть журнал для одного файла и выбрать старую версию, к которой нужно вернуться. Итак, в принципе, я мог бы создать новую ветку C из B и вернуть все файлы, которые я не хочу объединять, обратно в точку, когда B разветвлялся от A. Тогда я мог бы объединить C на A. Это, кажется, правильно отслеживает историю git и позволяет мне объединить B в A, не удивляясь, что некоторые B изменения уже есть.

Но сложно вручную идентифицировать и восстанавливать 20 файлов, когда я просто хочу объединить 2. Почему это не обычная одноэтапная операция? Как работает откат черепахи - поскольку он может работать с одним файлом, он должен быть суб-фиксацией, что является важной функцией, которую я ищу. Отбрасывает ли это тот факт, что я перехожу от новой ревизии к более старой, и заставляет это выглядеть так, будто я только что внес некоторые ручные изменения, которые затем будут конфликтовать с возможным слиянием B с A?


person user1441998    schedule 07.06.2012    source источник


Ответы (2)


Вы ищете cherry pick, метод выбора только определенных коммитов из ветвь, которую нужно объединить.

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

Вы также можете разделить некоторые коммиты и объединить только те, которые содержат нужные файлы, и вы можете сделать как , как говорится в другой статье

person WDRust    schedule 07.06.2012
comment
выбор вишни неверен - он действует на все коммиты, а мне нужны части коммитов. checkout неверен, потому что он не поддерживает историю слияния / фиксации. Я не хочу, чтобы что-то доставляло боль, а статья о безболезненном разделении - это совсем не то, особенно когда задействовано множество коммитов. разделение коммитов было бы частью решения, но мне нужен автоматический способ выяснить, какие коммиты и как их разделить (т. е. только те изменения, которые относятся к файлам, которые я выбираю). - person user1441998; 07.06.2012

Это не обычная одноэтапная операция, потому что Git - это средство отслеживания контента. , а не трекер файлов.

Вы можете легко применить изменения к конкретным файлам из ветки B в ветку A, точно так же, как Tortoise:

# raw file, no history
git checkout A
git checkout B myfile

or

# copy a set of history from someplace else
git checkout A
git cherry-pick commit-hash-1..commit-hash-2

но ни один из них не сохранит историю как слияние из ветки B. Если это то, что вы пытаетесь сделать, в зависимости от того, как организованы коммиты в ветке B, это может быть лучше для вас: Git: метод частичного слияния для основных изменений версии?

person ellotheth    schedule 07.06.2012
comment
верно, я хочу, чтобы история коммитов / слияний точно отражала, что эта работа исходит от B., поскольку это технически возможно, используя много шагов в черепахе или выполняя разделение коммитов, как M.Ang. упоминается, я не согласен с тем, что git, не являющийся файловым трекером, не позволяет ему поддерживать эту общую потребность в использовании (несколько других вопросов SO требуют этого, но они соглашаются на потерю истории). - person user1441998; 07.06.2012
comment
Это не препятствует выполнению слияния конкретного файла, которое вы хотите выполнить, но поскольку это средство отслеживания содержимого, а не средство отслеживания файлов, коммиты должны быть настроены с учетом этого (см. Расщепление коммита M.Ang или кусочное слияние, которое я связал). Если вы относитесь к Git как к файловому трекеру, вы не получите желаемого поведения. - person ellotheth; 08.06.2012
comment
ну, Линус говорит в сообщении, которое вы связали, что это могло быть сделано из фарфора. Я не понимаю, почему он настаивает на дихотомии контент / файл. git мог бы работать так же, как сейчас, но считайте, что коммиты должны состоять из подкоммитов с изменениями только одного файла каждый, а затем поддерживать операции на основе файлов, как я хочу. ясно, что во время ветки / фиксации люди не знают, что они хотят объединить в будущем, и это решит эту проблему. git может быть трекером контента И файлов. - person user1441998; 08.06.2012
comment
Ваше утверждение ясно, что люди не знают во время ветки / фиксации, что они захотят объединить в будущем, предполагает, что вы описываете проблему рабочего процесса, а не проблему с инструментом. Дополнительное обсуждение: stackoverflow.com/ questions / 7323662 / - person ellotheth; 08.06.2012
comment
так вы думаете, что мы здесь для того, чтобы обслуживать git, а не наоборот? Мое предложение о разделении коммитов по файлам показывает, что утверждение Линуса о том, что отслеживание содержимого и отслеживание файлов являются взаимоисключающими, ложно, а также его утверждение о том, что отслеживание файлов в корне неверно (поскольку оно полностью совместимо с архитектурой, которую он утверждает, в корне прав ). так что обвинять рабочий процесс, который явно предпочитают пользователи, - чистое бахвальство. - person user1441998; 09.06.2012
comment
Если я могу добавить свои два цента, концептуально фиксация - это не набор изменений кучки файлов, добавляемых в систему отслеживания, а скорее функция / исправление / прочее, реализованное в этих файлах: в рабочем процессе / right / git вы должен выполнять атомарную фиксацию для функциональности / действия с источниками (и часто), поэтому вам никогда не понадобится и не нужно будет разделять фиксацию для файлов, когда придет время для слияния. Если вы ошиблись, вы должны исправить это способами, которые мы обсуждали. Вы не хотите думать о коммитах, основанных на файлах, потому что вы знаете, что зависимости существуют. Имеет ли смысл так выразиться? - person WDRust; 09.06.2012
comment
фактически, это применимо, вероятно, к каждому рабочему процессу DVCS, поскольку ваши коммиты будут влиять только на вашу локальную историю, и вы можете делать коммиты более свободно, чем, скажем, с SVN или TFS. - person WDRust; 09.06.2012
comment
Я согласен, что пользователь не должен управлять коммитами файл за файлом - dvcs должны брать коммиты пользователя на основе функций и разбивать их на подкоманды файл за файлом, которые доступны пользователю только тогда, когда он решит, что они были заблуждаются относительно детализации своих коммитов и необходимости объединять файлы. какой пример, когда это было бы не идеально? т.е. зависимости вызывают некоторую несогласованность репозитория? - person user1441998; 09.06.2012
comment
так ты думаешь, что мы здесь для того, чтобы служить мерзавцу, а не наоборот ... что-то насчет бахвальства Bluster? Нет, я думаю, что если ваш инструмент не подходит для вашего процесса, вам следует сменить инструмент. Git имеет определенную фундаментальную архитектуру и в результате ведет себя определенным образом. Как уже было сказано, он не выполняет прямых частичных слияний. Если вам не нравится такое поведение, разветвите его или используйте что-нибудь другое. Утверждать, что Git должен вести себя иначе, не предлагая решения в среде, не предназначенной для расширенного обсуждения, неконструктивно. - person ellotheth; 09.06.2012
comment
Вы сказали, что у меня проблемы с рабочим процессом, а не с моим инструментом. Я предлагаю модификацию дизайна для поддержки рабочего процесса, запрошенного многими пользователями, и мой вопрос: почему git не ведет себя таким образом? - приводит ли это к какой-то непоследовательности? почему Линус считает, что контент и отслеживание файлов принципиально противоположны, если вы можете просто разделить изменения контента на изменения файлов? почему никто не сделал его фарфоровым за 5,5 лет с тех пор, как Линус сказал, что это возможно, хотя об этом много раз просили? - person user1441998; 10.06.2012