Mam problem z wykonaniem selekcji. Na moim komputerze lokalnym jestem obecnie w gałęzi „master”. Chcę wybrać najlepszy wybór w zatwierdzeniu z innej gałęzi o nazwie „zebra”. Gałąź „zebra” to gałąź zdalna.
Więc status git:
# On branch master
nothing to commit (working directory clean)
Ok, teraz próbuję wybrać najlepsze zatwierdzenie, które chcę:
git cherry-pick xyz
fatal: bad object xyz
gdzie "xyz" to sygnatura interesującego mnie commita, który wydarzył się na gałęzi "zebra".
Więc pierwsze oczywiste pytanie brzmi: dlaczego git nie może znaleźć commita, do którego się odwołuję? Szczerze mówiąc, nie rozumiem, jak to działa. Czy git przechowuje coś w rodzaju bazy danych zmian lokalnie w moim katalogu roboczym dla wszystkich innych gałęzi? Czy podczas wykonywania polecenia cherry-pick przeszukuje lokalną bazę danych, aby znaleźć zatwierdzenie, o którym mówię?
Ponieważ „zebra” to zdalna gałąź, pomyślałem, że nie mam lokalnie jej danych. Więc zmieniłem gałęzie:
git checkout zebra
Switched to branch 'zebra'
Więc teraz na moim komputerze lokalnym widzę, że pliki w katalogu poprawnie odzwierciedlają stan zebry. Przełączam się z powrotem na master, próbuję ponownie wybrać cherry-pick (mając nadzieję, że dane dotyczące zmian są teraz dostępne), ale mam ten sam problem.
Mam fundamentalne niezrozumienie tego, co się tutaj dzieje, każda pomoc byłaby świetna.
Odpowiedzi:
Masz rację, że nie masz odpowiednich danych, ale próbowałeś je rozwiązać w niewłaściwy sposób. Aby zebrać dane lokalnie ze zdalnego źródła, musisz użyć
git fetch
. Kiedy to zrobiłeśgit checkout zebra
, przełączyłeś się na stan tej gałęzi przy ostatnim pobieraniu. Więc najpierw pobierz z pilota:źródło
Jako dodatek do zaakceptowanej odpowiedzi OP:
Jeśli masz problemy z
to dlatego, że nie masz dostępu do tego zatwierdzenia. Co oznacza, że nie masz tego repozytorium przechowywanego lokalnie. Następnie:
Gdzie xxxxxxx to skrót zatwierdzenia, który chcesz.
źródło
Dodanie zdalnego repozytorium (jako „foo”), z którego chcemy wybierać
Przynieś ich gałęzie
Wymień ich zatwierdzenia (powinno to zawierać listę wszystkich zatwierdzeń w pobranym
foo
)Wybierz zobowiązanie, którego potrzebujesz
źródło
Po scaleniu gałęzi programistycznej do mastera zwykle usuwam gałąź programistyczną. Jeśli jednak chcę wybrać zmiany w gałęzi programistycznej, muszę użyć skrótu zatwierdzenia scalającego, aby uniknąć błędu „złego obiektu”.
źródło
Najpierw musisz pobrać dane obu gałęzi z dysku lokalnego.
To, co się dzieje, to próba wybrania z gałęzi-a do gałęzi-b, gdzie obecnie znajdujesz się na gałęzi-b, ale lokalna kopia gałęzi-a nie jest jeszcze aktualizowana (musisz wykonać git pull on najpierw obie gałęzie).
kroki:
- git checkout branch-a
- git pull origin branch-a
- git checkout branch-b
- git pull origin branch-b
- git cherry-pick <hash>
dane wyjściowe:
[gałąź-b <hash>] dane dziennika
Autor: Autor <Autor
1 plik zmieniony, 1 wstawienie (+), 3 usunięcia (-)
źródło
Ten błąd został zwrócony po użyciu identyfikatora zatwierdzenia z karty identyfikatora zatwierdzenia żądania ściągnięcia. To zatwierdzenie zostało następnie zgniecione i scalone. W żądaniu ściągnięcia github poszukaj tego tekstu: "scalone zatwierdzenie xxxxxxx w ..." zamiast próbować użyć identyfikatorów zatwierdzeń z zakładki zatwierdzeń.
źródło
Zatwierdzenie powinno być obecne w twoim lokalnym, sprawdź używając
git log
.Jeśli nie ma zatwierdzenia, spróbuj
git fetch
zaktualizować lokalny najnowszym pilotem.źródło
Można to również łatwo osiągnąć za pomocą SourceTree:
Gotowe :)
źródło
Jeśli pobrałeś, ale nadal tak się dzieje, przyczyną może być następujący powód.
Może się zdarzyć, że commit, który próbujesz wybrać, nie należy już do żadnej gałęzi. Może się to zdarzyć podczas zmiany bazy.
W takim przypadku w zdalnym repozytorium:
git checkout xxxxx
git checkout -b temp-branch
Następnie w repozytorium ponownie pobierz. Nowa gałąź zostanie pobrana, łącznie z tym zatwierdzeniem.
źródło
Rozwiązałem ten problem, przechodząc do gałęzi z zatwierdzeniem, które chcę wybrać.
użyj dziennika, aby znaleźć skrót zatwierdzenia
po znalezieniu skrótu wycinania i wklejania na notatniku. jeśli używasz polecenia, po prostu przewiń w górę, aby uzyskać hash, a następnie pobierz gałąź, w której chcesz umieścić zatwierdzenie.
na koniec wywołanie cherry-pick z git (note) -x polega na dołączeniu wiadomości cherry-pick do oryginału. „Podczas nagrywania zatwierdzenia, dołącz wiersz z napisem„ (wybrana wiśnia z zatwierdzenia…) ”do pierwotnego komunikatu o zatwierdzeniu, aby wskazać, z którego zatwierdzenia została wybrana ta zmiana.”
źródło