Innym podejściem jest zachowanie lokalnych zmian we wspólnych plikach konfiguracyjnych w innej gałęzi prywatnej. Robię to dla niektórych projektów, które wymagają kilku lokalnych zmian. Ta technika może nie mieć zastosowania we wszystkich sytuacjach, ale w niektórych przypadkach działa.
Najpierw tworzę nową gałąź na podstawie gałęzi master (w tym konkretnym przypadku używam git-svn, więc muszę zatwierdzić od mastera, ale nie jest to szczególnie ważne):
git checkout -b work master
Teraz zmodyfikuj pliki konfiguracyjne zgodnie z potrzebami i zatwierdź. Zwykle umieszczam w komunikacie o zmianach coś charakterystycznego, na przykład „NOCOMMIT” lub „PRIVATE” (będzie to przydatne później). W tym momencie możesz pracować na swojej prywatnej gałęzi, używając własnego pliku konfiguracyjnego.
Jeśli chcesz popchnąć swoją pracę z powrotem w górę, wybierz każdą zmianę ze swojej work
gałęzi do mastera. Mam skrypt, który pomoże mi to zrobić, który wygląda mniej więcej tak:
#!/bin/sh
BRANCH=`git branch | grep ^\\* | cut -d' ' -f2`
if [ $BRANCH != "master" ]; then
echo "$0: Current branch is not master"
exit 1
fi
git log --pretty=oneline work...master | grep -v NOCOMMIT: | cut -d' ' -f1 | tac | xargs -l git cherry-pick
To pierwsze sprawdzenie, czy jestem w master
oddziale (kontrola poczytalności). Następnie wyświetla listę wszystkich zatwierdzeń work
, odfiltrowuje te, które wspominają o słowie kluczowym NOCOMMIT, odwraca kolejność i ostatecznie wybiera każde zatwierdzenie (teraz od najstarszego) do master
.
Wreszcie, po wprowadzeniu zmian w master upstream, przełączam się z powrotem na work
i rebase:
git checkout work
git rebase master
Git ponownie zastosuje każde z zatwierdzeń w work
gałęzi, skutecznie pomijając te, które zostały już zastosowane podczas master
wybierania wiśniowego. Powinieneś pozostać tylko z lokalnymi zatwierdzeniami NOCOMMIT.
Ta technika sprawia, że proces wypychania jest nieco bardziej czasochłonny, ale rozwiązała problem, więc pomyślałem, że się nim podzielę.