2016-03-18 3 views
0

цель мерзавца совершить Я наблюдал несколько учебников и вот мое понимание команды «фиксации», показанную в отчетности:Понимание команды

  • поскольку мерзавец использует систему «моментальные снимки» все кодовые , git должен знать историю изменений и показывать всем кодерам, которые делали то, что в каждый момент времени.

  • «commit» - это как запись изменений в памяти проекта.

  • Загрузка моей измененной версии проекта, то есть. моя отрасль к основному онлайн-репо (мастер) - это другое дело?

  • Когда я загружаю локальные изменения в основную версию проекта, мои коммиты (записанные в .git-файле) становятся известны другим.

  • Загрузка изменений в мастер-ветку «толкает» все мои коммиты, не так ли?

Правильно ли я отношусь к этим утверждениям?

+2

Я не знаю, действительно ли это вопрос Q/A, но я ответил, потому что большинство людей, которые боятся Гита, боятся, потому что они этого не понимают. Поэтому полезно задавать вопросы, используя свой собственный словарь, чтобы вы могли понять концепции Git, которые соответствуют вашему словарю. Что касается Гит, я думаю, что никогда не глупо спрашивать что-либо. –

+0

@ThibaultD., Большое спасибо, это точно так же, как вы описали его! потому что git используется многими яркими кодонами, средние кодеры боятся спросить об этом – ERJAN

ответ

2
  • поскольку мерзавец использует систему «моментальные снимки» все кодовые, мерзавец должен знать историю изменений и показать все кодеры, которые сделали то, что в каждый момент времени.

Это разумный способ выразить это.

  • «совершить», как запись изменений в память проекта.

Да, совершая добавляет запись ваших изменений (по сравнению с предыдущей фиксации) на верхней ветви.

  • загрузив мой измененную версию проекта, то есть. моя отрасль к основному онлайн-репо (мастер) - это другое дело?

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

  • когда я загрузить мои локальные изменения в основную версию проекта, мои фиксации (записанный в .git файл) становятся известны другим.

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

  • Выгрузка изменения в основную ветвь «толкая» все мои фиксации, верно?

толкания «загрузка» (если вы хотите использовать это слово) изменения в основной отрасли в дистанционного «ы. Как я уже говорил ранее, пульт будет принимать только в том случае, если ваши изменения основаны на последней истории, доступной на главном пульте дистанционного управления.

Обратите внимание, что все это относится к любой отрасли, вы можете иметь столько ветвей, сколько хотите, не только мастер.

1

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.

1

мерзавец в основном использует эти 3 вещи, чтобы сохранить ваши данные:

  • blob просто блоб материала (исходный код, изображения, что угодно). Blob не содержит информации о типе или названии содержимого и представляет собой массу байтов.
  • A tree указывает на одну или несколько капель, думаю, «каталог». Он содержит имена файлов и т. Д. Из капли, на которые он указывает.
  • A commit (объект данных, а не команда git) - это отдельный объект, который указывает ровно на одно дерево (состояние всех файлов в этот момент времени) и ноль или более других коммитов (родительский элемент, который может отсутствовать для самого первого фиксации в репозитории и который может быть кратным в случае слияний).

Всё. Понятно, что нет ничего другого. На практике есть ветви и метки, но это только специальные «липкие заметки», указывающие на фиксации. Существуют также механизмы для уменьшения объема хранилища и т. Д., Но они не представляют интереса, если вы не взламываете код или не погружаетесь в реальность.

Отвечая на ваш вопрос просто в этом контексте:

  • Когда вы извлекаете фиксации в рабочем каталоге, вы получаете файлы из одного конкретного commit. Скажем, заметка (ветвь) master указывает на фиксацию afd876123, и вы клонируете репозиторий в новый рабочий каталог, затем получаете файлы, представленные в tree, на которые указывает commit afd876123.
  • git, конечно, отслеживает и создает специальную заметку HEAD, в которой хранится информация о том, что вы находитесь на master и на совершении afd876123. Он также создает index, который вы можете назвать анонимным tree.
  • Вы редактируете некоторые файлы в своем рабочем каталоге.
  • Когда вы запустите git add, git обновит index с вашими изменениями. Хотя внутренне он работает по-другому, вы можете подумать об этом как об обновлении tree "index" с вашими изменениями.
  • commit связан с этим tree (пока), поэтому это не постоянная вещь; это не влияет на толкает, тянет или что-то еще.
  • При запуске git commit он создает новый commit объект, который указывает на tree, представленного текущего индекса, а также предыдущий коммит afd876123 и другую информацию (например, метки времени, сообщение журнала ...). Этот объект commit затем добавляется в хранилище данных и таким образом завершается.

Остальные ваши предположения о толчке/тяге в основном правильны.

Смежные вопросы