И так повторим ребейс:
Вот в чем суть: допустим у нас есть две бранчи master и unicorns. unicorns создана из мастера. И ее судьба состоит в том, что по завершении работы в ней она будет влита обратно в мастера.
Но допустим пока мы вели разработку в уникорне в мастер были закомичены новые комиты, а делать мердж и портить нам и стории ни к чему -- потому что нам потом не нужно знать в итории, что мы создавали отдельную ветку и ее ливали. Для этого есть стратегия поместить новые комиты мастера перед новыми комитами юникорна, так у нас появлется ровная история а не смерджденная.
Делается это так:
1) Мы как и вели, ведем разработку в ветке unicorns.
2) делаем $ git rebase master
происходит следующее:
1. все комиты из unicorns заносятся в некий бранч temp(temp area)
2. новые комиты мастера переносятся вперед старых.
3. сразу за ними возращаются из temp комиты самого unicorns.
Теперь юникорн можно смело мерджить в масетер и мы получим ровную небугристую историю.
i - interective mode
Получаем открытый редактор со следующим текстом. Обратить внимание тут нужно на то, что порядок комитов находится от старших к младшим, что противоположно тому, как выводятся коммиты при git log.
Когда мы запускаем интеректив режим, все изменения до указанного коммита( в нашем случае HEAD~3), заносятся в temp area. Если мы все запускаем без изменений, то они в том же порядке записуются обратно в бранч.
pick 9629e9b Add capybaras to index.
pick 21e37b1 Add capybaras page.
reword eb7d5a0 Correct commit message
Ну и теперь мы сначала стейджим первый файл и коммитим:
$ git add capybara.html
$ git commit -m "Change plural on detail page to 'capybara'."
[detached HEAD 6e8e5d6] Change plural on detail page to 'capybara'.
1 file changed, 1 insertion(+), 1 deletion(-)
А теперь второй, и получаем два отдельных коммита
$ git add index.html
$ git commit -m "Change plural on index page to 'capybara'"
Вот в чем суть: допустим у нас есть две бранчи master и unicorns. unicorns создана из мастера. И ее судьба состоит в том, что по завершении работы в ней она будет влита обратно в мастера.
Но допустим пока мы вели разработку в уникорне в мастер были закомичены новые комиты, а делать мердж и портить нам и стории ни к чему -- потому что нам потом не нужно знать в итории, что мы создавали отдельную ветку и ее ливали. Для этого есть стратегия поместить новые комиты мастера перед новыми комитами юникорна, так у нас появлется ровная история а не смерджденная.
Делается это так:
1) Мы как и вели, ведем разработку в ветке unicorns.
2) делаем $ git rebase master
происходит следующее:
1. все комиты из unicorns заносятся в некий бранч temp(temp area)
2. новые комиты мастера переносятся вперед старых.
3. сразу за ними возращаются из temp комиты самого unicorns.
Теперь юникорн можно смело мерджить в масетер и мы получим ровную небугристую историю.
Изменение уже сделанных коммитов
$ git rebase -i HEAD~3i - interective mode
Получаем открытый редактор со следующим текстом. Обратить внимание тут нужно на то, что порядок комитов находится от старших к младшим, что противоположно тому, как выводятся коммиты при git log.
pick 9629e9b Add capybaras to index. pick 21e37b1 Add capybaras page. pick eb7d5a0 Actually, the plural is 'capybara'. # Rebase 42022447..eb7d5a0 onto 4202447 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commmit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell
Когда мы запускаем интеректив режим, все изменения до указанного коммита( в нашем случае HEAD~3), заносятся в temp area. Если мы все запускаем без изменений, то они в том же порядке записуются обратно в бранч.
Поменять порядок комитов
Если мы поменяем в открывшемся редакторе порядок коммитов, то именно так они и перезапишутся из temp area обратно в бранч.
Поменять коментарий коммита
В редакторе изменяем возле нужно коммита ключевое слово pick на reword, а после хеша коммита вводим правильный комментарий, далее выполняем сохранение в редакторе и вураля комит перезаписался с правильным мессиджем.
pick 21e37b1 Add capybaras page.
reword eb7d5a0 Correct commit message
Раздробить коммит на несколько отдельных
Этот фокус ложится на плечи ключевому слову edit.
pick 21e37b1 Add capybaras page.
pick 9629e9b Add capybaras to index.
edit 39b23ce Change plural on index and details pages to 'capybara'
pick 21e37b1 Add capybaras page.
pick 9629e9b Add capybaras to index.
edit 39b23ce Change plural on index and details pages to 'capybara'
Edit перезаписывает изменения, но останавливается без комита. Перед нами возникает новое окно текстового редактора, но в нем появляется командная оболочка.
Stopped at 39b23ce... Change plural on index and details pages to 'capybara'.
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
$
Тут элементарная правка состоит в том, чтобы как я понимаю изменить мессидж первой командой и продолжить ребейсинг второй.
Но наша задача раздробить этот коммит в данном примере на две части. Как это сделать? Сейчас каретка стоит на интересующем нас коммите, тем более этот коммит уже закомичен. А как мы можем отредактировать последний комми? Конечно же вернуть в стейджинг эрию сделанные попровки:
$ git reset HEAD^
Unstaged changes after reset:
M capybara.html
M index.html
Ну и теперь мы сначала стейджим первый файл и коммитим:
$ git add capybara.html
$ git commit -m "Change plural on detail page to 'capybara'."
[detached HEAD 6e8e5d6] Change plural on detail page to 'capybara'.
1 file changed, 1 insertion(+), 1 deletion(-)
А теперь второй, и получаем два отдельных коммита
$ git add index.html
$ git commit -m "Change plural on index page to 'capybara'"
[detached HEAD e8005f4] Change plural on index page to 'capybara'.
1 file changed, 1 insertion(+), 1 deletion(-)
1 file changed, 1 insertion(+), 1 deletion(-)
Теперь мы продолжаем перезапись из темповой эриа:
$ git rebase --continue
Successfully rebased and updated refs/heads/master.
Обьединить несколько коммитов в один(сквошинг)
"squash" обьединяет(мерджит) указанный коммит с предыдущим коммитом
Нам показывается окно редактора с пометкой первого и второго сообщения коммитов, и предложением ввести новый мессидж, которым будет подписан обьединенный коммит.
Комментариев нет:
Отправить комментарий