Git: Что происходит с веткой после основного сброса

#git #git-reset

#git #git-сброс

Вопрос:

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

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

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

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

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

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

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

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

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

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

  • Является ли мой подход к сохранению состояния в новой ветке и reset --hard главной ветке правильным способом достижения моей цели по возвращению моего форка в исходное состояние (фиксация B ) без объединения моих коммитов ( C и D )?

Комментарии:

1. коммиты являются неизменяемыми. Обычно вы увидите A-B-C-D изменение на A-B-C'-D' после перебазирования, чтобы отразить тот факт, что, хотя коммиты C и C' вносят одинаковые изменения в исходное дерево, это разные коммиты.

Ответ №1:

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

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

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

А также нет, ваши коммиты C и D не будут,, объединены в ваш вышестоящий,,, главный,, если вы будете следовать объявленному курсу действий. Дерзайте.

Ответ №2:

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

Ничего.

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

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

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

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

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

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

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


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

Ответ №3:

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