2010-09-08 15 views
9

Wygląda na to, że zarówno Mercurial, jak i Git, jeśli nie popełnię pierwszego, nie mogę naciskać?Pchanie bez zatwierdzenia w Mercurial lub Git

Więc jeśli nie popełnić (gdy nie jest jeszcze gotowy), nie może wypchnąć do zdalnego serwera, aby wykonać kopię zapasową mojego kodu? Kod znajduje się w notebooku, przenoszonym, co może być dość krucho przenoszone.

Odpowiedz

3

Zgadza się. Celem push jest udostępnienie jednego lub więcej commitów innym repo. Żadne nie są pierwotnie przeznaczone jako kopie zapasowe (choć niektóre osoby używają ich do tego).

Istnieje wiele dedykowanych narzędzi do tworzenia kopii zapasowych i usług online. Zobacz listę Online backup for personal use.

+1

posiadanie oddzielnego systemu kopii zapasowych może wydawać się nieco kłopotliwe. Jeśli tylko Git lub Mercurial mogą pozwolić repozytorowi na repozytorium z powodu niezatwierdzonego pushu. Coś takiego jak 'git push --uncommitted ssh: // somewhat/peter/tmp' –

+2

@Jian, znowu nie są to programy do tworzenia kopii zapasowych. Zamierzeniem jest zrobienie jednego lub więcej znaczących commitów, które następnie udostępniasz. Nie ma sensu mieć repozytorium zawierające zarówno zatwierdzenia, jak i prace w toku. –

+0

"Oddzielny system kopii zapasowych" może być również repozytorium. Tak właśnie działam: koduję w moim osobistym repozytorium (gdzie często się angażuję) i mam centralne repozytorium, aby dzielić się swoją pracą z moimi kolegami (gdzie naciskam, ale rzadziej). Aby wykonać kopię zapasową pracy wykonywanej przeze mnie w repozytorium osobistym, mam trzecie repozytorium: haczyk w moim repozytorium osobistym wykonuje każde ponowne zatwierdzenie tego repozytorium zapasowego. W ten sposób operacja tworzenia kopii zapasowej jest całkowicie przezroczysta (kara czasowa jest znikoma). – barjak

2

Zgadza się; nie możesz przesłać niezatwierdzonych zmian. Jednak tylko dlatego, że twoje zmiany nie są jeszcze gotowe, nie oznacza, że ​​nie możesz ich zatwierdzić. Nie mam doświadczenia z Mercurial, ale dzięki Git możesz zmienić commit (git commit --amend), aby zmodyfikować go po zatwierdzeniu. Możesz również wykonać serię commitów, a następnie wykonać interaktywny rebase, aby połączyć je w jeden commit. Możesz też zrobić zobowiązanie w razie potrzeby i nie martwić się o to, że twoja historia jest całkowicie nieskazitelna.

+1

Jak wyjaśniono w [ODZYSKIWANIE Z REBASU UPSTREAM] (http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html#_recovering_from_upstream_rebase), '--amend' może stać się głównym problemem . Każdy, kto wyciągnie z wersji przed zmianą, musi zmodyfikować swoją historię, gdy otrzyma poprawioną wersję. –

+1

Jest to istotne tylko wtedy, gdy udostępniane jest repozytorium, do którego on wysyła. Jeśli po prostu używa go do celów kopii zapasowych, nie powinno to stanowić problemu. – mkarasek

+1

... a oddział jest oficjalny.Jeśli popchniesz do oddziału o nazwie 'my-wip' i ktoś myśli, że powinien zbudować produkt wokół tego, to zasługuje na pomyłkę. – Dustin

17

Jesteś zawsze gotowy popełnić.

Często popełnij. Zaangażuj się w branżę work in progress i rozpowszechniaj ją tak szeroko, jak tylko chcesz.

Po przejściu do stanu, który obecnie określasz jako "gotowy do zatwierdzenia", sprawdź rozbieżność swojej gałęzi od źródła, wykonaj rebase -i, aby oczyścić ją i sprawić, by wyglądała tak, jak chcesz.

to będzie łatwiejsze, bezpieczniejsze i ogólnie daje lepsze rezultaty niż próbując naprawdę ciężko, aby wszystko idealne przed popełnieniem. Pamiętaj: zatwierdzenie niekoniecznie oznacza pożądany stały stan wszechświata. To jest gdzieś, gdzie jesteś. Sposób, w jaki publikujesz to zależy od Ciebie.

git czyni bardzo łatwo opublikować do-not-look-at-me oddział dla swojej produkcji w toku, które można później przenieść na swojej oficjalnej kodzie w jakimkolwiek momencie iw jakiejkolwiek formie myślisz najbardziej Ci odpowiada.

7

Po prostu utwórz nową gałąź wyrzucania.

Zatwierdź połowicznie upieczone zmiany w tej gałęzi i naciśnij tę gałąź.

Gdy twoje zmiany są gotowe, zmiażdż półpieczone zatwierdzenia (używając rebase) i połącz wynik z numerem master i usuń gałąź wyrzucania. (Możesz usunąć oddział ze zdalnego repozytorium, używając git push origin :branch - zwróć uwagę na dwukropek przed nazwą oddziału).

Nigdy nie ma powodu, aby nie zatwierdzać zmian, chociaż mogą istnieć powody, dla których nie należy zatwierdzać dla określonego oddziału, gdy nie są jeszcze gotowe.

2

Sprawdź, czy scenariusz jest prawidłowy. Ty masz...

  1. niektóre niezatwierdzone zmiany w katalogu roboczym, który raczej nie jeszcze popełnienia,
  2. niektóre unpushed zmian w lokalnym repozytorium,

... ale twój nieznośny szef baterie się na z powrotem i mówi: "Hej, kiedy zamierzasz przeforsować tę zmianę, o której wspomniałeś na spotkaniu z personelem?" Wszyscy czekamy na to! " Stoi tam i czeka, aż to zrobisz, więc jak szybko i łatwo wyciągniesz go z włosów?

To jest łatwe. Chcesz używać urządzenia MQ extension. Jest dołączony do standardowej instalacji Mercurial.

Najpierw dodaj go do swojego pliku .hgrc.

[extensions] 
mq = 

Aby schować swoje niezatwierdzone zmiany we wpisie kolejki łata, to zrobić:

$ hg qnew stash 
$ hg qpop 

Teraz push starsze zobowiązuje, więc twój szef będzie wysiąść plecach.

$ hg push 

Wreszcie przywrócić katalog roboczy tak:

$ hg qpush 

W tym momencie masz jeszcze patcha nagrany w kolejce plastra. Jest teraz oznaczony jako "zastosowany". Zakończyć edycję kodu, a następnie zrobić to zaktualizować patch ze swoimi gotowych edycji i popełnić wiadomość dziennika, a następnie sfinalizować poprawkę do changeset:

$ hg qrefresh -m"Commit message goes here." 
$ hg qfinish stash 

To podstawy, ale jest dużo więcej można zrobić jeśli chcesz się naprawdę spodobać. Rozszerzenie MQ przypomina zupełnie nowy świat kontroli wersji ukryty pod repozytorium Mercurial. To jak skrytka Gita, ale bardziej elastyczna i mało dezorientująca.

Ucz się, mutuj, ewoluuj!

Powiązane problemy