2015-06-22 11 views
6

Praca z Git, musiałem wrócić do konkretnego zatwierdzenia. Wprowadziłem pewne zmiany i teraz chcę je zatwierdzić. Jaki jest właściwy sposób na zrobienie tego?Jak zapisać zmiany w stanie odłączonej głowicy?

Mój projekt jest teraz w stanie odłączonym-HEAD. Czy moje zmiany zapisywane gdybym zrobić commit z

git commit 

? W przeciwnym razie, co powinienem zrobić, aby nie stracić moich zmian?

+0

* Dokonałem pewnych zmian i teraz chcę je zapisać. * Proszę podać dokładniejsze: co rozumiesz przez "zapisywanie"? Masz głównie dwie opcje: commit lub skrytka. Każda z nich "uratuje" twoje zmiany w pewnym sensie. Do którego odnosisz się? Możesz również utworzyć oddział. – Jubobs

+0

Chcę zatwierdzić moje zmiany. – Nikolas

+0

Odpowiednio zredagowałem Twoje pytanie. – Jubobs

Odpowiedz

12

Zastrzeżenie: git nie jest skomplikowany, jest po prostu wszechstronny. Nie bój się, tylko dlatego mam wałęsał się w długą odpowiedź :)

Miałeś:
master: a-b-c-d-e-f

i chciał zmienić c. Zrobiłeś:
* git checkout c (. Uniknąć sprawdzania popełni w przyszłości Przesuń głowę gałąź zamiast)
* zmieniły niektóre pliki

Jesteś w:

master: a-b-c-d-e-f 
      \uncommitted-work,detached 

Jeśli chcesz ponownie zastosować def na górze zmienionego "c"

(Jeśli już naciskasz, osób poniżej będzie mieć to recover from upstream rebase)

  1. git stash .
  2. git checkout master
  3. git stash pop (rozwiązywanie konfliktów)
  4. git stage .
  5. git commit -m "temporary name for g"
  6. (master: a-b-c-d-e-f-g)
  7. git rebase c -i ("ponownie ubiegać się mój obecny oddział na punkcie c, i niech mi manipulować zobowiązuje interaktywnie", tj, re-rodzic (rebase) d-e-f na nowy c)
  8. Śledź guide to interactive rebase. Chcesz ponownie zamówić g, więc jest po C, a następnie zmień polecenie rebase z pick na fixup. dd, aby usunąć linię, P, aby ją umieścić, i, aby wejść do trybu wstawiania, aby wpisać "fixup", a następnie :wq, aby zapisać i opuścić vim.
  9. (master: a-b-c'-d'-e'-f', gdzie c' jest wynikiem scalenia g i c podczas remizy.d-e-f stały d'-e'-f' jak ich przodków zmieniła więc oni nie „same” zobowiązuje miarę git jest zaniepokojony, ale ich treść pozostaje taka sama)

Jeśli chcesz cofnąć d-e-f (i przepisać historię tak, jakby nigdy nie uczynił je)

(Jeżeli wciśnięty, ludzie poniżej będzie mieć to recover from upstream rebase):

  1. git stash .
  2. git checkout master
  3. (master: a-b-c-d-e-f z ukryty plików pierwotnie w oparciu c)
  4. git reset --hard c (odrzucić wszystkie pliki i zobowiązuje się na pana od c)
  5. (master: a-b-c, z ukryty pliki)
  6. git stash pop (resolve konflikty)
  7. (master: a-b-c-*)
  8. git stage .
  9. git commit -m "description of g"
  10. (master: a-b-c-g)

Jeśli chcesz cofnąć D-E-F (ale zachować je w historii)

  1. git stash
  2. git revert --no-commit d
  3. git revert --no-commit e
  4. git revert --no-commit f
  5. git push
  6. git stash pop (będzie żadnych konfliktów)
  7. git stage .
  8. git commit -m "Undo d-e-f in order to fix..."
  9. git push

Jeśli masz git push D-E-F i chcesz t o zachowaj je osobno:

Wygląda na to, że twoje nowe zmiany dotyczą nowego oddziału. git branch <foo>.

+1

Niesamowita kompleksowa odpowiedź zapewniająca wgląd w wiele technik i przepływów pracy. Zasługujesz na więcej kredytu/uwagi, niż to się stało. TYLKO JEDNA PREZENTACJA? Jezus. – Aerovistae

4

Utwórz nowy oddział z tego zobowiązać a następnie wykonaj commit:

git checkout -b <branchname> 
git commit 

Zakładając, że już wystawił (tj git add myfile1 myfile2) plików.

+1

Możesz chcieć określić dlaczego w tym przypadku preferowane jest tworzenie odgałęzień. – Jubobs

+0

Nic jeszcze nie robię. Myślę, że muszę wiedzieć więcej na temat przenoszenia plików. – Nikolas

Powiązane problemy