2013-03-26 10 views
15

Jako część naszego ciężkiego workflow rebase, mam nadzieję użyć scalenia w głównej gałęzi. W szczególności chcę scalić tylko wtedy, gdy gałąź tematu została ponownie wylosowana na ostatnim master commit, powodując, że dowolne scalenie jest szybkie. Mogę to osiągnąć za pomocą:Jak osiągnąć `git --no-ff --ff-only` które jest niedozwolone

git merge --ff-only

Ponadto chciałbym nagrać integrację branży tematu z pustym popełnić dlatego chciałbym użyć --no-FF, który wymusza to zachowanie :

git merge --no-ff

Co naprawdę chcę, chociaż jest kombinacją zarówno: połączyć tylko wtedy, gdy jest to trywialne, ale pozwól mi nagrać go i tak. Git uważa, że ​​

fatal: You cannot combine --no-ff with --ff-only.

który pojawia się oczywiste dla niektórych.

git merge --edit --no-ff topicbranch

nie osiąga zachowanie chcę albo. W jaki sposób mogę scalić z opcją --no-ff, czy dana gałąź tematów jest ponownie bazowana na ostatnim zatwierdzeniu głównym?


AKTUALIZACJA: Wygląda na to, że odpowiedź Charlesa Baileya wystarczy. Jeśli chcesz umieścić to w aliasie git, możesz to wydać:

git config --global alias.integrate '!test "$(git merge-base HEAD "$1")" = "$(git rev-parse HEAD)" && git merge --no-ff --edit $1 || echo >&2 "Not up-to-date; refusing to merge, rebase first!"' 

Trochę kęsa, ale działa. Zanotuj siłę edycji komunikatu zatwierdzenia z opcją --edit.

+0

Dlaczego oczywistość fałszywe? '--ff-only' mówi, że nie chcę dokonywać żadnych scaleń. Po prostu chcę przenieść lokalny oddział do przodu - jeśli to możliwe - do tej wskazówki; '--no-ff' mówi, że * chcę *, aby dokonać scalenia między tu i tam, nawet jeśli było możliwe proste przeniesienie lokalnego oddziału do przodu. Nawiasem mówiąc, nie widzę, gdzie określasz '--ff-only', więc nie widzę, skąd błąd pochodzi. –

+0

Opcja --ff-only jest wydawana w tytule. Zmienię tekst, aby był jaśniejszy. I używam -ff-only jako sprawdzenia, aby sprawdzić, czy scalanie jest trywialne. @ CharlieBailey, uważam, że jesteś dość liberalny z twoimi głosami w dół. TSK TSK. – DrSAR

+3

Więc w zasadzie nie chcesz '--ff-only' ponieważ * chcesz * chcesz dokonać scalenia commit. Test możesz wykonać jako osobny krok: np. 'test $ (git merge-base gałąź tematów HEAD) = $ (git rev-pars HEAD) && git merge --no-ff topicbranch' –

Odpowiedz

7

Nie chcesz --ff-only, ponieważ chcesz dokonać scalenia, które zostanie zablokowane przez --ff-only.

Wybrany czek może zostać wykonany jako osobna kontrola przed uruchomieniem polecenia scalania. Możesz spakować to w prostą funkcję powłoki.

E.g.

merge_if_ahead() { 
    if test "$(git merge-base HEAD "$1")" = "$(git rev-parse HEAD)"; then 
     git merge --no-ff "$1" 
    else 
     echo >&2 "Not up to date; refusing to merge" 
     return 1 
    fi 
} 
+0

Witam, czy masz jakiś pomysł, czy mogę go użyć do wymuszenia na Bitbucket lub Github? Czy można to osiągnąć za pomocą Haczyków Git? –

2

Utworzyłem alias, który pracuje dla moich prostych testów

git config --global alias.ffmerge '!sh -c "git merge --ff-only $1 && git reset --hard [email protected]{1} && git merge --no-ff $1" -' 

Składa się z 3 komend, jedna po drugiej, że nie uda, jak tylko pierwsza zawiedzie. Objaśnienie każdej z nich:

git merge --ff-only $1 

Wykonanie błędu nie powiedzie się, jeśli scalanie nie może być kontynuowane jako szybkie scalanie. ($ 1 to nazwa oddziału przekazany jako argument)

git reset --hard [email protected]{1} 

Jeśli pierwsze polecenie powiedzie to oznacza, że ​​możemy zrobić szybki napastnik seryjnej ale jak chcemy zrobić scalającej będziemy przenieść z powrotem do stanu HEAD tuż przed naszym (udanym) scaleniem. HEAD @ {1} jest wskaźnikiem reflog.

git merge --no-ff $1 

Teraz zrobimy prawdziwy seryjnej z seryjnej popełnić nawet jeśli scalanie może przejść głową, szybko do przodu.

Proste połączenie z git ffmerge zrobi dla nas wszystko, jedyny krok, który może się nie powieść, jest pierwszy i pozostawi nas w niezmienionej kopii roboczej, jak wcześniej.

Jak zawsze z git reset --hard kopia robocza powinna być czysta.

+0

Resetuj mocno, wyrzuci wszystkie niezaprogramowane zmiany. Jest to niepotrzebne i niebezpieczne w kontekście tego, co faktycznie należy sprawdzić. (Powinieneś tylko sprawdzić, czy szybkie przekierowanie jest możliwe, ale teraz możesz _będzie_, ale nie sprawdzaj, czy są obecne zmiany etapowe lub niezaprogramowane.) –

+0

@Andreas Wederbrand Dzięki za to. Pomimo twardego, twardego resetu, działa on dla moich celów (i jest mniej zależny od problemów powłoki, takich jak -z rozwiązanie). Otrzymujesz +1, aby zrekompensować okrutne nawyki głosowania innych ludzi. Mimo że postaram się, aby rozwiązanie berealowe znalazło się w działającym aliasie. – DrSAR

+0

Zgadzam się, że resetowanie - może być niebezpieczne i dlatego wspomniałem, że kopia robocza powinna być czysta. Ten rodzaj scaleń zwykle ma miejsce na maszynie scalającej, w której nic się nie dzieje. –

1
git config alias.mff '!mff() { git merge --ff-only "$1" && git reset --hard [email protected]{1} && git merge --no-ff "$1"; }; mff' 

i od tej pory

git mff other-branch 
+0

Jak to się różni od odpowiedzi @ andreas-wederbrand? – DrSAR

+1

Och, właściwie przeoczyłem jego rozwiązanie. Ale jak pytasz, moje rozwiązanie nie uruchamia nowego pliku 'sh', ale po prostu definiuje wywoływaną funkcję. Pozwala to zaoszczędzić na kosztach rozpoczęcia kolejnego procesu. – Vampire