Подтвердить что ты не робот

Git/Основной разветвление и слияние Sourcetree

Приветствую вас! Я только начинаю использовать Git, и особенно Sourcetree, который кажется хорошим приложением для визуализации. В моем первом тесте он прошел хорошо, разветвляясь и сливаясь (см. Верхнюю диаграмму). Я знаю, что эта структура означает, что я использую ветку разработки и мастера неправильно, но это прекрасно, потому что по крайней мере это сработало.

На моей второй попытке, хотя я не мог представить визуализацию каких-либо ветвей, хотя работа была выполнена в обоих из них, они, кажется, появляются в одной отдельной ветке (с записью "7 вперед" ), и когда я попробуйте и слиться, кажется, ничего не происходит. Надеюсь, второго скриншота достаточно, чтобы кто-то сказал мне, что здесь происходит? Если нет, попробую дать дополнительную информацию.

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

enter image description here

4b9b3361

Ответ 1

На втором рисунке есть ветки. На местном уровне у вас есть 2 ветки, освоить и развивать. Оба ветки отдыхают при одной и той же фиксации. Если вы хотите "видеть ветки", как на первом снимке, вы можете сделать фиксацию при разработке, однако график все равно будет линейным. Если вы захотите, вы сможете слиться с мастером в этот момент.

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

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

Ответ 2

Здесь кое-что происходит. Во-первых, полезно понять, что ветки в Git на самом деле являются просто "метками", которые привязаны к определенному фиксации, и они будут автоматически перемещены, когда вы передадите ветке; Git создаст новую фиксацию с новым хешем фиксации и обновит ветвь/метку, чтобы указать на новую фиксацию. (Вы можете спросить, как это отличается от тегов? Тег привязан к одному и тому же фиксации и не будет получать обновления при вызове Git commit.)

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

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

Простой пример линейного ветвления

Когда вы попросите Git объединить одну ветку в другую, Git пойдет и выяснит, что ей нужно сделать, чтобы получить разницу между этими ветвями в целевой ветке. Скажем, вы хотите объединить изменения, которые вы сделали, чтобы перейти в мастер, поэтому вы скажете git:

$ git checkout master
$ git merge develop

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

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

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

Наконец, вы можете заставить Git всегда создавать фиксацию слияния, хотя это строго, технически, не требуется. В командной строке вы можете сделать это с флагом --no-ff, без быстрой перемотки вперед. У графических клиентов будет флажок, который выполнит одно и то же (в SourceTree, в настоящее время он помечен как "Создать фиксацию, даже если слияние разрешено с помощью быстрой перемотки вперед" ). Многие (в том числе и я) на самом деле рекомендуют просто слиться с -no-ff, потому что таким образом акт слияния всегда записывается в истории, независимо от технических характеристик, например, насколько технически возможно просто перемещать указатели отрасли.

Ответ 3

Я просто столкнулся с этой проблемой и обнаружил, что в SourceTree есть параметр "Не перематывать вперед при слиянии, всегда создавайте фиксацию". Убедитесь, что этот флажок установлен, и вы увидите структуру ветвей.

Этот параметр находится на вкладке Git в настройках.

Ответ 4

Вы можете предотвратить исчезновение ветвей в исходном дереве, включив "Не перематывать вперед при слиянии, всегда создавать фиксацию" в Инструменты/Параметры.

Отключение быстрой перемотки вперед при непрерывном объединении в Дереве источников

Если вы хотите решить для каждой операции слияния, в диалоговом окне "Слияние" есть опция " Создать новый коммит, даже если возможна быстрая перемотка вперед.

Отключить ускоренную перемотку при объединении во время каждой операции слияния в Дереве источников

Также я предлагаю обратиться к Eelke Blok answer за технической информацией.