2009-05-02 15 views
44

Współpracownik i ja pracujemy obecnie w oddziale głównym. Mam w drzewie roboczym kod, którego nie chcę zatwierdzać (instrukcje debugowania itp.). Teraz, jeżeli popełnia zmian do niektórych z tych samych plików, nie mogę połączyć je:Jak sprawić, aby Git Merge obsługiwał niezatwierdzone zmiany w moim drzewie roboczym?

$ git merge origin/master 
Updating 1b8c5c6..eb44c23 
error: Entry 'blah.java' not uptodate. Cannot merge. 

Jadąc od tła Subversion, jestem przyzwyczajony do mojego drzewa roboczego automatycznie scalone kiedy pociągnąć zmiany z repozytorium a jeśli są konflikty, rozwiązuję je ręcznie.

Najszybszym sposobem znalazłem zrobić to w git jest:

$ git stash 
$ git merge origin/master 
$ git stash pop 

Zasadniczo, usuwając moje niezatwierdzone zmiany, robi scalanie i ponowne zastosowanie zmian. Jak mogę określić scalanie, aby automatycznie scalać moje robocze drzewo ze zmianami, które próbuję wprowadzić?

+3

Co jeśli masz konflikty scalania? Co by się stało, gdyby połączyć brudne pliki (zmodyfikowane pliki)? Zobacz także "Zabawa z zachowaniem lokalnych zmian" na blogu Junio ​​C Hamano (git maintainer): http://gitster.livejournal.com/29060.html –

+0

Dzięki za link. Znowu jednak, zdecydowana większość czasu, spodziewam się albo żadnych konfliktów, albo bardzo drobnych, których nie mam nic przeciwko poprawianiu ręcznie. Ryzyko konfliktu jest takie samo, jeśli i tak popełnię brudne pliki, z wyjątkiem tego, że muszę zadać sobie trud ich unieważnienia. –

+0

Powiązane pytanie: http://stackoverflow.com/questions/18529206/when-do-i-need-to-do-git-pull-before-or-after-git-add-git-citit – leo9r

Odpowiedz

18

O ile mogę powiedzieć, najlepsze, co możesz zrobić, to to, co już masz z git stash. Ja też uważam za dziwne, że merge chce zajmować się tylko czystymi drzewami.

+3

Umieszczę to w moim pliku .bashrc: gm() { git stash; git merge $ @; git stash pop } A potem poczekaj, aby zobaczyć, ile czasu zajmuje ugryzienie mnie w dupę. –

+1

@jeremy: skończymy z zastosowaniem bardzo starej skrytki jeden dzień :). przytrafiło mi się :). – reto

+0

@reto: Jak by to się stało? – Casebash

36

Zapomnij o wszystkim, czego nauczyłeś się od subwersji.

Zawsze zatwierdzaj przed wprowadzeniem zmian zewnętrznych.

Wyobraź sobie, że masz najczęściej pracujące drzewo - może nie idealne, ale robisz postępy. Potem idziecie do scalenia, a kod, który wprowadzacie, spowodował tylko spustoszenie (samo w sobie było kłopotliwe, zbyt wiele konfliktów do załatwienia itp.). Czy nie byłoby miło, gdybyś mógł to cofnąć?

Po zatwierdzeniu możesz. Jeśli tego nie zrobisz, po prostu będziesz cierpieć.

Pamiętaj: to, co popełniłeś, nie ma wartości , ponieważ ma wartość, ale to, czego nie popełnisz, może łatwo stracić.

Po prostu rób to, co jest bezpieczne i łatwe, a następnie wcześnie angażuj się i często angażuj.

+1

Tak więc zatwierdzam moje oświadczenia debugujące, a następnie łączę się. Potem robię kilka prawdziwych zmian, które chcę popchnąć. Jak mogę wyciągnąć moje instrukcje debugowania, skoro rzeczy, które chcę zatwierdzić, zależą od tego zatwierdzenia? –

+0

Zawsze możesz przywrócić poprzednie zatwierdzenie za pomocą polecenia "przywróć". –

+1

Rozważę tę strategię, gdy nasz kod okaże się tak szalony, że będę musiał się martwić o jego cofnięcie. Jednak na razie uważam, że wersja "ukryta" jest wciąż odwracalna. Mogę ponownie przechować, zabić zatwierdzenie scalenia i ponownie załadować skrytkę do innych żądań, jakie chcę. Nie mam nic przeciwko zapomnieniu tego, czego się dowiedziałem o subwersji, ale dmucha, gdy robi coś znacznie lepszego niż git, szczególnie gdy git ma być tym, który jest tak dobry w łączeniu się. –

2

Nie można powiedzieć git merge scalić zmian w plikach, które mają zmiany w odniesieniu do lokalnego repozytorium. Chroni to przed utratą zmian w tych czasach, gdy połączenie idzie źle.

Przy podejściu CVS i SVN do scalania, jeśli nie skopiowałeś ręcznie plików przed aktualizacją, a kod został scalony, musisz ręcznie przeprowadzić ponowną edycję, aby powrócić do stanu dobrego.

Jeśli dokonasz zmian lub zapiszesz je przed scaleniem, wszystko będzie odwracalne. Jeśli scalanie się nie powiedzie, możesz wypróbować kilka sposobów jego wykonania i przejść do tego, który działa najlepiej.

Jeśli dokonasz zmian eksperymentalnych lub debugowania, możesz użyć git rebase, aby przenieść je po zatwierdzeniach, które otrzymujesz, poprzez git merge, aby ułatwić ich pozbycie się lub aby uniknąć przypadkowego przekazania ich do repozytorium.

Pamiętaj, że użycie git rebase na oddziale, które przekazałeś do wspólnego repozytorium, spowoduje smutek dla wszystkich, którzy wyciągają dane z tego repozytorium.

W takich przypadkach wolę używać git stash, ale używam go tylko wtedy, gdy scalenie zmienia pliki, które edytowałem i nie zostały zatwierdzone.

+0

O czym ty mówisz? SVN tworzy kopię zapasową plików przed scaleniem. Git jest wersją C++ kontroli wersji. Może być dumny z tego, że jest zbyt skomplikowany i skomplikowany. – JohnPristine

+0

Zgaduję, że moja wiedza na temat SVN jest nieaktualna. Git ewoluuje, by stać się bardziej użytecznym w miarę upływu czasu. Właśnie widziałem wczoraj rozmowę o Gitless, która działa na repozytoriach git, ale jest o wiele łatwiejsza w użyciu, gdy masz niezaakceptowane zmiany i chcesz scalić lub zmienić gałęzie. –