-
Notifications
You must be signed in to change notification settings - Fork 0
Rebase
Все ветки git
имеют начало - ветка может стартовать от какого-то коммита master
, а может из коммита любой другой ветки. В любом случае есть стартовый "базовый" коммит.
Что делать, если вы стартовали/базировались с одного коммита, а пока работали, ветка, с которой вы "базировались", ушла дальше - появились в ней новые коммиты, напр. другие ПР были вмержены? Есть два пути:
- мерж
- ребейз
Из сравнения видно, что merge
создает дополнительный коммит мержа, а так же делает картину метро в истории коммитов. Поэтому предпочтение отдается rebase
- лишних коммитов нет, история коммитов линейная и красивая.
Ребейз, как следует из названия - это операция по изменению базиса вашей ветки. Т.е. изменить коммит, с которого вашего ветка стартовала. Нагляднее всего будет измученная картинка:
Т.к. обычно операция merge
не вызывает сложностей, остановимся на rebase
.
Его можно делать если:
- вы работаете один на ветке либо заранее договорились со всеми коллегами по ветке что будете это делать. Ведь эта операция перепишет историю коммитов для всех!
- до чьего либо ревью
В остальных случаях - только мерж.
- В IDE
Cmd + 9
(Ctrl + 9
) для открытия панели git:
![Screenshot 2023-11-10 at 11 29 09](https://private-user-images.githubusercontent.com/44067768/282002445-43fe10c6-a642-4de0-900b-96ee5eb2bc07.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2ODgyNTAsIm5iZiI6MTczOTY4Nzk1MCwicGF0aCI6Ii80NDA2Nzc2OC8yODIwMDI0NDUtNDNmZTEwYzYtYTY0Mi00ZGUwLTkwMGItOTZlZTVlYjJiYzA3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDA2MzkxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY0YjdhNjQ1OGE5ZmM0NWNlYWRjODRkMGM1N2JhZDY3NzYwMWIxODE1YTg4ZjVhZTRhNGUzMjhlYTBlZWRhMzEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.0wndDIk5HB2YXSjK2saOY7xSvk9jI5ZtQgoQKeGPv5s)
- Обновляем ветку от которой хотим провести ребейз. Например, ваша ветка базируется на мастере, значит нужно обновить локально мастер:
![Screenshot 2023-11-10 at 11 31 16](https://private-user-images.githubusercontent.com/44067768/282003242-925b31a6-da90-4898-9465-55369fd3c440.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2ODgyNTAsIm5iZiI6MTczOTY4Nzk1MCwicGF0aCI6Ii80NDA2Nzc2OC8yODIwMDMyNDItOTI1YjMxYTYtZGE5MC00ODk4LTk0NjUtNTUzNjlmZDNjNDQwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDA2MzkxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdmMzk3YzRkN2FiN2YwZjIyYjlmNzM1NGU3YTJkMzhkZGEyMGYwODVhNDM3YTE5MmRiNDQ5MDQ4YTE3MGY2YWImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Tv_MScR1OBZuCTQlGYC8OVU9G78BevtPdLlPNHIQiV0)
- Начинаем ребейз. Находясь на вашей рабочей ветке, кликаем по той ветке по которой хотим "перебазироваться":
![Screenshot 2023-11-10 at 11 33 45](https://private-user-images.githubusercontent.com/44067768/282003681-026cea5e-27c6-4884-addb-d30264706282.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2ODgyNTAsIm5iZiI6MTczOTY4Nzk1MCwicGF0aCI6Ii80NDA2Nzc2OC8yODIwMDM2ODEtMDI2Y2VhNWUtMjdjNi00ODg0LWFkZGItZDMwMjY0NzA2MjgyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDA2MzkxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU0NDU4MWI4MzcwMGI5MTEwODVkOWMzMDI1ZGM1Zjc5NzEzZjhkY2UwN2VjZmYzOWRjNWNkMGM3MDViMzZkOGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.aycvICSZR3OLQqGK2i8bGSThuR_fCcYvuaHNl9wW87k)
-
Далее начинается операция по ребейзу - git проходится по истории коммитов вашей ветки и ветки от которой вы хотите перебазироваться и сравнивает есть ли конфликты. Если есть - высвечивает предлагая выбор что вы хотите внести в вашу ветку - изменения вашей ветки или изменения ветки с которой вы перебазируетесь. ВНИМАНИЕ:
yarn.lock
,pnp.cjs
,pnp.loader.mjs
можете выбирать любое ЦЕЛИКОМ на ваш "вкус" - хоть с вашей ветки хоть с другой. Эти файлы генерируются командойyarn
в корней проекта, поэтому даже если накосячите, всегда можно перегенерировать. -
После окончания ребейза вам высветиться такое:
![Screenshot 2023-11-10 at 11 37 49](https://private-user-images.githubusercontent.com/44067768/282004681-f3ef6987-e2fd-4716-a879-1c8aff981766.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2ODgyNTAsIm5iZiI6MTczOTY4Nzk1MCwicGF0aCI6Ii80NDA2Nzc2OC8yODIwMDQ2ODEtZjNlZjY5ODctZTJmZC00NzE2LWE4NzktMWM4YWZmOTgxNzY2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDA2MzkxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY1M2YxYmY1ZDUxYmZjZTEyOTlmYzY5NjNjOGYxMGVmZGFhNzA5ODNlNTZjM2YxYTRjNTZhNTRhYTA3YmIzODgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.BYLoy1zjUzysY_oD18mnB6yRkuTb4xoqbwDUyxWeR_Q)
- На этом этапе важно понимать - вы сделали ребейз только локально. Ваша локальная ветка перебазировалась. Однако ремоут, ваша ветка на сервере, все еще прежняя. Необходимо обновить и ее. Если вы попробуете просто
git push
(или для продвинутыхCmd + Shift + K
(Ctrl + Shift + K
)) то вам высветится ошибка - необходимо принять ремоут изменения прежде чем пушить локал. Соответственно теперь наша цель - совместить/"переписать" изменения локальные на ремоут. Это можно сделать следующим образом:
-
git push --force-with-lease
или его эквивалент в IDECmd + Shift + K
(Ctrl + Shift + K
):
![Screenshot 2023-11-10 at 11 44 15](https://private-user-images.githubusercontent.com/44067768/282006375-0ae1a5e3-d6a3-446c-a2a3-da8a92f5bc89.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2ODgyNTAsIm5iZiI6MTczOTY4Nzk1MCwicGF0aCI6Ii80NDA2Nzc2OC8yODIwMDYzNzUtMGFlMWE1ZTMtZDZhMy00NDZjLWEyYTMtZGE4YTkyZjViYzg5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDA2MzkxMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI3ZjdmMzkxNTA5MmQzZTkxZTcxMmI5ZTgzY2Q1ZWQ2YjRkYzcyNDIzZWU4MDQzNzNmNjBkMThlNTRhYWNiZjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.DR_s8FolmilvjKKAazcYqZGzPZ4k7NeWCxWDccwvh3w)
Сделав это вы перетрете все хэши коммитов. Если вы это сделаете после чьего-либо ревью - их комментарии перетрутся и история замечаний потеряется. Поэтому повторим - ребейз делаем только до чьего либо ревью.