2013-07-28 12 views
5

Co mogę zrobić, aby uniknąć następujący komunikat gdy wciskam gałąź funkcji po raz drugi:udało się wcisnąć niektóre pozycje literatury podczas pchania funkcji oddział

To https://github.com/xxx/git_test.git 
! [rejected]  feature_branch -> feature_branch (non-fast-forward) 
error: failed to push some refs to 'https://github.com/xxx/git_test.git' 
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') 
hint: before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

Co mogę zrobić, to w ten sposób:

git pull origin sprint_branch1 
git checkout -b feature_branch 

date > a.txt 
git add a.txt 
git commit -m 'added date' 

git push origin feature_branch 

ktoś zrobić przegląd kodu dla mojej funkcji, a ktoś inny zrobić zmiany w sprint_branch w tym czasie:

git checkout sprint_branch1 
date > a.txt 
git add a.txt 
git commit -m 'added another date' 
git push origin sprint_branch1 

muszę poprawić funkcję tak zrobić

git checkout feature_branch 
git fetch origin 
git rebase origin/sprint_branch1 

mogę scalić konfliktów i zrobić:

nano a.txt # removing inserted merge tags 
git add a.txt 
git rebase --continue 

potem poprawić swoją funkcję

date >> a.txt 
git add a.txt 
git commit -m 'add another date again' 

lubię wciskam feature_branch dla drugi przegląd

git push origin feature_branch 

Jednak pojawia się komunikat o błędzie wymieniony na górze. Git poleca mi używanie git pull, ale inni polecają mi użycie workflow. Co więc powinienem zrobić, aby przesunąć element feature_branch? Czy powinienem utworzyć nowy oddział o nazwie feature_branch_v2 i wypchnąć to? Czy muszę ręcznie zapamiętać, jakie pliki dodać do git w tym przypadku, czy powinienem dodać wszystko (tworząc niechlujny commit)? Czy istnieje lepszy sposób na wypychanie bez uzyskania tego komunikatu o błędzie?

Odpowiedz

1

Git mówi

hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') 
hint: before pushing again. 

Może wystarczy użyć obieg rebase ciągnąć rebase ze zdalnego oddziału po dokonaniu zatwierdzenia, a następnie nacisnąć na pilocie.

git commit -m 'add another date again' 
git pull --rebase 

Może to prowadzić do konfliktów, które zmieniają bazę trzeba by rozwiązać, a następnie kontynuować rebase. Jest to głównie spowodowane tym, że wersja drzewa w sprint_branch1 znajduje się za elementem feature_branch.

Powinieneś się upewnić, że również odpowiednie zatwierdzenia będą wprowadzane. W sensie ogólnym, gdy łączą się z sprint_branch1, że lepiej zrobić

git checkout feature_branch 
git merge sprint_branch1 

to zamiast rebase, ponieważ rebase przepisuje swoje rewizje, które mogą powodować problemy. Po scaleniu, jeśli po prostu wciśniesz, powinno działać poprawnie.

EDIT 1:

Jeśli trzeba zmieniają bazę i jeszcze uniknąć tego błędu, można użyć

git push --force origin feature_branch 

Jednak to nie jest szczególnie zalecany w rozproszonych zespołach, jak będzie przepisać zdalnej gałęzi Twój lokalny oddział, niezależnie od jakichkolwiek zmian, które inni mogliby do niego doprowadzić.

6

To gdzie poszło źle:

git rebase origin/sprint_branch1 

Nie należy rebase opublikowanych oddziałów. Polecenie to powinno być

git merge origin/sprint_branch1 

Generalnie należy być ostrożnym z git rebase - wydaje się, że jakiś rodzaj religii wokół niego, chociaż jest to bardzo niebezpieczne narzędzie.

Jak postępować?

  • Jeśli jesteś absolutnie pewien nikt inny nie będzie ponownie dotknąć gałąź funkcji i nikt nie zrobił w nim jakichkolwiek zmian od ostatniego uchwytu, można po prostu zrobić

    git push -f 
    

    To nadpisze HEAD na serwerze z HEAD.

  • Jeżeli jesteś pewien, że nie było żadnych zmian od twojej ostatniej ciągnąć, ale inni ludzie wykorzystują swoją filię, można wykonać powyższe i powiedzieć wszystkim z kopią swojej branży, że trzeba uruchomić

    git fetch origin 
    git checkout feature_branch 
    git reset --hard origin/feature_branch 
    

    To spowoduje usunięcie wszystkich zmian lokalnych od czasu ostatniego naciśnięcia.

  • Najbezpieczniej byłoby, aby zmienić nazwę lokalnego feature_branch do somethengi indziej znaleźć zobowiązuje dodanych, oddział obecnych origin/feature_branch i cherry-pick wszystkich zmian.

Uruchom gitk feature_branch origin/feature_branch, aby zrozumieć, co się dzieje.

+0

'git push -f' Zrobiłem to dzisiaj," straciłem "99 zobowiązań ze zdalnej historii. Oczywiście mogłem zabrać ich z powrotem do pilota, ale zajęło to naprawdę dużo czasu i próbowało. – hek2mgl

Powiązane problemy