1) «поскольку git использует систему« моментальных снимков »всей кодовой базы, git должен знать историю изменений и показывать всем кодерам, которые делали то, что в каждый момент времени».
Да, это то, что делают системы контроля версий. Они позволяют вернуться к состоянию кода в предыдущий момент времени и восстановить потерянную или удаленную работу. Они также позволяют вам видеть, кто что сделал и когда. Перейдите в один из файлов с версией и введите git annotate path/to/file
и посмотрите, что произойдет.
2) «commit подобен записи изменений в памяти проекта».
Прежде всего (не пытаясь быть анальным), изменения в ваших файлах не сохраняются в памяти, как в ОЗУ, они хранятся в секторах жесткого диска через файловую систему. Сохраняя ваши изменения в файле, о котором идет речь, вы можете подумать о сохранении этих изменений в git. Это включает два шага. Сначала выполните изменения, а затем зафиксируйте их. Изменения этапа также известны как добавление изменений в промежуточную область или изменение настроек индекса. Подумайте о промежуточной области или индексе в качестве «фиксации в процессе строительства», но еще не совсем готовы. Вы можете добавлять файлы в промежуточную область, используя git add
. Вы можете увидеть, какие файлы были добавлены с помощью git status
. Вы можете просмотреть детали поэтапных изменений, используя git diff --cached
. Когда вы, наконец, удовлетворены тем, что добавили все изменения, которые вы хотите зафиксировать в промежуточной области, вы можете совершить свои поэтапные изменения, используя git commit
. Поэтому команда commit завершает «строящуюся фиксацию». Внутренне в базе данных git создается новый объект фиксации, а указатель перехода текущей ветви обновляется, чтобы указать на это коммит. Этот двухфазный механизм фиксации дает вам линию защиты от случайного совершения изменений, которые вы не хотите совершать. Перед тем, как совершить, вы должны подумать обо всем, что вы добавляете в промежуточную область. Попробуйте использовать git add -p
для очень тщательного контроля над тем, что вы ставите, а что нет.
3) «Загрузка моей измененной версии проекта, то есть моя ветка в основное онлайн-репо (мастер) - это другое дело?»
Да, это совсем другое дело. Git - это скорее одноранговая архитектура, а затем архитектура клиент-сервер. Это позволяет делать локальные коммиты, не разделяя их с другими. Это позволяет вам выполнять работу других людей по мере необходимости и позволяет вам делиться своей работой с ними, когда вы действительно готовы. В git можно одновременно отслеживать несколько восходящих репозиториев. При этом git имеет что-то аналогичное архитектуре клиент-сервер, но не то же самое. Существует два типа репозиториев git.Базовые хранилища, которые разработчик использует для совместного использования кода с другими (аналогичными серверу в архитектуре клиент-сервер) и не-голыми репозиториями, которые разработчики работают локально на своих рабочих станциях (аналогично клиенту в архитектуре клиент-сервер). Чтобы переместить изменения кода из ветки в своем (небезовом) репозитории в ветку в онлайн-хранилище (голом), который вы сначала клонировали, используйте git push
. Голый репозиторий содержит только содержимое каталога .git
, которое включает в себя базу данных фиксации, но не файлы с версией, поэтому имя «голый». Его не обязательно следует называть .git
. Соглашение должно называть его чем-то вроде строки my_project.git и обслуживать его по сети. С другой стороны, не-голый репозиторий - это то же самое, что и репозиторий, на котором вы совершаете свои коммиты. Существует скрытый каталог .git
, содержащий все, что связано с git, а также файлы, над которыми вы сейчас работаете. Вы не можете вносить изменения в не-голый репозиторий, и вы можете серьезно испортить чужую работу, сделав это.
4) Когда я загружаю локальные изменения в основную версию проекта, мои фиксации (записанные в .git-файле) становятся известны другим.
Это означает, что они теперь хранятся в общем открытом репозитории. Другие люди будут знать только об этих изменениях, если они захотят получить эти изменения, используя git fetch
. Получив эти изменения, они могут либо объединить эти изменения в свой соответствующий локальный филиал, используя git merge
, либо переустановить их локальные изменения поверх ваших изменений, используя git rebase
. Чтобы выполнить этот процесс за один шаг, они могут использовать git pull
. Стратегия вытягивания (для слияния или для переустановки) определяется параметром конфигурации pull.rebase
, настроенным командой git config pull.rebase true
. Я настоятельно рекомендую перезагрузка слияния, так как это стимулирует линейную историю, так как комманда слияния имеет две предопределяющие коммиты, тогда как у rebased commit есть только один.
5) «Загрузка изменений в ведущую ветку вызывает все мои коммиты, верно?»
Почти право. Команда git push также может принимать аргументы, но при отсутствии этих аргументов она будет делать разумные умозаключения по умолчанию. Git будет использовать что-то, называемое refspecs и конфигурацию ветки вверх по течению, чтобы сделать эти выводы. Когда вы нажимаете, вы перемещаете фиксации из ветки в своем нечеловечном репозитории в ветку в открытом репозитории. Если git не может сделать эти выводы правильно (т. Е. Какая ветка, в которую репозиторий вы хотите переместить изменения, и из какой локальной ветви вы их перемещаете), вам придется явно указать эти аргументы команде git push.
Я не знаю, действительно ли это вопрос Q/A, но я ответил, потому что большинство людей, которые боятся Гита, боятся, потому что они этого не понимают. Поэтому полезно задавать вопросы, используя свой собственный словарь, чтобы вы могли понять концепции Git, которые соответствуют вашему словарю. Что касается Гит, я думаю, что никогда не глупо спрашивать что-либо. –
@ThibaultD., Большое спасибо, это точно так же, как вы описали его! потому что git используется многими яркими кодонами, средние кодеры боятся спросить об этом – ERJAN