2014-12-18 13 views
6

Czy istnieje sposób na skopiowanie nieśledzonego folderu do innej gałęzi?Kopiowanie nieśledzonego folderu do innego oddziału

Wiem, że można skopiować foldery śledzone do innego oddziału robiąc coś takiego:

git checkout mybranch 
git checkout master -- myfolder 

Ale czy istnieje sposób skopiować folder nie jest śledzone na mistrza, ale jest śledzone na oddziale, do którego chcę skopiować?

Próbuję zrobić to dla stron GitHub i podążam za tym guide, ale on zobowiązuje się do opanowania i popycha go na strony gh. Nie chcę tego robić. Po prostu chcę, aby moja kompilacja generowała dokumenty i kopiowała nieśledzone dokumenty do innej gałęzi, a następnie popychała je w górę.

Odpowiedz

2

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.

+0

Nie myślałem, aby użyć do tego celu 'git stash'. Dziękuję za to. – risto

0

Jeśli folder nie jest zarchiwizowany, można po prostu checkout drugi oddział, a katalog nieśledzony nie zostanie dotknięty.

+0

Ale jest śledzone na innym oddziale, więc to nie działa :( – risto

+0

O, widzę .Nie wiem o sposób robi to elegancko.Obejście to siedem następujących kroków: (1) zmień nazwę katalogu na coś, czego nie śledzono w żadnej gałęzi, (2) zbuduj dokumenty, (3) sprawdź w innym oddziale, (4) ręcznie skopiuj pliki, (5) git dodać, zatwierdzić i pchnąć, (6) sprawdzić oryginalną gałąź, (7) zmienić nazwę katalogu na oryginalną nazwę. – ThS

+0

Tak, tak to robię, ale czuję się tak hackish. – risto

Powiązane problemy