2016-09-20 5 views
1

Я новичок в git. Предположим, что я удалил репозиторий локально с удаленного компьютера, и он называется localRepo. Есть два филиала Master и testBranch. testBranch - 100, и 5000 задерживается. Изменения были внесены в testBranch, но не были включены в Master. Поэтому я хотел переустановить testBranch на master в моем разветвленном localRepo.Альтернатива git rebase

я сделал следующее:

  1. git checkout testBranch
  2. git fetch origin
  3. git rebase origin/Master

Я испытываю несколько конфликтов, и я ее решения вручную с помощью mergetool (KDiff3) и, говоря который удалил или модифицировал файл для использования и т. д.

Поскольку это около 5000 коммитов, есть ли возможности для возникновения большего количества конфликтов? Если я разрешаю конфликты вручную так, я задаюсь вопросом, сколько дней прошло бы! Это было бы очень утомительно и непрактично.

Я делаю это правильно?

Это единственный способ для этого сценария? Или любой другой эффективный способ?

ответ

3

Нет, альтернативы rebase нет. Что есть, то есть. Извлеченный урок: ранняя ранняя замена и часто перебазировка. Покорение ваших обязательств означает, что вы собираетесь тратить много времени, рано или поздно. Два года назад я написал и объединил ветвь функций 200-commit, которая была разработана в течение шести месяцев. Я не знаю, сколько коммитов было объединено за эти шесть месяцев. Но я уверен, что они также числились в тысячах. Если бы я подождал, пока не закончил свою ветку функций, и попытался переустановить, у меня были бы большие проблемы. Но я ежедневно перестраивался, и возможное слияние оказалось большим, жирным, ничего-гамбургером.

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

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

Обратите внимание, однако, что для этого вам нужно быть идеальным, чтобы отслеживать все фиксации на вашей ветке свойств; которые были переработаны, а какие нет.

+0

Спасибо sam. Эта информация была бы очень полезной для меня. – vishnu

+0

Я опубликовал следующий вопрос. Было бы полезно, если бы вы тоже могли это посмотреть. (http://stackoverflow.com/questions/39615448/check-git-rebase-done-or-not) – vishnu

+0

Как насчет того, когда ветвь функции делится с кем-то еще? То есть это публично? Будет ли перебалансировка по-прежнему правильной? – Nickpick

2

Вместо этого вы можете использовать merge.

Плюсов merge: один, чтобы решить накопленную несовместимые изменений только между текущим окончательного состоянием testBranch и текущим состоянием master (хотя конфликтными местами могут быть таким же, с точкой зрения количества линий), вместо того, чтобы повторите действие каждого фиксации с testBranch над новым концом master (так работает rebase). Недостатки merge: график истории усложняется, некоторым людям не нравятся такие сложные графики, особенно те, которые переносятся из «старых» VCS с простыми древовидными графиками истории.

Иногда tools like git rereremay help, особенно если речь идет о множестве повторяющихся конфликтов. Но, конечно, это не серебряная пуля.

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

Часто это помогает разделить вашу огромную ветвь объектов на более мелкие кусочки и как можно скорее отбросить эти изменения обратно вверх. Таким образом, ваши коллеги будут использовать ваш код и ваши подходы, а не изобретать свои собственные [конфликтующие], поэтому слияния/переделки будут проще для всех сторон.

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

+0

Спасибо за проницательные мысли! Я буду следовать, как говорит сам. – vishnu

+0

Добро пожаловать. – user3159253

+0

Я опубликовал следующий вопрос. Было бы полезно, если бы вы тоже могли это посмотреть. (http://stackoverflow.com/questions/39615448/check-git-rebase-done-or-not) – vishnu