Uzak bir şubeden nasıl kiraz toplanır?


135

Kiraz toplama yapmakta sorun yaşıyorum. Yerel makinemde şu anda "ana" şubemdeyim. Başka bir daldan "zebra" adlı bir taahhütte kiraz toplamak istiyorum. "Zebra" dalı uzak bir daldır.

Yani git durumu:

# On branch master
nothing to commit (working directory clean)

Tamam, şimdi istediğim taahhüdü seçmeye çalışıyorum:

git cherry-pick xyz
fatal: bad object xyz

burada "xyz" ilgilendiğim işlemin imzasıdır, "zebra" dalında meydana gelmiştir.

Öyleyse ilk bariz soru şudur: Git neden referans verdiğim commit'i bulamıyor? Dürüst olmak gerekirse ilk etapta bunun nasıl çalıştığını gerçekten anlamıyorum. Git, diğer tüm dallar için çalışma dizinimde yerel olarak işlemlerin bir veritabanı gibi bir şey depoluyor mu? Cherry-pick komutunu çalıştırırken, bahsettiğim commit'i bulmak için o yerel veritabanını arıyor mu?

"Zebra" uzak bir dal olduğundan, verilerine yerel olarak sahip olmadığımı düşünüyordum. Ben de dalları değiştirdim:

git checkout zebra
Switched to branch 'zebra'

Şimdi burada yerel makinemde, dizindeki dosyaların zebra'nın durumunu doğru şekilde yansıttığını görebiliyorum. Ustaya geri dönüyorum, tekrar seçmeyi deniyorum (commit verilerinin şimdi mevcut olmasını umuyorum), ama aynı sorunu yaşıyorum.

Burada neler olup bittiğine dair temel bir yanlış anlama var, herhangi bir yardım harika olur.


2
kavramsal olarak her şey doğru görünüyor. commit için doğru hash (sizin deyiminizle imza) kullandığınızdan emin misiniz? doğrulamak için 'git show <hash>' deneyin.
0xc0de

Merhaba, evet olumlu - her iki şubem de github'da ve bunları bu şekilde commit sayfalarını bulmak için kullanabilirim. Anlarsam, makinemin yerel olarak durumu öyle ki git, 'usta' bağlamında iken 'zebra'dan hash bulamaz. Ona bir şekilde 'zebra'nın da yerel olarak var olduğunu söylemem gerekiyor mu?
user291701

oh ve 'git show xyz' yapmak aynı hatayı veriyor "fatal: bad object". (ve xyz'i doğru hash ile değiştiriyorum).
user291701

Ve açıklığa kavuşturmak için, " github.com/me/test/commit/xyz " gibi sorun olmadan github'daki commit'e bakmak için 'xyz' hash'imi kullanabilirim .
user291701

Yanıtlar:


195

"Zebra" uzak bir dal olduğundan, verilerine yerel olarak sahip olmadığımı düşünüyordum.

Doğru verilere sahip olmadığınız konusunda haklısınız, ancak yanlış şekilde çözmeye çalışıyorsunuz. Uzak bir kaynaktan yerel olarak veri toplamak için kullanmanız gerekir git fetch. Bunu yaptığınızda git checkout zebra, en son aldığınız o şubenin durumu neyse ona geçtiniz. Öyleyse önce uzaktan kumandadan getirin:

# fetch just the one remote
git fetch <remote>
# or fetch from all remotes
git fetch --all
# make sure you're back on the branch you want to cherry-pick to
git cherry-pick xyz


1
Github'da bir yukarı akış düzeltmesi için bu yaklaşımı denedim ve teslim alınan hash'in Github'dakinden farklı olduğu ortaya çıktı. Bu yüzden kontrol etmeliydim, esrar almalı ve onu seçmeliydim.
DustWolf

1
Burada gerçekten kiraz toplama modunda uzaktan geçme seçeneği eksik: git kiraz-toplama <remote> <hash>
Jared

uzak dalı getirdikten sonra iyi çalıştı. Teşekkürler :)
Adeel

evet benim için getirdikten sonra da çalıştı. Git kiraz-toplama hakkında daha fazla bilgi için atlassian.com/git/tutorials/cherry-pick
Satheesh M

12

OP'nin kabul ettiği cevaba ek olarak:

