Dotychczasowe odpowiedzi nie są idealne, ponieważ wymagają dużo niepotrzebnej pracy w celu rozwiązania konfliktów scalania lub przyjmują zbyt wiele założeń, które często są fałszywe. Oto jak to zrobić idealnie. Link jest do mojej własnej strony.
Masz niezatwierdzone zmiany my_branch
, do których chcesz się zobowiązać master
, bez zatwierdzania wszystkich zmian od my_branch
.
Przykład
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
Wyjaśnienie
Zacznij od połączenia master
się ze swoim oddziałem, ponieważ i tak będziesz musiał to zrobić ostatecznie, a teraz jest najlepszy czas na rozwiązanie wszelkich konfliktów.
-u
Opcja (aka --include-untracked
) w git stash -u
zapobiega zgubieniu plików nieśledzone kiedy później zrobić git clean -f -d
wewnątrz master
.
Po git checkout master
tym ważne jest, aby tego NIE robić git stash pop
, ponieważ będziesz potrzebować tej skrytki później. Jeśli włączysz utworzoną skrytkę, my_branch
a następnie git stash
w nią master
wejdziesz, spowodujesz niepotrzebne konflikty scalania, gdy później zastosujesz tę skrytkę my_branch
.
git reset
odsłania wszystko, co wynika z git stash apply
. Na przykład pliki, które zostały zmodyfikowane w skrytce, ale nie istnieją, master
są przenoszone jako konflikty „usunięte przez nas”.
git checkout .
i git clean -f -d
odrzucić wszystko, co nie zostało popełnione: wszystkie zmiany w śledzonych plikach oraz wszystkie nieśledzone pliki i katalogi. Są już zapisane w skrytce, a pozostawienie master
ich spowoduje niepotrzebne konflikty scalania przy ponownym włączeniu my_branch
.
Ostatni git stash pop
będzie oparty na oryginale my_branch
, a więc nie spowoduje konfliktów scalania. Jeśli jednak twoja skrytka zawiera nieśledzone pliki, które zobowiązałeś się opanować, git będzie narzekać, że „nie można przywrócić nieśledzonych plików ze skrytki”. Aby rozwiązać ten konflikt, należy usunąć te pliki z drzewa pracy, potem git stash pop
, git add .
i git reset
.