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?