İle sorun yaşıyorsanız

fatal: bad object xxxxx

çünkü bu işleme erişiminiz yok. Bu, yerel olarak depolanmış deponuz olmadığı anlamına gelir. Sonra:

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx

Xxxxxxx, istediğiniz kaydetme hashidir.


hmm depoyu yukarı akış bayrağı olmadan zaten eklediğimde?
Gobliins

10

Seçmek istediğimiz uzak repo ("foo" olarak) eklemek

$ git remote add foo git://github.com/foo/bar.git

Şubelerini getir

$ git fetch foo

Kayıtlarını listeleyin (bu, getirilen tüm kayıtları listelemelidir foo)

$ git log foo/master

İhtiyacınız olan taahhüdü özenle seçin

$ git cherry-pick 97fedac

5

Bir geliştirme dalını uzmanlaşmak için birleştirdikten sonra, genellikle geliştirme dalını siliyorum. Ancak, geliştirme dalındaki taahhütleri kiraz seçmek istersem, "kötü nesne" hatasını önlemek için birleştirme kesinleştirme hash'ını kullanmam gerekir .


3

Önce yerel sürücünüzdeki her iki dal verisini de çekmeniz gerekir.

Olan şey şu anda dal-a'dan dal-b'ye, şu anda dal-b üzerindesiniz, ancak dal-a'nın yerel kopyası henüz güncellenmedi (bir git çekme işlemi yapmanız gerekir) önce her iki şube).

adımlar:
- git checkout branch-a
- git pull origin branch-a
- git checkout branch-b
- git pull origin branch-b
- git cherry-pick <hash>

çıktı:
[branch-b <hash>] günlük verisi
Yazar: Yazar <Yazar
1 dosya değiştirildi, 1 ekleme (+), 3 silme (-)


1

Bir çekme isteği işleme kimliği sekmesinden kaydetme kimliğini kullandıktan sonra bu hatayı döndürdüm. Bu taahhüt daha sonra ezildi ve birleştirildi. Github çekme isteğinde, kaydetme sekmesindeki commit kimliklerini kullanmaya çalışmak yerine şu metni arayın: "birleştirilmiş commit xxxxxxx ...".


1

Kaydetme yerelde mevcut olmalıdır, kullanarak kontrol edin git log.

Kayıt mevcut değilse git fetch, yerel olanı en son uzaktan kumanda ile güncellemeyi deneyin .


0

Bu, SourceTree ile de kolayca elde edilebilir:

  • ana şubenizi kontrol edin
  • "Günlük / Geçmiş" sekmesini açın
  • xyz kaydını bulun ve üzerine sağ tıklayın
  • "Birleştir ..." i tıklayın

bitti :)


Bu yanlış. Çünkü şimdi sadece seçilen commit'ler yerine HEAD of master'ı zebra ile birleştiriyorsunuz.
Şef Firavun

0

Getirdiyseniz, ancak yine de bu oluyorsa, aşağıdakiler bir neden olabilir.

Seçmeye çalıştığınız commit artık herhangi bir şubeye ait olmayabilir. Bu, yeniden baz aldığınızda olabilir.

Böyle bir durumda uzak depoda:

  1. git checkout xxxxx
  2. git checkout -b temp-branch

Sonra deponuzda tekrar getirin. Bu kayıt dahil olmak üzere yeni şube getirilecektir.


0

Bu sorunu, kiraz almak istediğim commit ile şubeye giderek çözdüm.

git checkout <branch With Commit To Cherry-Pick>

commit karmasını bulmak için günlük kullanın

git log

not defterinde hash'inizi kesip yapıştırın. Komutu kullanıyorsanız, hash'i almak için yukarı kaydırın, ardından commit'i yerleştirmek istediğiniz dalı kullanıma alın.

git checkout < branch I Want To Place My Cherry-Picked-Hash In>

son olarak git (not) -x'den kiraz-çekme çağrısı yapın, kiraz-çekme mesajınızı orijinaline eklemektir. "İşlemi kaydederken, bu değişikliğin hangi işlemeden seçildiğini belirtmek için orijinal commit mesajına" (commit'den seçilen kiraz ...) "yazan bir satır ekleyin."

git cherry-pick -x <your hash commit to add to the current branch>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.