To, co tu masz, to sytuacja, w której masz kilka nieśledzonych plików, które kolidują ze śledzonymi plikami w innej gałęzi. Chcesz przełączyć się do tej gałęzi, ale checkout
ci nie pozwoli.
Rozwiązanie „pierwszego poziomu” w git jest promowanie tych nieśledzone pliki do indeksu:
git add folder
Teraz nadal nie można sprawdzić na gałęzi. Jednak są przedstawiane z nowej możliwości: można git stash save
zmiany:
git stash save
Teraz można przejść do oddziału, i zrobić git stash pop
. W tym momencie możesz poradzić sobie z konfliktami seryjnymi, jeśli występują, po których następuje git reset
i gotowe.
[Aktualizacja: git add
nie jest konieczne ponieważ git stash
ma możliwość włączenia plików nieśledzone!]
Popracujmy przez kompletny przykład, z udziałem pojedynczy plik o nazwie topicfile
która istnieje tylko w oddziale, a jest tworzony jako plik pracy, podczas gdy na master
, ale o różnej zawartości:
~$ mkdir gittest
~$ cd gittest/
~/gittest$ git init
Initialized empty Git repository in /home/kaz/gittest/.git/
~/gittest$ touch emptyfile
~/gittest$ git add emptyfile
~/gittest$ git commit -m "starting repo"
[master (root-commit) 75ea7cd] starting repo
0 files changed
create mode 100644 emptyfile
~/gittest$ git branch
* master
~/gittest$ git checkout -b topic
Switched to a new branch 'topic'
~/gittest$ cat > topicfile
a
b
c
d
e
~/gittest$ git add topicfile
~/gittest$ git commit -m "topicfile"
[topic 875efc5] topicfile
1 file changed, 5 insertions(+)
create mode 100644 topicfile
~/gittest$ git checkout master
Switched to branch 'master'
~/gittest$ ls
emptyfile
~/gittest$ cat > topicfile
@
a
b
c
d
e
f
g
h
~/gittest$ git add topicfile
~/gittest$ git stash save topicfile
Saved working directory and index state On master: topicfile
HEAD is now at 75ea7cd starting repo
~/gittest$ git checkout topic
Switched to branch 'topic'
~/gittest$ git stash pop
Auto-merging topicfile
CONFLICT (add/add): Merge conflict in topicfile
~/gittest$ cat topicfile
<<<<<<< Updated upstream
=======
@
>>>>>>> Stashed changes
a
b
c
d
e
<<<<<<< Updated upstream
=======
f
g
h
>>>>>>> Stashed changes
~/gittest$ cat > topicfile # resolve in favor of stashed changes:
@
a
b
c
d
e
f
g
h
~/gittest$ git add topicfile
~/gittest$ git reset
Unstaged changes after reset:
M topicfile
~/gittest$ git diff
diff --git a/topicfile b/topicfile
index 9405325..bea0ebb 100644
--- a/topicfile
+++ b/topicfile
@@ -1,5 +1,9 @@
[email protected]
a
b
c
d
e
+f
+g
+h
w tym momencie możemy popełnić nasze topicfile
zmian w topic
oddziału, i plik nadal nie jest śledzony na master
.
Ponieważ występowały konflikty w git stash pop
, skrytka nadal istnieje. Możemy to wyczyścić za pomocą git stash drop
.
Alternatywą dla tego wszystkiego jest nie tylko git add
nieśledzone pliki do indeksu, ale do git commit
, aby dokonać poprawnego zatwierdzenia. Wtedy możemy czule wybrać commit do gałęzi. Jeśli nie chcemy, aby te pliki były śledzone na master
, to jest w porządku: możemy później git reset --hard HEAD^
na urządzeniu głównym, aby wyeliminować to zatwierdzenie.
Nie myślałem, aby użyć do tego celu 'git stash'. Dziękuję za to. – risto