требуется объяснение того, как работает команда «git push»

#git #github

#git #github

Вопрос:

Я пытался развернуть свой исходный код на Github. Затем я сначала добавил исходный код github в удаленный исходный код следующим образом:

 $ git remote add origin git@github.com:user_name/foo_bar.git*
  

Затем я попытался запустить команду «git push», чтобы загрузить исходный код в свою удаленную учетную запись github, как показано ниже.

 $ git push

Enter passphrase for key '/c/Users/mylaptop/.ssh/id_rsa':
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to 'git@github.com:user_name/foo_bar.git'
  

Как я узнал из railstutorial.org Я знаю, что если я использую «git push» в первый раз, он вернет ошибку, ожидающую, что я укажу параметры ‘origin master’. Но в следующий и последующие разы я могу запустить только «git push», для меня это будет работать корректно. В чем причина этого? как я и думал, команда по умолчанию всегда ссылается на ветку «master».

Любое четкое объяснение было бы действительно оценено.

Ответ №1:

При первом выполнении git push в origin нет удаленной ветви с именем master.

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

Ответ №2:

По умолчанию git push origin выполняется отправка во origin все локальные ветви, которые имеют то же имя, что и ветка на origin .

Если вы вводите git push без указания origin , имя целевого репозитория выводится из удаленной ветви, отслеживаемой веткой, в которой вы находитесь. Итак, если вы master отслеживаете origin/master ветку, git push это похоже на git push origin .

Ответ №3:

В репозиториях Git есть такая концепция «отслеживания». Итак, с точки зрения git, он может знать, что основная ветвь отслеживает origin / master. Если он видит эту связь, когда вы выполняете git push , тогда он говорит: «О, ну, он нажимает с master, который отслеживается с помощью origin / master. Это должно быть то, куда он хочет, чтобы оно шло. «

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

Примечание: Смотрите комментарий Джефроми ниже. Он указывает на некоторые неточности в моем объяснении, которые могут быть важны, в зависимости от вашего варианта использования.

Комментарии:

1. Это не совсем правильно, и этот отрывок из книги по Git тоже немного вводит в заблуждение. (Я думаю, что он пытается просто не выдавать ложную информацию, но все же.) По умолчанию git-push выполняется переход к ветвям с тем же именем, полностью игнорируя отслеживание ветвей. Если вы хотите, чтобы она использовала ветви отслеживания, вы должны установить push.default значение tracking . Однако в обычных случаях все будет просто работать — все ветви отслеживают ветви с одинаковым именем, и вы избегаете случайного нажатия на свои личные локальные ветви, потому что они не существуют на удаленном компьютере.

2. Блин, ты прав. Я использую git уже около 9 месяцев, успешно настроил два частных сервера git — и мне все еще есть чему поучиться. Такова жизнь. Спасибо за комментарий! 🙂