Jak sobie z tym poradzić, gdy zatwierdzanie w toku wydaje się nagle zależeć od innego, którego jeszcze nie ma?

13

Nie mam doświadczenia z Git, ale staram się przyzwyczaić i jak dotąd używam go tylko do projektów, nad którymi pracuję sam.

Kiedy koduję, naturalnie pojawia się jakieś podejście odgórne (ponieważ nie znam przyszłości) i pojawia się powtarzający się motyw:

Wykonuję trochę pracy.
Dowiaduję się, że aby moja praca stała się czymś „zobowiązującym”, muszę wykonać inną pracę.
Druga praca zasługuje na własne zatwierdzenie.

Przez coś godnego polecenia rozumiem coś, co się kompiluje lub coś, co nie jest całkowitym bałaganem.
I przez coś, co zasługuje na własne zatwierdzenie, mówię o tym, że nauczyłem się, że zatwierdzanie powinno zrobić tylko jedną rzecz.

Sposób, w jaki to rozwiązuję, jest uciążliwy. Jeśli inna praca znajduje się w innym pliku, tworzę nową gałąź, zatwierdzam ją i łączę. Jeśli praca znajduje się w tym samym pliku ... ugh .. Wykonuję lokalną kopię i resetuję plik do stanu HEAD, dokonuję wymaganego zatwierdzenia, a następnie zaczynam przywracać moją pracę z kopii. Jak powinienem sobie z tym poradzić? Nie sądzę, że tak to jest, prawda? Nie zakładam, bo to musi zdarzać się często każdemu (przynajmniej nie znającemu przyszłości). A może wydaje się, że mój przepływ pracy może być wadliwy?

MasterMastic
źródło
1
Często znajduję się w tej samej sytuacji, zwykle przy dodawaniu bibliotek i konfiguracji. Po prostu używam, git statusaby zobaczyć wszystkie zmienione pliki i wykonać dwa lub więcej zatwierdzeń, używając git addokreślonych plików (zamiast git add --all) i zatwierdzając kawałek po kawałku.
Chris Cirefice,
Możesz wybrać części plików za pomocą, git add -pa następnie zatwierdzić tylko te części. To bardzo potężna technika i używam jej prawie cały czas.
eush77

Odpowiedzi:

17

Istnieje wiele sposobów rozwiązania tego problemu.

Jeśli chcesz wprowadzić zmiany dla pierwszego zatwierdzenia bez ingerowania w bieżące zmiany, możesz użyć git stash. Spowoduje to usunięcie wszystkich otwartych zmian, umożliwiając przywrócenie ich później. Użyj, git statusaby zobaczyć, że już ich nie ma. Teraz stwórz pierwszy zatwierdzenie, jak zwykle. Następnie możesz użyć git stash popdo przywrócenia pierwotnych zmian i utworzenia drugiego zatwierdzenia, wykonując swoją podstawową pracę.

Innym sposobem byłoby wprowadzenie wszystkich wymaganych zmian, a następnie utworzenie dwóch zatwierdzeń, z których oba zawierają część twojej pracy. Aby to zrobić, możesz użyć indeksu (zwanego również obszarem przemieszczania) dostarczonego przez git. Jest to specjalny obszar, którego możesz użyć do przygotowania zatwierdzeń. Zakładając, że zmieniłeś wiele plików, możesz dodać każdy z nich do indeksu za pomocą git add. Podczas wykonywania git commitzatwierdzone zostaną tylko pliki dodane do indeksu. git statuspokaże, które części Twoich zmian zostaną zatwierdzone, a które nie. Na przykład będzie wyglądać w ten sposób po zmianie plików a.txt, b.txt i c.txt, a następnie git add a.txt:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   a.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   b.txt
        modified:   c.txt

Kiedy robisz git commitw tym stanie, tylko zmiany do a.txt zostaną dodane do twojego zatwierdzenia.

Dodatkowo możesz przejrzeć dokładne zmiany git diff --cached, które zostaną zatwierdzone , co pokaże różnicę wszystkich zmian, które zostaną zatwierdzone .

Jeśli jeden plik zawiera zmiany dla obu zatwierdzeń, możesz również dodać tylko jego część do indeksu, używając „git add --patch b.txt”. git dostarczy ci tryb interaktywny, który prosi o każdą zmianę w danym pliku, czy należy go dodać do indeksu. Może to stać się trudniejsze, jeśli masz zmiany w wierszach obok siebie, które muszą być podzielone na dwa zatwierdzenia, ale są też sposoby na rozwiązanie tego.

Jeśli chcesz dowiedzieć się więcej na temat miejsca postoju, możesz przeczytać to: http://gitready.com/beginner/2009/01/18/the-staging-area.html

Możesz także przeczytać więcej o interaktywnym dodawaniu tutaj: http://nuclearsquid.com/writings/git-add/

lucash
źródło
5

Jeśli używasz GUI dla Git, takiego jak SourceTree firmy Atlassian, lub git guimożesz zatwierdzać części plików i pozostawiać inne części niezaangażowane. W rzeczywistości możesz zatwierdzać poszczególne wiersze kodu.

Robię to często, kiedy upadam w królicze nory, jak to opisujesz. Jest to świetny sposób na dokonanie tego sensownego zatwierdzenia lub zatwierdzenia jako prekursora głównego zatwierdzenia.

Możesz to zrobić z wiersza poleceń, ale jest to trochę niezdarne.

Kiedy możesz zatwierdzać na poziomie łatki Git i poszczególnych linii, nie musisz tworzyć nowych gałęzi, ukrywać, zatwierdzać, ukrywać i scalać. Po prostu kontynuuj pracę i nie przerywaj przepływu. Dobrze ci idzie.

Greg Burghardt
źródło
@MasterMastic TO powinna być Twoja zaakceptowana odpowiedź. Zdolność do popełniania pojedynczych wierszy kodu to wybawienie.
JesseTG