Почему мне нужно настроить upstream в локальной ветке, когда я уже добавил git remote add? - PullRequest
1 голос
/ 03 февраля 2020

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

git clone ssh://git@<my-project.git>

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

git remote add upstream ssh://git@<my-project.git>

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

$ git remote -v
origin  ssh://git@<my-project.git> (fetch)
origin  ssh://git@<my-project.git> (push)
upstream        ssh://git@<my-project.git> (fetch)
upstream        ssh://git@<my-project.git> (push)

Итак, я создал новую ветку, взятую из мастера

git checkout -b sample-branch master
Switched to a new branch 'sample-branch'

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

git push

fatal: The current branch sample-branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin sample-branch

Возможно, я думаю, что, поскольку я уже добавил восходящую ветку, моя локальная ветвь не нуждается в настройке моей восходящей или я может думаешь неправильно? Я должен выполнить строку выше, прежде чем я смогу выполнить

git push 

для последующих команд.

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Для версии TL; DR см. Von C ответ .

git remote add добавляет remote . Remotes может иметь любое имя, которое вам нравится, хотя по соглашению origin является первым, а upstream часто вторым. Но обычно, если вы добавите второй пульт, он будет иметь другой URL, а не тот же URL. Вам нужно только более одного пульта, если вы говорите с несколькими различными Git репозиториями, каждый с разными URL.

Смущает, что пульт с именем upstream (если он у вас есть) не является восходящим, он просто удаленный.

Термин в восходящем направлении , когда применяется к имени ветви, относится к тому, что внутренне является установкой из двух частей (как Von C сказал ) , Каждое имя ветви, такое как master или feature, может иметь одно восходящее или не иметь восходящее. Обычно восходящий поток master будет origin/master, а восходящий feature будет origin/feature. Если у вас было несколько пультов, и вы назвали второй upstream, вы могли бы установить восходящий поток branchX на upstream/branchX.

Итак: восходящий поток ветви другое имя, обычно начинающееся с имени remote . Git использует эту настройку для запоминания «вот откуда я получаю / извлекаю» и «туда, куда я направляюсь sh». Это имя должно действительно существовать , хотя, и вот тут все действительно запутано.

Поэтому я создал новую ветку, взятую у мастера

git checkout -b sample-branch master
Switched to a new branch 'sample-branch'

Технически, это создает новое имя ветки в вашем собственном хранилище Git с именем sample-branch. Фиксация ha sh ID выбрана с помощью это новое имя ветви совпадает с фиксацией ha sh ID, выбранной с помощью существующего имени master (также имя ветви).

Когда вы используете команду такого типа git checkout, ваш Git установит в восходящем направлении новой ветви значение name другой ветви , если это, скажем, origin/sample-branch. Но у вас, вероятно, нет и origin/sample-branch. Это имя будет существовать только в том случае, если Git более чем на origin - по URL-адресу, хранящемуся в remote с именем origin, то есть - имеет ветку с именем sample-branch и ваш Git видел это и скопировал это. Поскольку вы не использовали origin/sample-branch здесь - и если бы вы его использовали, он все равно просто потерпел неудачу - ваш Git не не установил восходящий поток для новой ветви.

Вы нужно что-то делать в конце концов с этим. Там нет необходимости делать это прямо сейчас! Вы можете сделать это, когда захотите. Но в конце концов, вам нужно сделать это. Это включает два шага:

  1. Вы должны получить другой Git, один над origin, чтобы создать ветку с именем sample-branch. Когда вы получите Git для создания , его sample-branch, ваш Git теперь может скопировать его в ваш origin/sample-branch, так что ваш origin/sample-branch существует.

  2. Как только ваш origin/sample-branch существует, вам нужно получить ваш Git, чтобы установить origin/sample-branch в качестве восходящего потока для sample-branch.

Вы можете выполнить этот двухэтапный процесс с двумя отдельными командами Git, а в древнем прошлом у вас было , чтобы сделать это таким образом. Однако в современных Git версиях достаточно одной команды. Эта одна команда - git push -u origin sample-branch.

Что это делает:

  1. Пусть ваш Git вызовет свои Git (Git в origin) используя URL-адрес, сохраненный в имени origin.

    Ваш Git предлагает своим Git любые новые коммиты и другие объекты, необходимые для выполнения общей задачи. Ваш Git будет отправлять коммиты и содержащиеся в них файлы, если это необходимо. Как только у них есть все необходимое, ваш Git затем отправляет им вежливый запрос: Пожалуйста, если все в порядке, создайте или обновите ваше имя sample-branch, чтобы оно идентифицировало конкретный коммит. Конкретный коммит ваш Git рекомендует здесь тот же коммит, который идентифицирует ваше имя sample-branch.

    Если они примут этот запрос, это создаст их sample-branch. Поскольку ваш Git теперь видит, что их Git имеет sample-branch, ваш Git создает ваш origin/sample-branch, чтобы запомнить это.

  2. Теперь, когда ваш Git имеет origin/sample-branch, ваш git push -u автоматически вызывает git branch --set-upstream-to=origin/sample-branch sample-branch.

Если вы по какой-то причине будете sh, чтобы сделать это старым двухшаговым способом, запустите:

git push origin sample-branch:sample-branch

(два имени, разделенные двоеточием, сообщают вашему Git, что им сказать Git). Затем, когда это удалось, выполните:

git branch --set-upstream-to=origin/sample-branch sample-branch

Очевидно, что одна команда git push -u короче и проще.

1 голос
/ 03 февраля 2020

Настройка восходящего пульта отличается от настройки восходящей ветви (которая является удаленной + имя удаленной ветви): ваш второй пульт вообще не нужен.
См. " Восходящий (в связи с) Отслеживание".

Попробуйте сначала:

 git push -u origin sample-branch

Затем git branch -avv: вы увидите свою ветку, связанную с удаленной.

A git push будет затем работайте для следующей публикации коммитов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...