2010-12-02 6 views
3

Я использую цель rebase. Это имеет смысл для меня. В принципе, у меня есть ветвь с функциями, над которой я работаю, и я готов поместить ее в основную ветку. Я бы сделал перестановку, чтобы вырезать все мои коммиты в один чистый, чтобы он легко интегрировался в master без всякого беспорядочного история. Правильно?Как управлять слиянием и переустановкой в ​​git?

Вот что мы делали.

  1. Создание функции филиала
  2. Добавить кучу фиксаций, как мы строим функцию
  3. Периодически сливаться мастер ветви в эту ветку (для того, чтобы избежать болезненного слияния вниз по дороге)
  4. Когда все будет сделано, слияние функции в мастер

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

Какой правильный рабочий процесс здесь? Где следующие commads вступают в игру:

  • мерзавца перебазироваться -i HEAD^#
  • мерзавец перебазироваться мастер
  • мастер мерзавец слияния
  • ГИТ-rerere
  • мерзавец сброса --hard ГОЛОВУ^

ответ

5

Вы должны сливаться только с/от мастера один раз, в конце жизни ветки. Идея ветки функции/темы заключается в том, что она содержит только изменения, относящиеся к этой функции; вы теряете это при повторном объединении в мастер. (Вы можете прочитать, что Junio Hamano, the git maintainer, says about branches.)

Вы можете сделать «практическое» слияние, которое вы выбросите, и использовать git-rerere, чтобы Git автоматически записывал ваши разрешения слияния, чтобы их можно было повторно использовать, когда вы действительно готовы к слиянию. См. http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html для фона и учебника. Это действительно здорово, потому что это позволяет вам выполнять работу слияния, не делая явно никаких явлений, а затем возвращать эту работу «волшебным образом», когда вы действительно готовы создать слияние. Таким образом, вместо одного большого мучительного слияния в конце вы можете сделать кучу меньших, надеюсь, более простых, промежуточных «практик» слияния на этом пути. Грубо говоря:

# Enable rerere 
git config --global rerere.enabled 1 
# Start a feature branch 
git checkout -b feature 
# Hack hack hack 
git commit 
git commit 
# Practice merge 
git merge master 
# ...then throw the merge commit away, the work is saved by rerere 
git reset --hard HEAD^ 
# Hack hack hack 
git commit 
# Really merge to master, reusing any saved work from rerere 
git checkout master 
git merge feature 
git branch -d feature 

Смотрите также http://progit.org/2010/03/08/rerere.html для другого учебника.

Вы также можете периодически переустанавливать ветку темы поверх мастера, а затем просто выполнять слияние в конце.

Чтобы справиться с ситуацией, подобной той, в которой вы сейчас находитесь, с веткой темы (например, с именем feature), которая имеет серию объединений от основного, смешанного с различными незавершенными сделками, самый простой способ - сделать сжимаемое слияние для создания «объединенного» рабочего дерева, а затем создать новый коммит (или ряд коммитов) на main.Например:

git checkout master 
git merge --squash feature 
git commit 

Это произведет один фиксацию, которая представляет состояние дерева во главе функции, объединено в мастер.

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

git checkout master 
git merge feature 

и двигаться дальше.

+0

Теперь я еще более смущен. Я никогда не слышал git-rerere. Я читаю справочную страницу, и это имеет смысл, но я теряюсь в том, как работать с ней. Таким образом, перезагрузка используется не только для комков сквоша, но и для перемещения вперед в направлении вперед? Я весьма озадачен. Каков фактический процесс, который я должен использовать здесь? Особенно для длинных ветвей. – Micah 2010-12-02 16:59:06

0

Если вы собираетесь переустанавливать ветку в любом случае, просто переустановите всякий раз, когда хотите «слить» изменения. Вам не нужно переставлять + сквош, пока вы не будете готовы «слить» при ветке в мастер.

+0

Это может быть много работа без rerere – 2010-12-02 20:35:29

+0

@adymitruk: Ну, все, что вам нужно сделать, это включить reerere. – mipadi 2010-12-02 20:40:22

3

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

Когда вы, наконец, готовы внести изменения в мастера, у вас есть два основных варианта:

  1. перебазироваться против мастера один последний раз, затем сделайте нормальный быстро вперед слияние, которое по существу приносит все ваша ветка переходит в мастера один за другим. Это сохраняет более подробную историю, но если промежуточные коммиты нарушают сборку, вы можете предпочесть их сквош. Интерактивная rebase (-i) может помочь организовать эти коммиты.

  2. Используйте merge --squash, чтобы сделать одно commit в master, которое содержит все изменения ветви.

0

Я считаю, короткий ответ:

использование git merge --squash если:

, если у вас есть ветвь функции, и вы тянете из другой ветви в этой отрасли, как вы работаете, например, вы переключаетесь периодически включать и запускать git merge master для объединения в основной ветке. Или вы тянете или подталкиваете эту ветку другим или к центральному репо, как github.

использование git rebase если:

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

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