Git: Что происходит с веткой после общего сброса - PullRequest
6 голосов
/ 07 марта 2019

Предположим, у меня есть основная ветвь с некоторыми коммитами, которые я хочу сохранить для дальнейшей документации и ссылок, но удаляю их из мастера (потому что я хочу, чтобы мастер находился в том же состоянии, что и вышестоящее репо).

Мой подход теперь заключается в том, чтобы

  1. Создать новую ветвь из текущего мастер-состояния
  2. Сбросить (--hard) мастер в состояние, которое также присутствует в репозитории восходящего направления.

Теперь мой вопрос:

  • Что происходит с новой веткой при удалении ссылочного коммита из мастера?
  • Или я совершенно не прав?в понимании того, как на ветки ссылаются.

Часто ветви показываются следующим образом, где (насколько я понимаю) D является основой новой ветви.

A - B - C - D    (master)
             \
                 (new branch)

Ветка "перебазируется" автоматически или как бы вы ее назвали?Тогда это будет выглядеть так?

A - B         (master)
     \
      C - D   (new branch)

Последний и, возможно, самый общий вопрос:

  • Мой подход состоит в том, чтобы сохранить состояние в новой ветви и reset --hard в основной ветвиправильный путь для достижения моей цели - вернуть мой форк в верхнее состояние (commit B) без объединения моих коммитов (C и D)?

Ответы [ 3 ]

4 голосов
/ 07 марта 2019

Ничего не случится с веткой, так как ветка в git - это просто легкий, подвижный, одноразовый указатель. Коммиты являются реальными вещами.

Да, общий план хорош , создайте новую ветку, чтобы сохранить самые последние коммиты, сбросьте мастер на нужное место (Я полагаю origin/master), и эта ссылка на ваши коммиты C, D позволит им остаться навсегда .

Без создания ветки они в конечном итоге будут собирать мусор, даже если ониостанется на некоторое время в reflog .

А также нет, ваши коммиты C и D не будут объединены с вашим апстримом мастер, если вы будете следовать объявленному курсу действий.Перейти на это.

3 голосов
/ 07 марта 2019

Что происходит с новой веткой при удалении ссылочного коммита с мастера?

Ничего.

Ваш вопрос, кажется, основан на неправильном понимании того, что такое ветка. Ветвь - это тип ссылки - отличается от других ссылок только тем, что в git есть несколько соглашений о том, куда указывают ветви и как они перемещаются. Ссылка - это указатель на коммит [1].

Когда вы сбрасываете master, вы просто меняете указатель, который является master ref, так что он перестает указывать на D и начинает указывать на B. Это никак не влияет на указатель, который является new branch ref.

Коммиты C и D все еще существуют и не изменяются при сбросе master. Просто master больше не указывает на место, из которого они могут быть «достигнуты» (тогда как раньше можно было достичь D, потому что это то, на что указывало master, и C можно было бы достичь с помощью D родительский указатель).

Но new branch все еще указывает на D, поэтому он все еще может достигать C и D.

Так что new branch не перебазируется или что-то еще. Перебазирование - это переписывание и замена коммитов, потому что вы хотите внести те же изменения, что и они, относительно другой начальной точки. Это не происходит здесь. Это коммиты, которые перебазируются, и часто, когда перебазирование коммитов, реф отправляется в путь; но когда мы говорим «перебазировать ветку», это своего рода сокращение от «перебазировать некоторые коммиты, которые в настоящее время достижимы из ветки, а затем переместить ветку, чтобы указать на новые коммиты». Но здесь нам это не нужно; у нас все еще есть наши оригинальные коммиты.

Другая сторона «ветви - это просто указатель» - коммиты не являются «частью» какой-либо ветви. Они существуют независимо от каких-либо ветвей, которые могут ссылаться на них (хотя git gc в конечном итоге попытается избавиться от них, если думает, что никто не знает, как их найти). Говорят, что коммит, на который указывает ветка, и коммиты, которые могут быть достигнуты оттуда с помощью родительских указателей, составляют историю ветки ... но это так далеко, как отношения.

Итак, чтобы повторить и подвести итог - сброс master только перемещает указатель . Он не меняет коммитов и не влияет на другие ветви.


[1] Некоторые рефери могут иногда указывать на что-то иное, чем коммит, но это не слишком важно для этого обсуждения; tl; dr - ветвь является указателем на коммит и ничего более

1 голос
/ 07 марта 2019

Цепочки коммитов остаются активными, пока что-то указывает на них, или пока они не будут стерты с помощью git gc, и ваша диаграмма топологии до / после сброса верна.

...