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

Переходя к той же ветки с git

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

commit -m "my changes"

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

git fetch sharedrepo

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

git merge sharedrepo/sharedbranch
git rebase sharedrepo/sharedbranch

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

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

git push sharedrepo HEAD:sharedbranch

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

Ответ 4

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

Ответ 5

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

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

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

git add --all .

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

git commit -m "Commit desc"

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

git pull

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

git push

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

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

Я рекомендую эту простую, но полезную страницу в качестве предлагаемого рабочего процесса http://genomewiki.ucsc.edu/index.php/Working_with_branches_in_Git охватывает некоторые прекрасные процедуры.