Ребазирование

Предположим вы создаете ветку "mywork" на удаленной-отслеживаемой ветке "origin".

$ git checkout -b mywork origin

Терерь вы проделываете некоторую работу, создающую два новых коммита.

$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit
...

Тем временем, некто еще проделываает некоторую работу создающую два новых коммита в ветке origin. Это означает обе 'origin' и 'mywork' продивинулись вперед, что означает что ветки отклонились друг от друга.

В этот момент, вы можете выполнить "pull" чтобы слить ваши изменения обратно, в результате отразуется новый слитый коммит, след. образом:

Тем не менее, если вы предпочитаете держить историю в mywork как простую серию коммитов без каких либо слияний, вы можете вместо этого использовать git rebase:

$ git checkout mywork
$ git rebase origin

Это удалит каждый ваш коммит из mywork, временно сохранив их как патчи (в директории под именем ".git/rebase"), и обновит mywork до точки в последнней версии origin, затем применит каждый сохраненный ранее патч с новому mywork.

Как только ссылка ('mywork') обновлена и указывает на новые созданные коммит объекты, ваши ранние коммиты будут отменены. Они будут скорее всего удалены если вы выполните сборку мусора. (просмотрите git gc)

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

В процессе ребазирования, возможно обнаружатся конфликты. В этом случае он остановится и позволит вам устранить конфликты; после чего, выполните "git-add" чтобы обновить индекс этого содержимого, и затем, вместо выполнения git-commit, просто запустите

$ git rebase --continue

и git продолжит налагать оставшиеся патчи.

В любой момент вы можете использовать параметр --abort чтобы оборвать этот процесс и вернуть mywork к тому состоянию в котором она была до того как вы начали процесс ребазирования:

$ git rebase --abort

gitcast:c7-rebase



github logo