2012-06-07 2 views
2

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

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

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

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

ответ

1

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

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

Вы также можете разделить некоторые фиксаций и объединить только те, которые содержат нужные файлы, и вы можете сделать как that other article says

+2

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

0

Это не обычная операция один шаг, потому что Git is a content tracker, not a file tracker.

Вы можете легко применить изменения к определенным файлам из ветви В расшириться А, так же, как черепаха:

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

или

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

, но ни один из тех, кто будет сохранять историю, как сливается с ветки B. Если это то, что вы пытаетесь сделать, в зависимости от того, как организованы фиксации в филиале B, это может быть лучше для вас: Git: piecewise merge approach for major version changes?

+0

Право, я хочу, чтобы история коммитов/слияний точно отражала, что эта работа исходит от Б., поскольку это технически возможно, используя много шагов черепахи или совершая расщепление, такое как M.Ang.я не согласен с тем, что git, не являющийся файловым трекером, не позволяет ему поддерживать эту общую потребность в использовании (несколько других вопросов SO запрашивают это, но они соглашаются на потерю истории). – user1441998

+0

Не исключено выполнение типа слияния, которое вы хотите выполнить, но поскольку оно * является * трекером контента, а не трекером файла, необходимо, чтобы коммиты были настроены с учетом этого (см. Фиксацию M.Ang расщепление или кусочное слияние, которое я связывал). Если вы рассматриваете Git как файловый трекер, вы не получите желаемого поведения. – ellotheth

+0

ну, linus говорит в сообщении, которое вы связали, что это может быть фарфор. я не понимаю, почему он настаивает, что существует дихотомия содержания/файла. git может работать так же, как сейчас, но подумайте, что коммиты состоят из субкомитов с изменениями только по одному файлу, а затем поддерживают файловые операции, подобные тому, что я хочу делать. ясно, что люди не знают в отрасли/времени выполнения, что они захотят объединить в будущем, и это решит это. git может быть файлом отслеживания содержания. – user1441998

Смежные вопросы