Информация об изменениях

Сообщение Re: Git: спрятанные головы? от 19.12.2014 13:40

Изменено 19.12.2014 13:55 ·

Здравствуйте, Bluebarry, Вы писали:

B>С Меркуриалом я давно знаком, сейчас разбираюсь с git.


B>Создаю репозиторий А, делаю в нем пару коммитов, клонирую его в Б (все локально), и делаю еще один коммит в Б. Затем возвращаюсь в А и делаю fetch из Б. По идее, при этом последний коммит должен перетечь в А. Судя по отчету fetch, так оно и есть. Но в истории А этот новый коммит не виден — только два первоначальных. Пробовал всякие опции git log: --all, --branches — не помогает. Пробовал гляделки типа gitk, tortoise — все равно не видно.


B>Покурил доки. Узнал, что при фетче формируется новая голова FETCH_HEAD, которая и указывает на свежеполученные коммиты. Но git log ее не показывает, ее показывает только git log FETCH_HEAD.


B>Как-то это странно. В репозитории выросла новая ветка, но увидеть ее не так-то просто. Чтобы увидеть скрытую ветку, я должен знать ее название?!

B>Может все-таки есть какой-нибудь git log --very_all, который покажет все имеющиеся в репозитории коммиты, ветки, головы? А как увидеть это в GUI-утилитах?
Когда делаешь fetch, в ответ тебе git пишет всё что скачалось и _куда_. Если делаешь fetch одной ветки (git fetch <url-to-repo-b> <branch_name>), то скачивается в FETCH_HEAD, если "<branch_name>" опустить, команда будет выкачивать текущий бранч удалённого репозитория. Если ты добавишь репо как удалённый (git remote add b <url-to-repo-b>), то "git fetch b" скачает все бранчи в отдельное место (refs/remotes/b/*), не пересекающееся с твоими локальными бранчами (refs/heads/*). Что вполне логично — ведь, скажем, твой локальный бранч expermient может не иметь ничего общего с удалённым b/experiment, имя просто случайно совпало.
Т.е. простое скачивание (fetch) данных из удалённого репозитория никогда ничего твоего локального не изменяет.
Ты можешь посмотреть разницу коммитов — что есть там, но нет у тебя (git log HEAD..FETCH_HEAD), либо что есть у тебя, но нет там (git log FETCH_HEAD..HEAD).
Далее. Если ты хочешь удалённое замержить к себе в текущую ветку — делаешь, как ни странно, git merge FETCH_HEAD или git merge refs/remotes/b/master (обычно для юзабельности полное имя "refs/remotes/b/master" можно сократить до "b/master").
В общем-то, если подумать, то в git реализованно управление ветками как это должно быть реализовано в Distributed VCS, а в hg — какая-то хрень непонятная, полу-централизованная.
Re: Git: спрятанные головы?
Здравствуйте, Bluebarry, Вы писали:

B>С Меркуриалом я давно знаком, сейчас разбираюсь с git.


B>Создаю репозиторий А, делаю в нем пару коммитов, клонирую его в Б (все локально), и делаю еще один коммит в Б. Затем возвращаюсь в А и делаю fetch из Б. По идее, при этом последний коммит должен перетечь в А. Судя по отчету fetch, так оно и есть. Но в истории А этот новый коммит не виден — только два первоначальных. Пробовал всякие опции git log: --all, --branches — не помогает. Пробовал гляделки типа gitk, tortoise — все равно не видно.

Как я понял твой отчёт выглядел так:
kan@snake test]$ git fetch /path/to/repo/b
From /path/to/repo/b
 * branch            HEAD       -> FETCH_HEAD

B>Покурил доки. Узнал, что при фетче формируется новая голова FETCH_HEAD, которая и указывает на свежеполученные коммиты. Но git log ее не показывает, ее показывает только git log FETCH_HEAD.

B>Как-то это странно. В репозитории выросла новая ветка, но увидеть ее не так-то просто. Чтобы увидеть скрытую ветку, я должен знать ее название?!

Ничего скрытого, надо просто было повнимательнее смотреть на то, что тебе git пишет в ответ.

B>Может все-таки есть какой-нибудь git log --very_all, который покажет все имеющиеся в репозитории коммиты, ветки, головы? А как увидеть это в GUI-утилитах?

Когда делаешь fetch, в ответ тебе git пишет всё что скачалось и _куда_. Если делаешь fetch одной ветки (git fetch <url-to-repo-b> <repo's_b_branch_name>), то скачивается в FETCH_HEAD, если "<epo's_b_branch_name>" опустить, команда будет выкачивать текущий бранч (HEAD) удалённого репозитория (это ты и сделал). Если ты добавишь репо как удалённый (git remote add b <url-to-repo-b>), то "git fetch b" скачает все бранчи в отдельное место (refs/remotes/b/*), не пересекающееся с твоими локальными бранчами (refs/heads/*). Что вполне логично — ведь, скажем, твой локальный бранч expermient может не иметь ничего общего с удалённым b/experiment, имя просто случайно совпало.
Т.е. простое скачивание (fetch) данных из удалённого репозитория никогда ничего твоего локального не изменяет.
Ты можешь посмотреть разницу коммитов — что есть там, но нет у тебя (git log HEAD..FETCH_HEAD), либо что есть у тебя, но нет там (git log FETCH_HEAD..HEAD).
Далее. Если ты хочешь удалённое замержить к себе в текущую ветку — делаешь, как ни странно, git merge FETCH_HEAD или git merge refs/remotes/b/master (обычно для юзабельности полное имя "refs/remotes/b/master" можно сократить до "b/master").
В общем-то, если подумать, то в git реализованно управление ветками как это должно быть реализовано в Distributed VCS, а в hg — какая-то хрень непонятная, полу-централизованная.