Я должен выполнить фиксацию после переосновы?

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

Переоснова автоматически сохраняется как фиксация где-нибудь?

Где те модификации живут? Я ничего не вижу в gitk, или git log --oneline.

(Тот же вопрос для того, когда я объединяю назад свое ответвление после перебазирования.)

7
задан Benjol 22 April 2010 в 09:33
поделиться

3 ответа

Rebase перемещает коммиты поверх другой ветки. Если перемещенная фиксация вызывает конфликт слияния, эта фиксация изменяется, чтобы отразить разрешение слияния.

Цель rebase - сделать так, чтобы ваши коммиты выглядели так, как если бы они были изменениями ветки, на которую вы выполняете перебазирование. Так что наиболее логичный способ - включить конфликты слияния в эти коммиты. Таким образом, никаких дополнительных коммитов не требуется.

Слияние отличается, потому что это явное действие по слиянию расходящихся ветвей. Никакие коммиты в каждой из веток не меняются. Разрешение конфликта отражается в фиксации слияния.

8
ответ дан 6 December 2019 в 14:02
поделиться

В старые времена (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)
2
ответ дан 6 December 2019 в 14:02
поделиться

Да, успешные перезагрузки и слияния приводят к фиксации. Они не будут совершать фиксацию только в том случае, если есть конфликты, которые необходимо разрешить, но тогда результаты перебазирования (или слияния) сообщат вам, что это произошло и как это разрешить.

Для перебазирования вам просто нужно разрешить конфликты в индексе, а затем git rebase --continue .

Для слияния вам нужно сделать фиксацию ( git commit ), но тот факт, что это слияние, будет запомнен, и вам будет предоставлено подходящее сообщение фиксации по умолчанию для редактирования.

5
ответ дан 6 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: