2015-10-27 6 views
4

Каждый раз, когда я пробовал rebase, я был вовлечен в бесконечный цикл неразрешимых конфликтов. Перед разрешением конфликта x возник конфликт, а затем x конфликт снова и так далее.Git - Можете ли вы сделать что-то с rebase, которое вы не можете сделать слиянием?

Дело в том, что (по-видимому) merge, или даже cherry-pick, обеспечивают ту же функциональность, что и вы, от rebase, не так ли? Если нет, то какая польза от rebase?

ответ

4

rebase переписывается история. Это путь более merge или cherry-pick - очень продвинутый инструмент, который берет на себя (и может быть опасным, так как он перезаписывает историю ... будьте осторожны с git push -f). Когда rebase используется аналогично merge, процесс довольно отчетливо отличается.

git fetch origin && git merge origin/master:

  • загрузить изменения от происхождения
  • слияния изменений в верхней части местного отделения
  • разрешения конфликтов и совершать

git fetch origin && git rebase origin/master:

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

большим преимуществом rebase в этой ситуации является то, что вы просто обновить свой локальный репозиторий и применяя ваши коммиты на вершине, и там не будет никаких «валовые» Объединить совершить говоря: «эй, я просто объединил этот материал». Недостатком является то, что если у вас есть тонна коммитов, которые изменяют одни и те же файлы, вам придется разрешать конфликт снова и снова, так как нет «грубой» слияния.

Но опять же rebase - это действительно продвинутый инструмент, предназначенный для перезаписи истории. Вы можете изменить предыдущие заголовки фиксации, удалить фиксации в прошлом, сквонировать много коммитов вместе и т. Д. Read up on it!

+0

Итак, переписывая историю так «свободно», вы теряете отслеживаемость, не так ли? – Julen

+1

Это достойный способ подвести итог, @ Юлен. – Sam

2

Я использую rebase только в одном случае. Корпус:

  1. У меня есть master ветка с текущей версией приложения.
  2. создать feature-branch для новой функции
  3. я сделать несколько коммитов в feature-branch
  4. я сделать несколько горячих фиксации в главной ветви
  5. Теперь я хочу иметь, что совершает в feature-branch и I сделать rebase в этом случае.
  6. Я сделал с feature-branch, и я просто объединить его в мастер.

    git checkout master 
    git checkout feature-branch 
    git commit -am "feature commit #1" 
    git commit -am "feature commit #2" 
    git commit -am "feature commit #3" 
    git checkout master 
    git commit -am "hot fix" 
    git checkout feature-branch 
    git rebase master 
    git commit -am "i'm done" 
    git checkout master 
    git merge feature-branch 
    

Это позволяет мне быть на вершине master ветви и имеют историю чистой GIT.

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