2013-11-15 4 views
0

Я стараюсь, чтобы я не испортил большую ветвь функций, над которой я работал. У меня есть два пультов ДУ:Git ветвление от другого филиала

origin - with branch dev 
my - a fork of origin, with my branch dev 

Таким образом, рабочий процесс является извлечение происхождения, тянуть в моем происхождении разработчика, ветвь от того, толкать вверх, и объединить филиалы в происхождении разработчика:

# On my dev 
git fetch origin 
... received new stuff... 
git pull origin dev 

Я имел функция, которая зависела от не объединенной другой функции ветки. Итак, я сделал это:

# On my dev 
git checkout -b first-feature 
git checkout -b second-feature-based-on-first-feature 

здесь, я следовал наш нормальный рабочий процесс, в котором, когда происхождение DEV обновляется, мы Rebase нашу ветвь на том, что:

git checkout first-feature 
git pull --rebase origin dev 
git push my first-feature -f 

И тогда я бы тянуть, что первый филиал под моей второй ветви:

git checkout second-feature-based-on-first-feature 
git pull --rebase my first-feature 
git push my second-feature-based-on-first-feature -f 

Сегодня первая-функция была объединена в происхождении разработчика. Я ожидал, что запрос gitub на второй вызов будет показан во второй части, который показал две коммиты (первая функция и вторая функция), чтобы в основном сейчас показывать вторую функцию. Но это не так. Я переустановил вторую функцию на исходном dev, и, хотя все кажется мне хорошо, я беспокоюсь об этом. Я просто заставляю нажать вторую функцию?

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

ответ

1

Я думаю, что проблема, которую вы видите, является побочным эффектом переписывания истории.

Когда вы перебазироваться, он на самом деле изменения фиксации окрошка

Хэш фиксации зависит от:

  1. древо этой фиксации (т.е. текущее состояние ваших источников)
  2. Хеши любых родителей фиксации
  3. метаданные совершения (дата автора, автор, дата фиксации, коммиттер, сообщение фиксации и т. Д.)

source

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

1) -- A 
     \ -- B 
      \ -- C 
After rebase origin/dev 
2) -- A -- B' 
    -- A -- B 
      \ -- C 
Rebase with first-feature 
3) -- A' -- B' -- B -- C' 

По крайней мере, это то, что из-за вашего потока вы описали. Надеюсь, это поможет!

+0

Итак, когда я заменил первую функцию на dev, а затем вторую функцию на первой функции, а затем первую функцию был объединен в dev, первая функция под второй функцией имеет другой commit-hash, чем то, что был объединен в источник происхождения? (Это смущает). Существуют ли какие-либо проблемы с переустановкой второй функции по происхождению и нажатием на нее? Сможет ли оно слиться с происхождением? Это кажется, как будто это сработает. TBH. Я не очень доволен потоком здесь и все сбрасыванием, но тогда я еще не очень хорош с git. Кажется, идет против того, что больше всего говорят (не перебазируйте). – d3vkit

+0

Точнее, rebase делает * копию * (или многих) предыдущих коммитов, но поскольку в копиях есть хотя бы одна вещь, которая изменилась, как правило, идентификатор родительского кода - они, по меньшей мере, тонко отличаются, поэтому они обязательно имеют разные «истинные имена» "(Значения SHA-1). * * Старая * копия коммита все еще присутствует в репо, и любые коммиты, сходящие со старой фиксации, все еще сходят с старого коммита. (И, @ d3vkit, да: вот почему люди избегают безудержной переустановки. Очень * выборочно * rebasing в порядке. :-)) – torek

+0

git - очень большой сундук для инструментов, и у него есть инструмент практически для всего, что вам нужно. делать с управлением кодом. Rebasing - отличный инструмент в правильном контексте. Обычно я делаю это правило не переустанавливать с опубликованными ветвями и только переустанавливать свои локальные ветви. Но чтобы ответить на ваш вопрос, должно быть хорошо переустановить вашу вторую функцию с помощью источника. Действия Git всегда могут быть отменены и отменены, если они не работают. – sparrow

Смежные вопросы