В Git при отправке основной ветки также отправляются коммиты из ветки разработки. Это должно произойти? Я использую Gitflow

Когда я начал работать с git, мой рабочий процесс основывался на модели Gitflow: http://nvie.com/posts/a-successful-git-branching-model/. Я думал, что основная идея заключалась в том, чтобы сохранять коммиты в соответствующих ветках; так что, например, в основной ветке будут только те коммиты, которые были объединены из ветки разработки... т.е. теги... 0.1. 0,2. 1.0 на графике. Я не совсем понимаю, как работает git или как должен работать этот рабочий процесс, но я так и думал, тем более, что рисунок на этой странице показывает только эти несколько коммитов в главной ветке, а не все ветки разработки.

Я загружаю свой репозиторий в Bitbucket, и все шло хорошо, пока я работал в ветке разработки, однако, когда я закончил разработку; и, подняв ветку master, я обнаружил, что ветка master в Bitbucket теперь содержит все коммиты, которые я сделал в ветке разработки, тогда как я думал, что буду содержать только последний коммит (тот, в который я влился). Может ли кто-нибудь объяснить, почему это так, и является ли это предполагаемым поведением, и если нет, что я могу сделать, чтобы мой рабочий процесс работал в соответствии с приведенной выше моделью. Я использую СмартГит.


person byronyasgur    schedule 24.03.2013    source источник


Ответы (3)


Ваша модель ветвления, по-видимому, требует указывать --no-ff при каждом слиянии, принудительно вводя учетные записи даже для пустых слияний - например, на вашем графике вы должны выполнить слияние от исправлений до 0.2, что делает эту фиксацию в основной ветке, а не на самом деле сделать любое слияние, с git merge --no-ff hotfixes. В проектах с административными требованиями, не поддерживающими git, это хороший способ сделать это. VonC ответил в случае, когда вы где-то пропустили требование --no-ff этой модели.

Для случая, когда вы следовали своей модели и просто не ожидали, что push будет вести себя так: если вы извлекаете мастер с версии 1.0 в репозитории с историей вашей графики и отправляете в главную ветку удаленного устройства, когда нажатие завершает удаленное будет иметь коммиты M2, M4, M5, Y1-6, G1-4, R1 и C1-3 (маркируя свои коммиты в соответствии с их цветом и вертикальной последовательностью), и удаленная ветка master будет ссылаться на все это.

Нужно понимать, что истории коммитов важны, а имена ссылок - нет, по крайней мере, не важны "заглавные буквы". git push

Обновляет удаленные ссылки, используя локальные ссылки, при этом отправляя объекты, необходимые для завершения заданных ссылок.

Обычно, если ваш репозиторий является частью основной разработки проекта, вы отслеживаете имена ссылок некоторых «центральных» репозиториев. Клон Git по умолчанию устанавливает для них локальные ветки remotes/origin/*; но другие настройки совсем не необычны, если у вас есть репо, в котором вы работаете над v2.1 какого-то проекта, вы можете рассматривать ветку выпуска v2.1 какого-либо другого репо как «главную» ветку вашего репо.

Если вы хотите отправить только результаты фиксации, не отправляя ее историю, вы должны сделать новую фиксацию, которая имеет результаты, но не имеет этой истории. Другие ДВС были построены людьми, которые относятся к построению истории таким образом с разной степенью отвращения; git считает такой выбор не своим делом: он предоставляет (именно так) инструменты, которые реализуют любую модель, которую вы хотите себе представить. git cherry-pick сделает новую фиксацию, сравнив именованную фиксацию с ее первым родителем, а затем применив эту разницу к текущей голове с сообщением выбранной фиксации. Vanilla git rebase выбирает целую последовательность таких коммитов. Поведение, которое, я думаю, вы ожидали, это то, что делает git merge --squash; git commit: применить различия в истории фиксации и забыть, откуда они взялись. Если вы сделаете это, в истории вашей ветки никогда не появится ни один коммит из другого места. Это определенно не та модель, которую пытается передать ваша графика.

person jthill    schedule 24.03.2013
comment
Что ж, кажется, VonC тоже понял это правильно, но я награждаю вас галочкой за очень исчерпывающий ответ и указываю, что моя модель ветвления требует --no-ff при каждом слиянии. Спасибо - person byronyasgur; 25.03.2013
comment
Спасибо. Кстати, я думаю, что пример в ответ, который он связал, показывающий, как использовать git config для настройки параметров слияния по умолчанию для каждой ветки, заслуживает особого упоминания где-то на этой странице. - person jthill; 25.03.2013
comment
Я согласен. +1. Более подробный, чем мой ответ. - person VonC; 25.03.2013

Возможно, что при слиянии ветки development с веткой master вы выполнили ускоренное слияние.
В отличие от ветки git merge --no-ff, которая (справочная страница) "создает фиксацию слияния, даже если слияние разрешается как перемотка вперед".

Это означает, что master HEAD просто переместился в dev HEAD, ссылаясь на все dev коммиты.

См. "Почему git использует ускоренное слияние. по умолчанию?".

person VonC    schedule 24.03.2013

Пожалуйста, выполните следующие действия. Возможно, вы узнаете ответ самостоятельно.

  • Убедитесь, что вы сейчас работаете с правильной веткой

    git branch -a //Shows you all the branches 
    git checkout {branch_name} //Make sure you checkout the correct branch
    
  • Убедитесь, что у вас есть правильные коммиты в вашем журнале

    git log --oneline -6 // Show last 6 commits on this branch
    
  • Если вы видите коммиты из другой ветки, возможно, вы объединили эту ветку в свою текущую ветку или по ошибке сделали коммиты в этой ветке.
person sachinjain024    schedule 24.03.2013