Zatwierdzanie Git nie zostało ukończone, ale nie można kontynuować na tym komputerze

11

Czasami mam problem z nieprzydzieleniem kodu na stacji roboczej, która nie jest gotowa na zatwierdzenie, ale musi zostać ukończona na innej stacji roboczej lub laptopie.

Czy ktoś ma rozwiązanie tego problemu, takie jak „miękkie zatwierdzenie” lub inny sposób przeniesienia zmian na inny komputer w celu pracy nad nim w innym miejscu?

Wolałbym nie być zmuszany do zatwierdzania i wypychania zmian, które nie są odpowiednio wdrażane.

csteifel
źródło
2
ten post jest raczej trudny do odczytania (ściana tekstu). Czy mógłbyś edytować go w lepszym kształcie?
komara
.. dźwięki jakbyś chciał git stash...?
Simon Whitehead,
@ SimonWhitehead tak, ale czy mogę łatwo przenieść skrytkę git na inną maszynę?
csteifel
Wszystkie zatwierdzenia Git są „miękkimi zatwierdzeniami”.
user253751,
Naprawdę nie jest to duplikat, ponieważ podchodzi do problemu na odwrót, ale powiązane: Czy powinienem używać git stash, aby zapisać bieżące zmiany mojego projektu i przekazać go do github, aby uzyskać dostęp do innych komputerów?
try-catch-wreszcie

Odpowiedzi:

12

Poniżej założono, że Twoje lokalne repozytorium jest klonem repozytorium na innym serwerze, np. Github; i że masz prawa do wprowadzania zmian na serwerze nadrzędnym. W moim przykładzie nazwałem to repozytorium „upstream”. Uruchom, git remote showaby wyświetlić listę innych repozytoriów, może to podpowiedzieć, jak się nazywa.

Sugerowałbym utworzenie oddziału, wtedy możesz sprawdzić oddział na innym komputerze. W rzeczywistości, jeśli utworzysz oddział, gdy tylko zaczniesz pracę, możesz „zatwierdzić” do swojego oddziału, uzyskać ślad i kopię zapasową swojej pracy, bez konieczności posiadania stabilnego zestawu kodów. Gdy będziesz zadowolony ze swojej pracy, możesz połączyć ją z powrotem w swoją gałąź „master”.

  • Aby rozgałęzić swoje repozytorium: git checkout -b MyNewBranch
  • Aby przekazać zatwierdzone zmiany w nowym oddziale: git push origin MyNewBranch
  • Aby sprawdzić oddział na innym komputerze: git checkout MyNewBranch
  • Aby przejść do innej gałęzi (np. „Master”): git checkout master
  • W trybie master, aby ponownie połączyć MyNewBranch: git merge MyNewBranch
  • Aby wyświetlić listę oddziałów: git branch
AMADANON Inc.
źródło
3
Tak, zawsze praca w prywatnym oddziale zasadniczo rozwiązuje ten problem. Możesz popełniać tak często, jak chcesz, bez wpływu na innych. Jeszcze lepiej jest utworzyć nowy oddział za każdym razem, gdy zaczniesz pracę nad nową funkcją lub zaczniesz naprawiać nową wadę. Dzięki temu bardzo łatwo przeskakiwać między bazami kodów.
Gort the Robot
A także powód, dla którego to robię: jeśli popełnisz błąd w połowie, możesz przejść do poprzednich zatwierdzeń w bieżącym oddziale. Lub odskocz, chwyć kawałek, skocz do przodu i zastosuj.
AMADANON Inc.,
1
Czy ta metoda nie obejmowałaby również niepełnych zatwierdzeń w scalonej gałęzi głównej?
eimrek
Tak i (moim zdaniem) to chyba nie jest zła rzecz. Jeśli nie chcesz tego, wykonaj powyższe czynności, a następnie zamiast zatwierdzić swój kod, utwórz różnicę (która obejmuje wszystkie zmiany plików, ale bez zatwierdzeń), zastosuj go do nowej kopii gałęzi, a następnie wypchnij.
AMADANON Inc.,
2
co do „ Aby przejść do innej gałęzi dogit branch -d master ”, jestem zdezorientowany, czy to nie prosi gita o usunięcie gałęzi master? (i tak mam wrażenie po przeczytaniu instrukcji oddziału git)
Tasos Papastylianou
2

Możesz użyć, git diffaby utworzyć łatkę, a następnie zastosować ją na innym komputerze. Możesz też utworzyć tymczasowe zatwierdzenie, a następnie pobrać je z innego komputera. Możesz nawet utworzyć gałąź tymczasową na innym komputerze, wcisnąć tam tymczasowe zatwierdzenie, a następnie usunąć gałąź.

