Я только что повторно основывал ответвление функции на другое ответвление функции (при подготовке к перебазированию всего к голове моего ведущего устройства), и это включило довольно много хитрых разрешений слияния.
Переоснова автоматически сохраняется как фиксация где-нибудь?
Где те модификации живут? Я ничего не вижу в gitk, или git log --oneline
.
(Тот же вопрос для того, когда я объединяю назад свое ответвление после перебазирования.)
Rebase перемещает коммиты поверх другой ветки. Если перемещенная фиксация вызывает конфликт слияния, эта фиксация изменяется, чтобы отразить разрешение слияния.
Цель rebase - сделать так, чтобы ваши коммиты выглядели так, как если бы они были изменениями ветки, на которую вы выполняете перебазирование. Так что наиболее логичный способ - включить конфликты слияния в эти коммиты. Таким образом, никаких дополнительных коммитов не требуется.
Слияние отличается, потому что это явное действие по слиянию расходящихся ветвей. Никакие коммиты в каждой из веток не меняются. Разрешение конфликта отражается в фиксации слияния.
В старые времена (2006, до 1.5.3 и его руководство пользователя ), git rebase
представлялся так :
Особый случай выбора вишни - это если вы хотите переместить всю ветку в более новую «базовую» фиксацию.
Это делается с помощьюgit-rebase
.
Вы указываете ветку, которую нужно переместить (по умолчаниюHEAD
) и куда ее переместить (не по умолчанию), и:
git cherry-picks
каждый патч из этой ветки,- применяет его поверх целевого объекта,
- и перемещает указатель
refs / Heads /
на вновь созданные коммиты.
Таким образом, по определению, коммиты будут выполняться (и никаких коммитов делать не нужно)
Особый случай перебазирования - это когда вы хотите разделить свою работу, перемещая (и воссоздавая новые) коммиты.
Из того же руководства (в качестве иллюстрации того, что дальнейшая фиксация не требуется после перебазирования):
Предположим, вы смешали разработку двух функций в текущем HEAD, ветке под названием "dev ".
x-x-x-x (master)
\
-f1a-f1b-f1c-f2a-f2b-f2c (dev, HEAD)
Вы хотите разделить их на «dev1» и «dev2». Предполагая, что
HEAD
является мастером ответвления, тогда вы можете либо просмотреть
git log master..HEAD
, либо просто получить необработанный список коммитов с помощью
git rev-list master..HEAD
. В любом случае, предположим, вы составили список коммитов, которые вы хотите в
dev1
и создайте эту ветку:
git checkout -b dev1 master
for i in `cat commit_list`; do
git-cherry-pick $i
done
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f1a-f1b-f1c-f2a-f2b-f2c (dev)
Вы можете использовать другую половину списка, который вы отредактировали, для создания ветки
dev2
, но если вы не уверены, что забыли что-то, или просто не хочется выполнять эту ручную работу, тогда вы можете использовать git-rebase, чтобы сделать это за вас.
git checkout -b dev2 dev # Create dev2 branch
git-rebase --onto master dev1 # Subreact dev1 and rebase
Это найдет все исправления, которые есть в
dev
, а не вdev1
, применит их поверх мастера и вызовет результатdev2
.
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f2a-f2b-f2c (dev2, HEAD)
Да, успешные перезагрузки и слияния приводят к фиксации. Они не будут совершать фиксацию только в том случае, если есть конфликты, которые необходимо разрешить, но тогда результаты перебазирования (или слияния) сообщат вам, что это произошло и как это разрешить.
Для перебазирования вам просто нужно разрешить конфликты в индексе, а затем git rebase --continue
.
Для слияния вам нужно сделать фиксацию ( git commit
), но тот факт, что это слияние, будет запомнен, и вам будет предоставлено подходящее сообщение фиксации по умолчанию для редактирования.