Перемикання гілки (git switch чи git checkout) - це три кроки:
- порівняти дерева: Git бере tree поточного коміту й tree цільового коміту і визначає, які файли відрізняються;
- оновити індекс і робочий каталог: змінені файли переписуються, відсутні в цільовій гілці - видаляються, нові - створюються. Однакові файли не чіпаються взагалі - саме тому перемикання між схожими гілками миттєве навіть у великому проєкті;
- оновити
HEAD: записатиref: refs/heads/<гілка>.
Незакомічені зміни переносяться разом з вами. Якщо ви змінили файл, а в цільовій гілці цей файл такий самий, як у поточній, - Git просто залишить вашу зміну. Тому «я почав роботу не в тій гілці» виправляється простим git switch -c правильна-гілка - зміни перейдуть.
Коли Git відмовляється:
error: Your local changes to the following files would be overwritten by checkout:
config/services.php
Please commit your changes or stash them before you switch branches.
Aborting
Це трапляється, коли у вас є незакомічені зміни у файлі, який у цільовій гілці відрізняється. Git не може записати нову версію, не знищивши вашу роботу, - тому зупиняється, нічого не змінивши.
Те саме для невідстежуваних файлів:
error: The following untracked working tree files would be overwritten by checkout:
app/Actions/Export.php
У цільовій гілці є файл з таким шляхом, а у вас лежить невідстежуваний файл з тим самим іменем.
Варіанти:
- закомітити зміни (можна тимчасовий коміт в поточній гілці);
git stash(з-uдля невідстежуваних), перемкнутися, потімgit stash popтам, де потрібно;git switch -m гілка- спробувати злити ваші зміни з версією цільової гілки (можуть виникнути конфлікти);- відкинути зміни -
git restore, якщо вони не потрібні.
Чого не варто робити - git checkout -f / git switch --discard-changes без розуміння: це перемикання з безповоротним знищенням незакомічених змін.
Невідстежувані й проігноровані файли (vendor/, .env) переживають перемикання - Git їх не чіпає. Тому після переходу на стару гілку vendor/ може не відповідати її composer.lock: потрібен composer install.