Moja ulubiona metoda to druga: utworzenie tymczasowego zatwierdzenia, następnie przejście do innej maszyny i wykonanie czegoś takiego:

$ git fetch ssh://first_machine/path/to/repo whatever_branch_i_was_working_on
$ git reset --hard FETCH_HEAD
$ git reset HEAD^
aragaer
źródło
Dlaczego tak skomplikowane, a nie tylko używanie git format-patch?
try-catch-wreszcie
Nie bardzo różni się od git diff. Czy czegoś brakuje?
aragaer
1
git format-patch deadbee..badcab1e- Tworzy .patchpliki dla każdego zatwierdzenia osobno z zachowaną ładną nazwą i komunikatem zatwierdzenia.
try-catch-wreszcie
Czy tworzy także łatkę do zmian, które nie zostały jeszcze zatwierdzone? Czy oddziela bieżący indeks od rzeczy, które nie są jeszcze wystawiane? Wygląda na to, że nie.
aragaer 27.07.17
Nie, nie w przypadku niezaangażowanych / niestopionych zmian. Ale ponieważ zatwierdzenie nie krzywdzi nikogo innego, dopóki nie naciskasz, zatwierdzenie powinno być OK (z jasnym komunikatem „WIP” - praca w toku).
try-catch-wreszcie
2

I zobowiązać go. I popchnąć go do osobistego oddziału , sprawdź na drugą stronę i zmienić. Po zakończeniu usuń osobisty oddział.

Oczywiście możesz przepychać bezpośrednio między repozytoriami, możesz użyć pakietu lub format-patch/ am, ale gałąź osobista jest zdecydowanie najłatwiejszym rozwiązaniem. A przepisywanie historii nie jest wielkim problemem, o ile nie jest przekazywane do żadnej udostępnionej gałęzi. W wielu projektach ludzie powinni przewinąć gałęzie funkcji, aby ułatwić ich zrozumienie do przeglądu.

Jan Hudec
źródło
0

Proste podejście to takie, które opisujesz: skopiuj .gitukryty katalog i pliki projektu na inną maszynę, gdzie możesz albo zatwierdzić i zakończyć, albo po prostu kontynuować pracę.

.gitKatalog jest git, gdzie historia jest przechowywana, więc zachowanie to wraz z rzeczywistymi plikami utrzymuje cała historia projekt nienaruszone.

Jeśli na stałe korzystasz z oryginalnej maszyny, prawdopodobnie zaleciłbym to podejście.

joshin4colours
źródło
0

Podobnie jak inni odpowiedzieli, w Git nie powinieneś martwić się o niedokończony kod w swoich osobistych oddziałach. Jeśli jednak z jakiegoś powodu naprawdę naprawdę nie chcesz, aby Twoja niedokończona praca dotknęła głównego repozytorium, możesz skorzystać z rozproszonej natury Git!

Istnieje proste narzędzie o nazwie, git bundlektóre może pomóc w łatwym przekazywaniu zmian bez centralnego repozytorium. Najpierw sklonuj repozytorium:

git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1

wprowadź zmiany i przekaż je do tymczasowego oddziału:

git checkout -b tmp_branch
git commit -a -m "temporary changes"

Teraz spakuj je zmiany:

git bundle create ../tmp.bundle tmp_branch

Teraz masz plik pakietu, który możesz wysłać na nowy komputer. Jak go tam wykorzystujesz? Utwórzmy nową kopię roboczą:

cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2

musimy traktować nasz pakiet jako innego pilota, abyśmy mogli pobrać z niego zmiany

git remote add tmp ../tmp.bundle
git fetch tmp

ponieważ chodziło o przeniesienie zmian bez pozostawiania śladu, będziemy chcieli zgnieść je do kopii roboczej, aby stracić tymczasowe zatwierdzenie:

git merge tmp/tmp_branch --squash

i wszystko, co pozostało, to usunąć tymczasowego pilota:

git remote remove tmp

ALTÓWKA! Zmiany zostały przeniesione do nowej kopii roboczej bez pozostawiania śladu ani oddziału, ani zatwierdzenia!

Ale tak naprawdę - ten proces jest dość długi i uciążliwy. To jest Git, a nie SVN - naprawdę nie powinno być żadnego powodu, aby nie wypychać osobistego oddziału do centralnego repozytorium.

Idan Arye
źródło