, который переходит в ту же ветку с git

18

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

    
задан jaras 27.05.2009 в 00:08
источник

5 ответов

31

Хорошо, когда вы клонируете репозиторий git (это то, что вы подразумеваете под «check out»?), вы эффективно создаете новую ветку. Разделы Git локальны для каждого репозитория, а не глобального. Сказав это, у вас есть протокол о том, как обновления ветвей передаются между репозиториями - когда вы вытаскиваете из удаленного устройства, по умолчанию ветвь «master» пульта, например, объединяется в вашу «ведущую» ветвь. И когда вы нажимаете, ваша ветвь «master» может быть добавлена ​​ к главной ветке удаленного. Таким образом, ваш мастер и ведущий пульта («origin / master», если хотите) являются разными ветвями, но связаны по соглашению.

Возвращаясь к точке --- вы заметили, что я сказал, что ваша главная ветка может быть добавлена ​​, когда вы нажимаете на пульт. Если два человека взяли экземпляр оригинала / мастера и внесли независимые изменения (помните, что это точно так же, как делать изменения на двух ветвях локально), как только один человек нажал свои изменения, изменения человека другого человека не являются простым добавлением к происхождению / мастер больше - они должны быть объединены. Это не может произойти, когда вы нажимаете, только когда вы тянете (путано, «тянуть» не совсем противоположно «push»: «fetch» ​​- это противоположность push-pull - это выборка, за которой следует слияние (или rebase)).

Итак, если вы находитесь в такой ситуации, кто бы ни пытался подталкивать свои изменения, сначала нужно отступить от обновленного оригинала / мастера, слить или переустановить свою версию мастера, а затем нажать. По умолчанию вы не можете удалить чьи-то изменения в ветку и заменить их на свой собственный: вам нужно как минимум сделать «git push -f», чтобы сделать это, а удаленный репозиторий может иметь настройки или перехватчики, чтобы сделать его значительно сложнее.

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

    
ответ дан araqnid 27.05.2009 в 00:31
источник
  • «VCS не является заменой для общения». Это, наверное, лучший комментарий, который я прочитал всю неделю. –  baudtack 27.05.2009 в 00:33
6

В Git ветви строго локальные . Один разработчик не может изменить удаленные ветви другого разработчика (см. Примечание внизу). Однако в случае репозитория bare вы можете «нажимать» свои изменения на него, чтобы обновлять ветви удаленного репозитория, если ваши изменения приведут к быстрой перемотке вперед.

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

Например, предположим, что Алиса и Боб оба работают над главной ветвью в своих локальных репозиториях, каждый из которых клонирован из общего (голого) репозитория на сервере. Если Алиса закончит свою работу сначала, когда она подталкивает свои преданные изменения в общий открытый репозиторий, он быстро перетащит главную ветвь основного репо.

Теперь Боб не может переадресовать основную ветвь основного репо, не предварительно обновив свою локальную ветвь, чтобы включить коммиты, добавленные Алисой (потому что коммиты, которые он добавил, не являются предками коммитов, созданных Алисой).

Один из способов, которым Боб может это сделать, - это вытащить (или, желательно, перебазировать) из голого репо после того, как Алиса подтолкнула ее к фиксации. Это объединит изменения Алисы в ветку Боба и позволит Бобу быстро перетащить основную ветвь основного репо с помощью push.

Возможны другие рабочие процессы: Алиса и Боб могут взаимодействовать друг с другом напрямую, не используя общий открытый репозиторий. На самом деле почти бесконечные возможности. Но в целом слияние в Git выполняется с помощью pulling изменений.

[примечание: на самом деле можно вдаваться в не-голые репозитории и тем самым обновлять ветви других людей, однако это часто приводит к неинтуитивным результатам, не считается типичным рабочим процессом git и обычно не поощряется]

    
ответ дан Dan Moulding 27.05.2009 в 04:45
источник
6

Более короткий ответ таков:

commit -m "my changes"

Получить общую версию

git fetch sharedrepo

один из этих двух, чтобы синхронизировать локальную ветвь с другим репо

git merge sharedrepo/sharedbranch
git rebase sharedrepo/sharedbranch

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

После слияния / переустановки и разрешения конфликтов вы возвращаетесь к репо

git push sharedrepo HEAD:sharedbranch

Не используйте здесь -f, так как это должно быть быстрым. Если вам не повезло, кто-то другой, возможно, нажал новую версию. Если это произойдет, перезапустите эту процедуру.

    
ответ дан robinr 27.05.2009 в 13:28
источник
0

Несколько человек могут работать в одной ветви одновременно. Когда вы тянете (или нажимаете другого человека), ваши изменения на вас git будут объединять изменения вместе, в результате получится ветка с обоими вашими изменениями.

    
ответ дан Chealion 27.05.2009 в 00:13
источник
0

Вы можете работать отдельно, а затем всякий раз, когда вам нужно нажимать / вытаскивать изменения, выполните следующие действия:

git add --all .
git commit -m "Commit desc"
git pull
git push

Разъяснения:

git add --all .

Добавить все изменения, включая удаленные файлы

git commit -m "Commit desc"

Объявить фиксацию

git pull

Первое нажатие, которое будет сливаться, может потребоваться исправить конфликты

git push

Нажмите последнюю объединенную версию [необязательно - если вы хотите отправить свои изменения]

Если вам нужен дополнительный контроль, например, возможность работать с несколькими локальными / удаленными версиями одновременно, посмотрите на ветвь .

Я рекомендую эту простую, но полезную страницу в качестве рекомендуемого рабочего процесса Ссылка содержит некоторые отличные процедуры.

    
ответ дан digout 29.12.2014 в 17:52
источник