Ответы, данные до сих пор, не идеальны, потому что они требуют много ненужной работы по разрешению конфликтов слияния, или они делают слишком много предположений, которые часто бывают ложными. Вот как это сделать отлично. Ссылка на мой собственный сайт.
У вас есть незафиксированные изменения на my_branch
, которые вы хотите зафиксировать на master
, не фиксируя все изменения с my_branch
.
Пример
git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop
Объяснение
Начните с слияния master
с вашей веткой, так как вам все равно придется это делать, и сейчас самое подходящее время для разрешения любых конфликтов.
Параметр -u
(он же --include-untracked
) в git stash -u
предотвращает потерю неотслеживаемых файлов, когда вы позже выполните git clean -f -d
в master
.
.
После git checkout master
важно, чтобы вы НЕ git stash pop
, потому что вам понадобится этот тайник позже. Если вы откроете тайник, созданный в my_branch
, а затем выполните git stash
в master
, вы вызовете ненужные конфликты слияния при последующем применении этого тайника в my_branch
.
git reset
unstages все, что получается из git stash apply
. Например, файлы, которые были изменены в тайнике, но не существуют в master
, ставятся как конфликты, «удаленные нами».
git checkout .
и git clean -f -d
отбрасывают все, что не зафиксировано: все изменения в отслеживаемых файлах и все неотслеживаемые файлы и каталоги. Они уже сохранены в тайнике и, если их оставить в master
, вызовут ненужные конфликты слияния при переключении обратно на my_branch
.
Последнее git stash pop
будет основано на исходном my_branch
, и поэтому не вызовет конфликтов слияния. Однако, если ваш тайник содержит неотслеживаемые файлы, которые вы посвятили мастеру, git будет жаловаться, что «не удалось восстановить неотслеживаемые файлы из тайника». Чтобы разрешить этот конфликт, удалите эти файлы из рабочего дерева, затем git stash pop
, git add .
и git reset
.