Что такое "git remote add ..." и "git push origin master"?

довольно часто Git и Rails выглядят как магия... например, в первая глава Rails 3 учебник, он говорит о Git:

git remote add origin git@github.com:peter/first_app.git
git push origin master

и это в значительной степени говорит "это просто работает", не говоря слишком много о том, что они есть, и начать говорить о ветвлении. Поиск в сети показывает, что git remote add добавить "короткое имя", например:origin, и это может быть любое имя, которое похоже на псевдоним URL. И origin обычный путь где удаленный РЕПО указывает на. (in http://git-scm.com/book/en/Git-Basics-Working-with-Remotes в разделе "добавление удаленных репозиториев")

так почему же URL не git://git@github.com/peter/first_app.git но в другом синтаксисе -- какой это синтаксис? Почему это должно закончиться .git? Я пытался не использовать .git в конце и он тоже работает. Если нет .git что еще может быть? The git на git@github.com кажется, учетная запись пользователя на сервере git?

кроме того, почему это должно быть так многословно использовать git push origin master? Не может ли значение по умолчанию быть origin и master? Я обнаружил, что в первый раз,origin master необходимо, но после небольшого редактирования и фиксации, затем git push - это все, что нужно (не нужно origin master). Может ли кто-то, кто знает, что происходит, дать некоторые детали?

иногда кажется, что много магии без объяснения причин... и иногда он так уверенно и, когда спросили, почему, не могу объяснить, и ответить что-то вроде "Вот кстати". Иногда очень практично и прагматично. Неплохо быть практичным, но, вероятно, не практичным до такой степени, чтобы не знать, что происходит.

4 ответов


git похоже на UNIX. Удобный, но придирчивый о своих друзьях. Это примерно так же мощно и удобно, как конвейер оболочки.

как только вы поймете его парадигмы и концепции, у него будет такая же Дзен-подобная ясность, которую я ожидал от инструментов командной строки UNIX. Вы должны рассмотреть возможность взять некоторое время, чтобы прочитать один из многих хороших учебников git, доступных в интернете. Книга Pro Git-хорошее место для начала.

ответить первый вопрос.

  1. что это git remote add ...

    как вы, наверное, знаете, git является распределенной системой управления версиями. Большинство операций выполняются локально. Чтобы общаться с внешним миром,git использует то, что называется remotes. Это репозитории, отличные от вашего локального диска, которые вы можете push ваши изменения в (чтобы другие люди могли их видеть) или pull from (так что вы можете получить другие изменения). Команда git remote add origin git@github.com:peter/first_app.gitсоздает новый пульт под названием origin расположенном в git@github.com:peter/first_app.git. После этого Вам команды, вы можете нажать, чтобы origin вместо того, чтобы печатать весь URL-адрес.

  2. что это git push origin master

    это команда, которая говорит: "нажмите фиксации в локальной ветви с именем master на пульт с именем origin". Как только это будет выполнено, все материалы, которые вы последний раз синхронизировали с origin, будут отправлены в удаленный репозиторий, и другие люди смогут их увидеть там.

теперь о транспортах (т. е. что git://) означает. Url удаленного репозитория могут быть разных типов (file://, https:// etc.). Git просто полагается на механизм аутентификации, предоставляемый транспортом, чтобы заботиться о разрешениях и прочее. Это означает, что для file:// URLs, это будут разрешения файлов UNIX и т. д. The git:// схема просит git использовать свой собственный внутренний транспортный протокол, который оптимизирован для отправки наборов изменений git. Что касается точный URL-адрес, это так, как это из-за того, как github настроил его git сервер.

многословие. Команду вы набрали вообще один. Можно сказать git что-то вроде "ветка называется master вот местное зеркало ветви под названием foo на пульте под названием bar". В git говорят, это означает, что master трассы bar/foo. Когда вы клонируете в первый раз, вы получите ветку под названием master и пульт дистанционного называется origin (где вы клонировали) с локальным мастером, установленным для отслеживания мастера в origin. Как только это настроено, вы можете просто сказать git push и он сделает это. Более длинная команда доступна в случае необходимости (например,git push может подтолкнуть к официальному публичному РЕПО и git push review master может использоваться для нажатия на отдельный пульт, который ваша команда использует для просмотра кода). Вы можете настроить свою ветвь как ветвь отслеживания, используя на .

я чувствовал что Git (в отличие от большинства других приложений, которые я использовал) лучше понимать изнутри. Как только вы поймете, как данные хранятся и поддерживаются внутри репозитория, команды и то, что они делают, становятся кристально ясными. Я согласен с вами, что среди многих есть элитарность!--0--> пользователи, но я также обнаружил, что с пользователями UNIX когда-то, и это стоило пахать мимо них, чтобы узнать систему. Удачи!


Update: обратите внимание, что принятый в настоящее время ответ увековечивает распространенное заблуждение о поведении git push, который не был исправлен, несмотря на комментарий, указывающий на это.

ваше резюме того, что пульты дистанционного управления-как псевдоним для URL-адреса репозитория-правильно.

так почему же URL не git://git@github.com/peter/first_app.git но в другом синтаксисе - что это за синтаксис? Почему это должно закончиться? с.ГИТ? Я старался не использовать .git в конце, и это тоже работает. Если нет .ГИТ, что еще это может быть? Git у новичка, похоже, является учетной записью пользователя на сервере git?

два URL-адреса, которые вы упомянули, указывают, что должны использоваться два разных транспортных протокола. Тот, который начинается с git:// для протокола git, который обычно используется только для доступа только для чтения к репозиториям. Другой, git@github.com:peter/first_app.git, является одним из различных способов указания доступа к репозиторий по SSH-это "синтаксис стиля scp", описанный в документация. Что имя пользователя в синтаксисе стиля scp является git из - за того, как GitHub имеет дело с идентификацией пользователей-по существу, это имя пользователя игнорируется, и пользователь идентифицируется на основе пары ключей SSH, которую они использовали для аутентификации.

что касается многословия git push origin master, вы заметили, что после первого толчка, то вы можете просто сделать git push. Это из-за серия трудных для запоминания, но в целом полезных значений по умолчанию:)

  • если удаленный не указан, удаленный настроен для текущей ветви (в remote.master.url в вашем случае) используется. Если это не настроено, то это.
  • если нет "refspec" (например,master, master:my-experiment, etc.) указано, затем git по умолчанию нажимает каждую локальную ветвь, которая имеет то же имя, что и ветвь на удаленном компьютере. Если у вас просто есть ветка под названием master общего между репозиторий и удаленный, это будет то же самое, что и нажатие вашего master на пульт master.

лично, так как у меня, как правило, много тематических ветвей (и часто несколько пультов), я всегда использую форму:

git push origin master

... чтобы случайно не толкать другие ветки.


в ответ на ваши комментарии по одному из других ответов, это звучит для меня, как будто are изучение git сверху вниз очень эффективно - вы обнаружили, что значения по умолчанию работают, и ваш вопрос спрашивает, Почему ;) чтобы быть более серьезным, git can использоваться по существу так же просто, как SVN, но зная немного о пультах и ветвях, вы можете использовать его гораздо более гибко, и это действительно может изменить способ работы к лучшему. Ваше замечание о семестровом курсе заставляет меня подумать о том, что сказал Скотт Чакон в интервью подкаста-студентов учат всем видам основных инструментов в информатике и разработка программного обеспечения, но очень редко контроль версий. Распределенные системы управления версиями, такие как git и Mercurial, теперь настолько важны и настолько гибки, что стоило бы преподавать курсы по ним, чтобы дать людям хорошее обоснование.

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

  • первичная документация для git так трудно разобрать для новичков. (Хотя я бы сказал, что если Вы Google для почти любого вопроса git, полезный учебный материал (или ответы переполнения стека :)) появляются в настоящее время.)
  • в git есть несколько странных поведений, которые трудно изменить сейчас, потому что многие сценарии могут полагаться на них, но запутывают людей.

  1. на .git в конце имени репозитория - это просто соглашение. Как правило, на серверах git репозитории хранятся в каталогах с именем project.git. Клиент и протокол git чтит эту конвенцию, тестируя для project.git если только - это.

  2. git://git@github.com/peter/first_app.git не является допустимым url git. репозитории git могут быть идентифицированы и доступны через различные схемы url, указанные здесь. git@github.com:peter/first_app.git - это ssh URL-адрес упомянутые на этой странице.

  3. git гибкий. Он позволяет отслеживать локальную ветвь практически в любой ветви любого репозитория. В то время как master (ваша локальная ветка по умолчанию) отслеживание origin/master (удаленная ветка по умолчанию) - популярная ситуация, она не универсальна. Много раз вы можете не хотеть этого делать. Вот почему первый git push так многословно. Он говорит git, что делать с местным master ветка, когда вы делаете git pull или a git push.

  4. по умолчанию git push и git pull для работы с пультом текущей ветви. Это лучшее значение по умолчанию, чем origin master. То, как git push определяет это, объясняется здесь.

git довольно элегантный и понятный, но есть кривая обучения, чтобы пройти.


git remote добавить origin:

Он централизует исходный код для других проектов.Он разработан на базе Linux, заполните open source и сделайте свой код полезным для других пользователей git.мы называем это ссылкой

помещает ваш код в репозиторий git, используя удаленный url-адрес концентратора git.