2012-10-12 7 views
10

Ostatnio używałem git show <hash> do tworzenia różnic dla późniejszego odniesienia, ponieważ łatwiej jest wpisać niż git diff <hash>~ <hash> i pokazuje informacje o zatwierdzeniu (znacznik czasu, użytkownik, hash, komentarz). Następnie można użyć poprawki git apply <filename>.Używanie `git show` do tworzenia i stosowania poprawek obejmujących wiele zatwierdzeń

Odkryłem, że git show -3 pokaże ostatnie trzy zatwierdzenia wraz z tymi samymi dodatkowymi informacjami. Jednak git apply zgnie wszystkie w katalogu roboczym jako zmiany nieoparte i traci wszystkie informacje o zatwierdzeniu.

Czy jest coś w git, które zastosuje wszystkie te informacje? Łatwiej byłoby po prostu przekazać flagę niż rozbić łatę na trzy pliki, stosując je osobno i tworząc nowe zatwierdzenia.

Odpowiedz

5

Możesz użyć git format-patch do generowania wiadomości e-mail MIME przedstawiających zatwierdzenia, w tym ich metadane (wiadomość, autorstwo itp.). Następnie można je ponownie zastosować za pomocą git am.

Tak więc git format-patch HEAD~3 wygeneruje 3 łaty dla ostatnich 3 zatwierdzeń, a następnie można je przekierować wszystkie na git am. Jeśli chcesz być prostszym, git format-patch --stdout HEAD~3 wyśle ​​komunikaty MIME na standardowe wyjście, aby można było je potoczyć w wybranym miejscu, zamiast obsługiwać 3 oddzielne pliki.

Oczywiście, jeśli próbujesz zapisać potwierdzenie, aby później się z nim zapoznać, dlaczego nie po prostu je oznaczać? Następnie można ponownie zastosować zatwierdzenia z nich za pomocą git cherry-pick.

+0

To wygląda jak to będzie działać, chociaż muszę idź i ponownie wykonaj poprawki, które już zrobiłem, używając 'git show'. Prawdopodobnie zacznę od teraz używać łatki formatu, aby ułatwić sobie pracę. Powodem, dla którego nie używam 'git cherry-pick', jest przejście na nowy serwer dev i zasadniczo dostęp do git w trybie tylko do odczytu. Zamiast scp wszystkie moje katalogi kodu po prostu robię łatki do skopiowania. – redbmk

1

spróbuj git bundle przesłać określone części historii.

3

W Linuksie można rura swój delta-generator --- git-show lub git-diff, na przykład --- z komendy git-apply.

(Jest również prawdopodobne, bezpieczniej jest zawsze umożliwiają 3-way łączyć z opcją -3)

> git show <sha1> [<path>] | git apply -3 
> git diff <sha1-a> <sha1-b> [<path>] | git apply -3 

Przykłady:

  • stosują zmiany w określonym pliku wykonanej w abcdef:
> git show abcdef dir/file.c | git apply -3 
  • zastosować różnicę w pliku z dwóch różnych zobowiązuje abcdef i

> git diff abcdef 123456 foo.h | git apply -3

Patrz także: https://stackoverflow.com/a/12320940/1329340

Powiązane problemy