Как я могу проверить версию HEAD моей удаленной / отслеживающей ветви - PullRequest
8 голосов
/ 01 октября 2009

В git, как я могу получить версию HEAD для моей удаленной / отслеживающей ветви? По сути, я хочу сделать svn checkout в git.

Я думаю, что самое близкое, что я нахожу, это "git fetch", но со страницы руководства я не знаю, как извлечь 1 конкретный файл, используя это?

Ответы [ 3 ]

16 голосов
/ 01 октября 2009

Во-первых, примечание: удаленное хранилище может иметь более одной ветви; также HEAD означает (для локальной разработки и локальных веток) текущую извлеченную ветвь, а для удаленной ветки удаленного отслеживания (символьная ссылка) remote/HEAD означает ветку по умолчанию на удаленной. Нет такой вещи, как «ГОЛОВА ветви»; HEAD - указатель на ветвь (или иногда на коммит).

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


В Git вы можете создавать новый коммит только поверх какой-то локальной ветки. Вы не можете создавать коммиты непосредственно в ветвях удаленного отслеживания, так как они предназначены для веток удаленного репозитория (и вы потеряете свою работу при получении).

Следовательно, простое «git checkout origin» (при условии, что пульт дистанционного управления называется origin), которое является сокращением для «git checkout origin/HEAD», которое обычно «git checkout origin/master», будет проверять состояние удаленного отслеживания ветвь в неназванную ветвь, так называемую отдельную ГОЛОВУ. Это хорошее решение, если вы хотите только просмотреть / просмотреть состояние ветки удаленного отслеживания.

Если вы используете «git checkout --track origin/master», это создаст локальную ветвь master, которая предназначена для отслеживания (отслеживания) ветки удаленного отслеживания origin/master. Обратите внимание, что git-clone автоматически устанавливает такую ​​локальную ветвь (обычно master) для ветки по умолчанию (origin/HEAD) удаленной origin (обычно origin/master), поэтому вам не придется этого делать. Затем просто «git pull», когда в ветке master будет извлекать (при необходимости), и попытаться объединить ваши локальные изменения с изменениями в соответствующей ветке в удаленном хранилище. Если бы не было никаких изменений в удаленном, это состояние «актуально», и ваша локальная ветвь не изменится; если в вашей локальной ветви не было никаких изменений, а были в удаленной, то локальная ветвь просто переводится в состояние удаленной ветки, которая называется «ускоренная перемотка вперед». Вы можете думать о "git pull" здесь как о очень, очень грубом эквиваленте "svn update".

Вы также можете принудительно перевести в локальном филиале в состояние удаленного отслеживания с помощью "git reset --hard origin". Обратите внимание, что --hard означает здесь принудительную перезапись рабочего каталога, поэтому любые несвязанные изменения будут потеряны! Используйте с осторожностью.

Наконец, если вы хотите извлекать отдельный файл из ветви удаленного отслеживания (то есть иметь в рабочем каталоге версию файла, как в ветви удаленного отслеживания), вы можете просто использовать 'pathspec 'git-checkout, а именно "git checkout origin -- file". Если вы хотите видеть только, как файл выглядит в ветке удаленного отслеживания, используйте "git show origin:path/to/file".

НТН

4 голосов
/ 01 октября 2009

Git не имеет понятия извлечения одного файла. Он всегда перемещает коммиты по сети.

После того, как вы сделали git clone какого-либо удаленного хранилища, вы можете git checkout remotename/branch, чтобы в вашей рабочей копии были извлечены последние версии файлов в этой ветке. Если вы хотите изменить их, вы должны git checkout -b <yourbranchname> remotename/branch запустить локальную ветку. Это может быть лучше сделано как

git branch --track mybranchname remotename/branchname
git checkout mybranchname

Так что ваша локальная ветвь будет «отслеживать» удаленную ветвь, и по умолчанию будет выталкивать и вытягивать из этой ветки.

0 голосов
/ 28 августа 2018

Иногда вы можете страдать от detached HEAD проблем:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits
you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you
create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at c3ff60a rename

Затем перечислите все ветви, вы увидите:

$ git branch -a
* (HEAD detached at origin/master)
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

Если вы хотите оформить ветку, на которую ссылаетсяremotes / origin / HEAD, то есть remotes/origin/HEAD -> origin/master, вы можете сделать:

HEAD_BRANCH="$(git branch -r | grep 'HEAD')"
HEAD_BRANCH="${HEAD_BRANCH#*origin/HEAD -> *origin/}"
git checkout "$HEAD_BRANCH"

, чтобы вы могли проверить "HEAD" версию удаленной / отслеживающей ветви

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