Правильный способ действовать, когда вверх по течению выходит вперед от неполного пиара? - PullRequest
0 голосов
/ 17 сентября 2018

Введение

Я разветвил репозиторий, который следует так называемому «потоку мерзавцев» и должен развивать / master / factory ветки. Теперь я буду ссылаться на мой форк как origin, а основной репозиторий как upstream.

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

После нескольких временных коммитов с временными выбрасывающими временными дурными именами я создал PR и нажал. Идея, которую я имел в виду, заключалась в том, чтобы в конечном итоге объединить все мои коммиты на одном, а затем предоставить правильное имя / описание коммита, чтобы сопровождающий мог объединить все это с исходным / разработанным без каких-либо проблем, моей главной целью было сделать весь процесс как можно более плавный, как для меня, так и для сопровождающего, после слияния я с радостью удалил свою локальную ветку, работа выполнена, легко, peasy ...:)

ПРОБЛЕМА

Я был наивным, думая, что все пройдет так гладко!

Я ни в коем случае не эксперт по git, и я ошибался, полагая, что PR будет развиваться так гладко (это происходит, когда вы действительно не знаете, какие инструменты используете). В какой-то момент я перестал работать над своим PR на несколько дней и, очевидно, upstream / development продолжал развиваться и далеко опережать мой PR, мой PR еще не проходил тесты, и весь PR все еще находился на незавершенной работе .

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

Обладая небольшим знанием о возможных последствиях слияния или перебазирования, я решил, что слияние не может быть таким уж плохим, и со временем все можно будет привести в порядок, верно? Что ж, в результате, после слияния и добавления некоторых временных коммитов моя локальная история стала немного запутанной, и я не знаю, можно ли это как-то очистить, не испортив предыдущую историю.

Допустим, история выглядит примерно так: PR = c1-> c2-> c3-> upstream1-> upstream2-> upstream3-> c4-> c5. В этом примере c1..c6 будут моими локальными изменениями, а upstream1..upstream3 будет фиксироваться вперед от upstream.

ВОПРОСЫ

  • Было ли мое решение о слиянии действительно плохим выбором, когда апстрим вышел очень далеко от моего незаконченного пиара? Что было бы лучшим способом действовать в этом случае? Представьте, что моя цель - в конечном итоге единственный сдавленный коммит, в конечном итоге слитый в верхний поток
  • Как только вред нанесен, и я слился после разрешения конфликтов и создал еще несколько коммитов, все еще можно было бы обеспечить чистый PR с помощью всего лишь одного сдавленного коммита без переписывания предшествующей истории?

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

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

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

Я также, как и вы, стараюсь раздавить коммиты на 1 коммит в PR.

Итак, скажем, есть ветвь dev.

Когда я запускаю ветвь функции, я делаю:

>> git checkout dev
>> git pull
>> git checkout -b feature_branch
>> commitA
>> commitB
>> git push -u origin feature_branch // now there is origin/feature_branch available to everyone
>> and create a PR when I'm ready

Теперь процесс идет так:

Люди проверяют мою работу и комментируют, я делаю свои изменения и фиксирую. Это своего рода петля, это заканчивается, где все мы удовлетворены этими изменениями и готовы объединить вещи

>> commitC
>> commitD

Итак, теперь я готов "раздавить мои коммиты в один". Итак, я делаю:

>> // make sure I'm on feature_branch
>> git rebase -i HEAD~4
>> // at this point I have one 'beautiful' commit, lets_call it commit_TO_GO
>> git push -f //forcefully push my commits by overriding the current state of a remote branch in PR, this is not really important, only if I want to "preserve this state for backup or something

Пока эта ветвь не слита, я не против, это не имеет значения.

Давайте представим, что этот процесс занял некоторое время, а между тем в ветке origin/dev (commitX, commitY и commitZ) были сделаны новые коммиты, выполненные другими товарищами по команде.

Итак, теперь я могу сделать следующее: Слияние путем применения обычного трехстороннего слияния, если возникнут конфликты, я, конечно, сначала должен их разрешить.

Однако, поскольку я обеспокоен историей коммитов (как и вы), я делаю следующее:

>> git fetch --all 
>> git rebase origin/dev
>> // at this point The my commit_TO_GO is applied on top of commitX,commitY,commitZ. 
>> // technically it has a different sha1 now, but it's not really important, its 
>> still my own branch, I do whatever I want there :)
>> git push -f // again forcefully push to origin/feature_branch

После этого шага origin/feature_branch - это FF из origin/dev, что круто, потому что я могу применить слияние, и оно будет в режиме FF, даже коммит слияния не будет создан.

Конечно, если есть конфликты, перебазирование не будет работать, сначала мне придется разрешить конфликты. Я делаю это в своей IDE, а затем продолжаю ребазирование (git rebase --continue), но разрешение конфликта выходит за рамки этого вопроса

Теперь я готов объединить мои изменения с origin/dev

Обычно я делаю это в интерфейсе bitbucket / github.

После слияния история в origin/dev выглядит красиво:

commitX->commitY->commitZ->commit_TO_GO

Результат: никаких слияний вообще нет, мой единственный коммит применяется последним

Одна точка для рассмотрения:

Его ничего не стоит перебирать из ветки dev даже во время разработки (пока вы работаете над feature_branch), просто чтобы убедиться, что он содержит последние изменения. Таким образом, вы можете проходить цикл столько раз, сколько захотите:

 >> git fetch --all 
 >> git rebase origin/dev

Я понимаю, что, вероятно, у Git больше «быстрых команд» в рукавах, и, возможно, это объяснение было слишком подробным.

0 голосов
/ 25 сентября 2018

Как уже упоминалось выше, я выберу git rebase, как показано ниже.

topic - ваш запрос на получение, и в то же время ветвь master связана с другими коммитами.

      A---B---C topic
     /
D---E---F---G master

rebase означает изменить предыдущую базу, которая также изменит историю вашей ветви.

              A'--B'--C' topic
             /
D---E---F---G master

В результате вам придется принудительно нажать на удаленную ветвь. Поскольку никто не объединял ваш PR ранее, это нормально и не влияет на ваших соавторов.

Подробнее о ребазе вы можете прочитать здесь: Pro Git v2, Git Branching - Перебазировка и Команда git-rebase .

0 голосов
/ 17 сентября 2018

С точки зрения конечных результатов, слияние и перестановка - это одно и то же ... Однако, с точки зрения полученной истории и того, насколько легко было бы иметь возможность перемещаться по вашей работе «в изоляции», они сильно различаются... Если вы работаете, затем объединяетесь, затем работаете больше ... Затем объединяетесь ... Затем работаете еще немного и так далее, очень трудно увидеть все ревизии, составляющие работу этой функции в одиночку.

Все это говорит: просто ребазай.Что делать?Перейдите к совету upstream / development , выберите реальные ревизии, из которых состоит функция (без слияний) ... Таким образом, вы очистили ветку ... Установите указатель локальной функциик этому моменту и продолжайте работать ... Если над upstream / development будет проделана дополнительная работа, то перебазируйте поверх него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...