Витягніть всі комісії з гілки, пересуньте вказані комісії до іншої


102

У мене є такі відділення:

  • master
  • production

та наступні віддалені відділення:

  • origin/master
  • origin/production

У мене є сценарій, який отримує origin/masterгілку і отримує відмінність того, що змінилося з мого останнього вибору ( log -p master..origin/master). Тоді я зливаюся origin/master.

Знайдені комісії висуваються на інструмент перегляду коду.

Я хочу підштовхнути успішні зобов’язання - і тільки їх - до виробничої галузі, а потім, звичайно, до origin/production.

Як я можу це зробити?

Крім того, у мене запущені 2 сценарії: той, який витягується з нього origin/master, push push вводить деталі в базу даних і об'єднує, а також інший, який я зараз пишу, який повинен буде підштовхнути успішні коміти.

Я хотів би, щоб ці 2 сценарії працювали, уникаючи перегонових умов / конфліктів злиття. Оскільки я хочу працювати лише з визначеними комісіями, можливо, є спосіб позбутися від тих, які я не хочу?


Що ви маєте на увазі під «успішними зобов’язаннями»?
bdonlan

той, який був перевірений та позначений як успішний. це насправді не має значення, важливо те, що є комітети, які я хочу зберегти та перенести до іншої гілки, та інші, яких я хочу позбутися / ігнорувати.
Sylvain

Відповіді:


313

Термін, який я думаю, що ви шукаєте, - це «вишневий вибір». Тобто візьміть одну комітку з середини однієї гілки та додайте її до іншої:

A-----B------C
 \
  \
   D

стає

A-----B------C
 \
  \
   D-----C'

Це, звичайно, можна зробити за допомогою команди git cherry-pick.

Проблема цього комітету полягає в тому, що git вважає, що комісії включають всю історію до них - таким чином, якщо у вас є три коміти, як:

A-----B-----C

І намагайтеся позбутися B, ви повинні створити абсолютно нове зобов’язання на зразок:

A-----------C'

Де C 'має інший ідентифікатор SHA-1. Крім того, вишневий вибір комісії з однієї гілки на іншу в основному передбачає генерування патча, а потім його нанесення, тим самим втрачаючи історію і таким чином.

Ця зміна ідентифікаторів комітів порушує функцію злиття git серед інших речей (хоча, якщо використовувати їх економно, є евристика, яка буде обробляти цю інформацію). Що ще важливіше, вона ігнорує функціональні залежності - якщо C фактично використовував функцію, визначену в B, ви ніколи не дізнаєтесь.

Можливо, кращим способом впоратися з цим було б мати більш дрібнозернисті гілки. Тобто, замість того, щоб просто мати "master", мати "featureA", "bugfixB" тощо. Виконайте огляд коду на всій гілці одночасно - де кожна гілка дуже зосереджена на тому, щоб робити лише одне - і потім об'єднайте це одна гілка, коли ви закінчите. Це робочий процес, для якого створений git, і для чого це добре :)

Якщо ви наполягаєте на тому, щоб розібратися з речами на рівні патчів, можливо, ви захочете поглянути на дарків - він вважає сховище набором патчів, і, таким чином, вибір черешні стає основною операцією. Однак у цього є свій ряд проблем, таких як дуже повільний :)

Редагувати: Також я не впевнений, що я розумію ваше друге питання щодо двох сценаріїв. Можливо, ви могли б описати це більш докладно, можливо, як окреме запитання, щоб не заплутатися?


Щодо мого другого питання, я просто хочу переконатися, що процеси отримання змін (1-й скрипт) та переміщення заданих комісій в інше місце (2-й сценарій) можуть працювати, не маючи умови перегонів / злиття конфлікту, працюючи з різними гілками. Зрештою, я думаю, що це не має значення, оскільки я можу об'єднати два сценарії в один, щоб два сценарії не працювали одночасно :)
Sylvain,

9
"Ця зміна ідентифікаторів комітів
Нарек

5
@Narek Він, ймовірно, означає, що зміни у фіксації C 'зіткнуться з тими ж змінами у команді C, коли ви об'єднаєте другу гілку. Це наслідок втрати історії за
версією

1
"І намагайся позбутися Б" - чому ти намагаєшся позбутися Б?
d512

3
@ user1334007, він означає, що раніше це було ABC. Тепер, завдяки вашому вишневому вибору C, ваша філія - ​​AD-C ', яка більше не містить "B".
AnneTheAgile

1

Я усвідомлюю, що це старе питання, але тут посилається: Як об'єднати певний комітет у Git

Отже, новіша відповідь: Використовуйте гілки функцій та витягніть запити.

Як це виглядає, коли fA - це команда з функцією A, а fB - команда з функцією B:

            fA   fC (bad commit, don't merge)
           /  \ /
master ----A----B----C
                \  /
                 fB

Запити на виклик пов'язані з функціональністю GitHub, але я маю на увазі, що хтось несе відповідальність за об'єднання гілок функцій у головний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.