Git: получить отделенную ГОЛОВУ от удаленного - PullRequest
0 голосов
/ 08 октября 2018

Я извлекаю конкретный коммит (и, следовательно, оказываюсь в отключенном состоянии HEAD), а затем делаю несколько коммитов поверх него.Допустим, я сделал это в репозитории A. Предположим также, что у меня есть другой репозиторий B, в котором A является одним из его пультов.Теперь, в B, как я могу получить отдельную ГОЛОВКУ A без создания новой ветви в A?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Когда ElpieKay ответил в комментарии , используйте git fetch <em>remote</em> HEAD, который сохраняет идентификатор хэша выбранной фиксации в специальном файле FETCH_HEAD.Затем вы можете использовать FETCH_HEAD в качестве ссылки, пока следующая git fetch не перезапишет его.

Обсуждение

Операции извлечения и выталкивания работают с именами, но они не симметричны.

Они симметричны , когда речь идет о передаче коммитов .То есть, независимо от того, запускаете ли вы git fetch <em>remote</em> [<em>refspec...</em>] или git push <em>remote</em> [<em>refspec...</em>], отправляющая и получающая системы Git ведут диалог с использованием хеш-идентификаторов объектов, в котором отправитель объявляет, какие хеш-идентификаторы отправитель хотел бы передать получателю: для вас , и получатель отправляет обратно ответы, в которых говорится, что отправитель должен отправить это, или - если получатель уже имеет этот объект - не отправлять его.(Это немного сложнее, чем это, поскольку приемник-получатель запускает процесс с первыми «желаниями», но достаточно близко.)

Когда это будет сделано, операция push имеетотправитель отправить через серию рекомендуемыхпары: Пожалуйста, установите refs/heads/master на a123456..., например.Это означает, что если вы делаете git push пока вы находитесь в отдельном HEAD в вашем хранилище, вам все равно придется дать other Git имя для этого коммита: *Например, 1035 *

git push origin HEAD:refs/heads/somebranch

достаточно, чтобы ваш Git отправил хэш-идентификатор для вашего HEAD коммита, но рекомендую, чтобы его Git установил их refs/heads/somebranch на , чтобыID хеша, когда закончите.Вы не можете попросить их установить HEAD: если вы попытаетесь, они просто создадут ветку с именем HEAD, то есть refs/head/HEAD, если вы сейчас находитесь на ветке или отклонитеваш push-запрос, если нет:

error: unable to push to unqualified destination: HEAD

С другой стороны, когда вы запускаете git fetch, , вы контролируете, какие ссылки, если они есть, обновляются с вашей стороны.Их Git просто отправляет список всех их ссылок (во всяком случае, в протоколе v0; v2 более привлекательный).Ваш Git выбирает список, и, если они отправили вам новые хэш-идентификаторы для своих refs/heads/master и refs/heads/branch, ваш Git, как правило, обновит ваши собственные refs/remotes/origin/master и refs/remotes/origin/branch.Ваш Git берет список их ссылок, генерирует список желаемых хеш-идентификаторов вашей стороны и передает его отправителю, чтобы начать разговор по хеш-идентификатору has / want.

То есть, это то, что ваш Gitделает, если вы запускаете git fetch origin, с без добавленных refspec аргументов и предполагая, что ваша конфигурация нормальная (не особая конфигурация, оставленная, например, для клона --single-branch),Но если вы do добавляете аргументы refspec, например:

git fetch origin refs/heads/master:refs/weird/name

, тогда ваш Git просит свой Git отправлять только те коммиты, которые вам нужны для работы с их master.То есть разговор «иметь / хочу» начинается с только хеш-идентификатора в их refs/heads/master (и даже тогда, только если у вас его еще нет).Когда все имеют / хотят, и объекты поступили в ваш репозиторий, ваш Git затем создает или обновляет вашу ссылку refs/weird/name.

Помните, что эти ссылки имеют общую форму <em>src</em>:*dst.Часть src - это ссылка на источник - имя или хэш-идентификатор, который отправитель использует для поиска фиксации, а часть dst - это адрес назначения , который получатель должен использовать для запоминания хеш-идентификатора в конце.Вы можете опустить одно из двух значений, написав src или :<em>dst</em>, что имеет различные значения в особых случаях в зависимости от push vs fetch.Работает ли необработанный хэш-идентификатор в части src этого выражения, зависит от двух вещей:

  • , если вы делаете push, оно всегда работает (до тех пор, покапоскольку объект существует);
  • , если вы делаете fetch, он работает тогда и только тогда, когда они позволяют это.

(Итак, здесь мы уже видим эту выборку итолчок асимметричен.)

Фоr git fetch, если вы пропустите часть :<em>dst</em> в refspec - например, git fetch origin refs/heads/master или git fetch origin master - ваш Git пропускает часть создания или обновления, за исключением так называемых условных обновлений (создание или обновление refs/remotes/origin/master, в данном случае).Однако для каждого имени, которое вы получили git fetch, ваш Git всегда пишет, чтосвязать с вашим FETCH_HEAD файлом:

$ git fetch origin HEAD master
From ...
 * branch                  HEAD       -> FETCH_HEAD
 * branch                  master     -> FETCH_HEAD
$ cat .git/FETCH_HEAD
f84b9b09d40408cf91bbc500d9f190a7866c3e0f        <url>
f84b9b09d40408cf91bbc500d9f190a7866c3e0f        branch 'master' of <url>

(Обратите внимание, что хотя git fetch получил много ветвей и тегов в списке пар имя / идентификатор из origin, мы только спросили для HEAD и master, так вот что git fetch записало в .git/FETCH_HEAD.)

Заключение

Если вы отправляете коммиты, вы должен предоставить имя для другого Git.Обычно подразумевается имя: вы нажимаете свою ветку bran, поэтому имя, которое вы хотите их установить, равно их ветка bran.Вы можете толкнуть любой объект: после получения объекта его Git решает, принимать лиспаривание.Обычно вы будете выдвигать объект коммита, который будет перетаскивать вместе с ним все остальные необходимые объекты, и вам будет предложено установить имя ветви.

Если вы получаете коммитытем не менее, вам не нужно указывать имя на вашей стороне .Их Git отправит их имена и объекты, а ваш Git будет использовать ваш файл .git/FETCH_HEAD для запоминания хеш-идентификаторов, которые вы получили от них.Если вы предоставляете имена на своей стороне, ваш Git обновит эти имена, а если вы этого не сделаете, у Git есть несколько сложных правил выборки по умолчанию, чтобы запомнить их имена ветвей через refs/remotes/<em>remote</em>/ names.

ХотяHEAD само по себе не является ответвлением name, оно является действительным name .Возможно, вы не сможете заставить их обновить свои отключенные HEAD (через push), но вы обычно можете попросить их отправить вам хеш коммита, сохраненный в их отключенных HEAD, что ваш Git будетпомните как "неназванный" в вашем .git/FETCH_HEAD.

0 голосов
/ 08 октября 2018

Я думаю, вы не можете просто толкнуть оторванную голову.Если вы хотите увидеть эти изменения в B, вы должны вставить коммиты где-то в A. Либо в новую ветку, либо в существующую.Поскольку вы не хотите создавать новую ветку в A, я предполагаю, что вы поместили коммиты в исходную ветку.Следовательно, вы можете получить к ним доступ простым нажатием.

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

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