2012-03-12 4 views
8

Wdrożyłem klasyczny workflow opiekuna OSS/contribute git workflow dla projektu firmy na githubie, jednak jeden przypadek na krawędziach daje dziwne wyniki, których nie jestem pewien.git pull --rebase upstream & git push origin odrzuca nie-szybkie przewijanie do przodu?

Powiedzmy, że istnieje typowy projekt, który rozwidlałem i dodawałem zdalnego pilota, aby był aktualny.

git clone [email protected]:kozhevnikov/<project>.git 
git remote add upstream [email protected]:<company>/<project>.git 

Dla celów tego przykładu to widelec ma już za kilka poprawek.

git reset --hard HEAD~5 && git push --force 

pracuję nad tym widelcem i wcisnąć jakieś rewizje, przed pchania mój ostatni popełnić i tworzenia żądania ściągania zaktualizować klon mojego widelca, aby upewnić się nie ma żadnych konfliktów.

touch foo && git add foo && git commit -m foo && git push 
touch bar && git add bar && git commit -m bar 

git pull --rebase upstream master 

From github.com:<company>/<project> 
* branch   master  -> FETCH_HEAD 
First, rewinding head to replay your work on top of it... 
Applying: foo 
Applying: bar 

Teraz, gdy próbuję pchnąć do mojego widelca, zostaje odrzucony.

git push 

To [email protected]:kozhevnikov/<project>.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '[email protected]:kozhevnikov/<project>.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

Co mam zrobić dalej? Chcę tylko, aby żądanie usunięcia zawierało zatwierdzenia typu "foo" i "bar", jednak ...

Kiedy I pull, żądanie pobrania zawiera duplikaty zatwierdzeń foo oraz dodatkowe scalenie.

git pull 
Merge made by the 'recursive' strategy. 

git push 

Na żądanie ściągania Github wygląda tak.

Showing 4 unique commits by 1 author. 
12345 
kozhevnikov foo 4 minutes ago 
67890 
kozhevnikov foo 4 minutes ago 
abcde 
kozhevnikov bar 2 minutes ago 
fghij 
kozhevnikov Merge branch 'master' of github.com:kozhevnikov/<project> just now 

Kiedy git pull --rebase zamiast pull, to w najlepszym razie będzie to Cudze zobowiązuje się do mojego wniosku końcówką (te z resetem), a co gorsza, że ​​daje mi scalić konfliktów.

Kiedy git push --force bez pull lub --rebase działa idealnie, ale jestem bardzo nieswojo mówiąc do każdego użycia siły lub czyni to część standardowego przepływu pracy, jak mogę sobie wyobrazić kilka osób lub małej podgrup współpracując na pojedynczym widelec i depczenie sobie nawzajem palców z wymuszonym pchnięciem.

Wszelkie pomysły? czego mi brakuje?

Odpowiedz

16

Kiedy

git pull --rebase upstream master 

jesteś przepisywanie swoją własną historię, ponieważ jesteś przebazowania swój główny oddział w sprawie zaktualizowanego upstream repozytorium. Kiedy naciskasz swoje repozytorium na gp rozwidlenia, skarżysz się. Musisz naciskać --force

git push --force origin master