Является ли мой стек стека нажатым на удаленное репо? Или это полностью игнорируется? Мне просто интересно, если я буду склонен к этому время от времени, чтобы отбросить часть, чтобы сэкономить место на сервере.
Ответ 2
Как правило, нет. Вы могли бы нажать его, если хотите.
Вот что касается push (и, если на то пошло, выборки): эти работы основаны на "refspecs", где вы называете локальное имя ссылки, или для push и конкретных случаев, raw commit-ID, а затем также имя удаленной ссылки.
Итак, что это за ссылочное имя?
В большинстве случаев вы указываете ссылку на ветку, например master
, или "удаленную ветвь", например origin/master
. Смутно, что git вызывает "удаленную ветвь", на самом деле является локальным объектом, а не веткой на удаленном компьютере, а скорее ветвью в вашем репозитории под специальным именем.
Ветвь действительно является ссылкой, имя которой начинается с refs/heads/
. Это действительно почти вся ветка. (Там есть еще одна особенность ветки: ветки автоматически перемещаются, когда вы вносите в них новые коммиты. То есть, если вы находитесь в ветке master
, и вы делаете новую фиксацию, git updates refs/heads/master
to point к новой фиксации.)
"Удаленная ветка" - это просто ссылка, имя которой начинается с refs/remotes/
, а затем содержит имя пульта (обычно origin
). Таким образом, refs/remotes/origin/master
- это "удаленная ветвь": локальный объект, имя в вашем репо, которое ваш git использует для отслеживания "где master
был включен origin
в последний раз git отмечен с помощью origin
". Всякий раз, когда вы выбираете или нажимаете от/до origin
, 1 git обновляет ваши имена origin/branch
в зависимости от того, что он видит "там".
Теги - это просто ссылки, начинающиеся с refs/tags/
.
Обычно вы оставляете все эти префиксы и просто пишете master
, чтобы означать, что ваша главная ветвь в refs/heads/master
, origin/master
означает refs/remotes/origin/master
, а v2.3
означает refs/tags/v2.3
. git определяет, какой из них автоматически, так как это очевидно. Точные правила описаны в gitrevisions. (Раздражающе, git checkout
и git branch
не всегда точно следуют правилам gitrevisions: когда они знают, что что-то означает название ветки, они просто принимают часть refs/heads/
. Другие команды git работают, как описано, хотя.)
stash
script использует ссылку, которая просто написана refs/stash
. Поэтому вы можете назвать эту ссылку, написав stash
; git обнаружит, что это не ветка, ни удаленная ветвь, ни тег, и, наконец, прибегают к использованию refs/stash
для разрешения имени. 2
... что означает, что?
Это означает, что если вы написали:
$ git push origin stash:ssss
git найдет ваш кошелек (только один сингл) и попытается нажать его на удаленную ссылку с именем ssss
. Это, скорее всего, потерпит неудачу; вот что случилось, когда я попробовал:
error: unable to push to unqualified destination: ssss
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'ssh://[redacted]/tmp/t'
Просто для удовольствия я попробовал следующую команду и получил другую ошибку:
$ git push origin stash:refs/ssss
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 485 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: error: refusing to create funny ref 'refs/ssss' remotely
To ssh://[redacted]/tmp/t
! [remote rejected] stash -> refs/ssss (funny refname)
error: failed to push some refs to 'ssh://[redacted]/tmp/t'
Однако это сработало:
$ git push origin stash:refs/heads/ssss
На этот раз он создал новую ветку на пульте, названную ssss
. Он также будет работать с удаленным тегом (refs/tags/tagname
).
Кошелек не имеет особого смысла ни в ветке, ни в теге, но вы можете нажимать ее так, как если бы она была. Все удаленные пользователи знают, как только вы попробуете это, это то, что вы отправляете некоторый объект фиксации и связанные с ними деревья, капли и т.д., И что он должен хранить фиксацию "tip-most" под (полным) именем вы поставляете. 3 Вот почему вы можете нажать raw commit-ID, например, создать тег на пульте дистанционного управления:
$ git push af7ec93:refs/tags/foo
(предполагается, что коммит, чей идентификатор начинается с af7ec93
, конечно).
Еще одно примечание о "стеке стека"
"Стек" создается с помощью reflog для ссылки refs/stash
. Когда вы пишете [email protected]{1}
, для разрешения commit-ID используется тот же gitrevisions. Поскольку git push
позволяет использовать все, что разрешает действительный идентификатор, вы также можете нажать их на удаленные имена. Но вы, вероятно, не должны; точно так же, как самый верхний элемент stash под refs/stash
, они не имеют большого смысла, поскольку регулярные коммиты. (Stashes хранятся внутри, поскольку коммиты фиксируются, но их содержимое нечетно упаковано, и попытка использовать их как обычные коммиты дает не очень полезные результаты.)
1 Это буквально верно в git с 1.8.2 или около того; но более старые версии git иногда пропускают обновление удаленной ветки при извлечении, особенно когда git fetch
вызывается git pull
.
2 Если вы обратитесь к gitrevisions, вы увидите, что это также не совсем точно: найдет stash
как refs/stash
перед поиском имени ветки.
3git push
обычно автоматически создает полное имя: если вы нажимаете master
master
, который является refs/heads/master
, он знает, что это ветка, поэтому git push master:newbranch
создает refs/heads/newbranch
на пульте дистанционного управления. Однако вы можете указать полное имя, например, для создания тега на удаленном компьютере. Это также работает для операций удаления, когда вы нажимаете пустую локальную ссылку, чтобы удалить удаленный-ref: git push :refs/tags/delete_me
, например.
Как bcmcfc уже сказал, сохранение большой кучи закладок имеет тенденцию быть плохой идеей. Вместо этого я держу большую кучу ветвей (которые я избегаю нажатия, если я действительно не хочу сохранять их на каком-то дистанционном (ых)); у них есть имена, и, следовательно, они немного более управляемы (но только немного). Нет никакой разницы в эффективности, так как пристыды и ветки просто служат для того, чтобы содержать коммиты - либо комманды специального заклада, либо обычные коммиты. Однако вы можете убедиться, что ваш push.default
настроен на то, чтобы не нажимать все ваши ветки, если вы используете ветки вместо stashes.