Önceki taahhütlere değil, belirli bir taahhüdü uzaktan kumandaya nasıl iletebilirim?


Yanıtlar:


1087

İtmek için içinden yukarı belirli bir taahhüt yazabilirsiniz:

git push <remotename> <commit SHA>:<remotebranchname>

sağlanan <remotebranchname>uzaktan kumandada zaten var. ( git push <remotename> <commit SHA>:refs/heads/<remotebranchname>Başlamazsa , otomatik oluşturmak için kullanabilirsiniz .)

Önceki taahhütleri zorlamadan bir taahhüdü zorlamak istiyorsanız, önce taahhütleri git rebase -iyeniden sipariş etmek için kullanmalısınız .


66
git push <remotename> <commit SHA>:<remotebranchname>İşler. hile, git rebase -iilk taahhüt olarak istediğiniz taahhüdü taşımak için birleştirmek ve taahhüt-sha
dminer

29
Başka bir ipucu da size itmek istiyor taahhüt ait SHA kopyalamak emin olmaktır sonra ben sadece :) yaptığım gibi, daha önce Rebase -i yapıyor değil
estan

33
Uzak dal henüz mevcut değilse, bunun başarısız olduğunu unutmayın. Şube oluşturmak ile yapılabilir git push <remotename> <commit SHA>:refs/heads/<new remote branch name>. Bundan sonra, cevabın açıkladığı gibi itin.
Wes Oldenbeuving

32
Örneğin, son standart dışında her şeyi bazı standart isimlerle zorlamak git push origin HEAD~1:master.
sanatsız gürültü

3
Ayrıca, daha sonra bir SHA'yı o uzak şubeye daha önce ittiyseniz, bunu zorla itmeniz gerektiğini unutmayın. -fBayrağı kullanın .
Ian Vaughan

79

Diğer cevaplar yeniden sıralama açıklamalarında eksik.

git push <remotename> <commit SHA>:<remotebranchname>

tek bir taahhüdü zorlayacak, ancak bu taahhüt, bence belirsiz açıklamalar olan üst, ilk veya ipucu taahhüdüyle karıştırılmaması gereken yerel, bastırılmamış, taahhütlerinizin EN YAŞLI olması gerekir. Taahhüt, taahhütlerinizin en eskisine, yani en son taahhüdünüzden en uzağa ihtiyaç duyar. En eski taahhüt değilse, en eski, yerel, itilmemiş SHA'nızdan belirtilen SHA'ya yapılan tüm taahhütler itilecektir. Taahhütleri yeniden sıralamak için şunu kullanın:

git rebase -i HEAD~xxx

Taahhüdü yeniden sıraladıktan sonra güvenli bir şekilde uzak depoya itebilirsiniz.

Özetlemek gerekirse,

git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master

Uzak ana şubeme tek bir taahhütte bulunmak.

Referanslar:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/

Ayrıca bakınız:

  1. git: Yerel Rebase Sonrası Yinelenen İşlemler Takip Etti
  2. git: Tek Taahhütleri Zorlamak, Rebase ile Yeniden Sıralama, Yinelenen Taahhütler

3
Bazı kökenler buna izin vermeyebilir, öyle görünüyor. Örneğin GitLab ile 'Bu projede korumalı bir şubeye push kodunu zorlama izniniz yok' ifadesini görüyorum. Bu biraz tuhaf çünkü hiçbir şeyi zorladığımı düşünmedim, sadece normal bir itme yapıyordum. 'Zorlama' olmadan nasıl yapılacağına dair bir fikrin var mı?
Ed Avis

1
@Ed Shoudln zorla itmeye gerek yok. Özel git kurulumunuzla ilgili bir sorununuz olduğu anlaşılıyor. Belki de uzak HEAD taahhüdünü geçtiniz mi? Korumalı bir dalın ne olduğunu bilmiyorum, kulağa izin sorunu gibi geliyor.
Samuel

1
Samuel - bu mantıklı olurdu, ama git rebase -i size sadece uzak HEAD'den daha sonra olan yerel taahhütleri gösterir, bu yüzden bunu nasıl yapabileceğimi bilmiyorum.
Ed Avis

1
Samuel - gerçekten şimdi kısmi itmeler yapabilirim, bu yüzden neyin yanlış gittiğini bilmiyorum ama uzak HEAD'den türetilmemiş bir taahhüdü şu ya da bu şekilde itmeye çalışıyor olmalı.
Ed Avis

1
@Ed "git rebase -i size yalnızca uzak HEAD'den daha sonra olan yerel taahhütleri gösterir" dediniz, bunun doğru olduğunu düşünmüyorum. Uzak HEAD'ı test ettim ve yeniden pazarlamayı başardım.
Samuel

25

Ben kullanmanızı öneririm git rebase -i; itmek istediğiniz taahhüdü yaptığınız taahhütlerin üstüne taşıyın. Ardından git log, yeniden temel alınan taahhüdün SHA'sını almak için kullanın , kontrol edin ve itin. Rebase, diğer tüm taahhütlerinizin artık ittiğiniz kişinin çocukları olmasını sağlayacaktır, bu nedenle gelecekteki itmeler de iyi çalışacaktır.


3
Belki bir hamle tam bir örnek verebilir misiniz esp. re git logadımı?
Drux

4
Diyelim ki "A", "B", "C" mesajlarıyla ilgili olarak birbirinden bağımsız 3 taahhüdünüz var ve "B" ye basmak istiyorsunuz. 'git rebase -i' sizi ve editörleri üçünü de listelemelidir; B'yi yukarı hareket ettirin ve kaydedin / çıkın. 'git log --pretty = oneline -n3' her mesajdan önce karmaları olan B, A, C'yi listeleyecek, B şimdi son olacak. 'git checkout -b temp $ hash_of_B; git push 'B'yi o noktada itmelisiniz. O zaman muhtemelen 'git checkout -b master; git branch -d temp ', yerel ana dalınızda olduğunuzu varsayarak önceki durumunuza geri dönmek için; uygun şekilde değiştirin.
Walter Mundt

1
+1 Rebase-push-rebase'den sonra hiç "git tanrılarının gazabıyla " karşılaştınız mı? (
Muhtemelen

2
Cevabımı dikkatlice okursanız, itmenin yalnızca yeniden tabandan sonra gerçekleştiğini ve yeniden temel alınan taahhüdün yalnızca henüz itilmemiş diğer komisyonların üzerine taşındığını görürsünüz . Bir taahhüt itildikten sonra, genellikle taş olarak kabul edilmelidir; gelecekteki yeniden basmada yalnız bırakın. Bu teknik yalnızca, birden fazla yerel değişikliği itmeden önce iyi bir sıralamaya göre sıralayabilirsiniz. İzleme ayarlarınız doğru şekilde yapıldıysa, başka hiçbir argümana sahip olmayan 'git rebase -i' varsayılan olarak size itilmiş taahhütleri göstermeyecektir, bu nedenle kazalardan diğer yöntemlerden daha güvenlidir.
Walter Mundt

21

Kiraz toplama, belirli bir taahhüdü zorlarken diğer tüm yöntemlerle karşılaştırıldığında en iyi şekilde çalışır.

Bunu yapmanın yolu:

Yeni bir şube oluştur -

git branch <new-branch>

Yeni şubenizi başlangıç ​​şubenizle güncelleyin -

git fetch

git rebase

Bu eylemler, kaynağınızla tamamen aynı şeylere sahip olduğunuzdan emin olmanızı sağlayacaktır.

Kiraz- sha iditmek istediğiniz şeyi seçin -

git cherry-pick <sha id of the commit>

Sen sha idçalıştırarak alabilirsiniz

git log

Menşeinize itin -

git push

gitkHer şeyin istediğiniz gibi göründüğünü görmek için koşun .


2
git rebase -iYukarıdaki çözümlerde önerildiği gibi kullanmak ideal bir çözüm olacaktır. Kiraz toplama sadece taahhüdü çoğaltmak istediğinizde kullanılmalıdır.
Vinay Bhargav

13

Sanırım bu işleme geri dönmeniz ve sonra da itmeniz gerekecek. Ya da cherry-pickyeni bir şubeye girişebilir ve bunu uzak depodaki şubeye gönderebilirsiniz. Gibi bir şey:

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}

9
git
revert

1
@hasen: O cherry-pickzaman istediğin işi yapabilirsin .
Josh K

4
hem geri alma hem de kiraz toplama kötü fikirlerdir. git rebase -i burada arkadaşın, aşağıdaki Walter Mundt'un cevabına bakınız.
Nicolas C

3
@Nicolas, kiraz toplama neden kötü bir fikir?
Antoine

3
@Antoine, genellikle dalınızın başlangıç ​​noktasında izlediği dalla senkronize olmasını istiyorsunuz. Kiraz seçerseniz, bir kopyala / yapıştır yaparsınız ve bir noktada itilmemiş kopyayla uğraşmanız gerekir. -İ'yi yeniden adlandırırsanız, "kes ve yapıştır" yapar ve dalınızı uzaktan kumandayla istediğiniz yerde senkronize halde tutarsınız.
Nicolas C

0

Ayrıca başka bir dizinde şunları da yapabilirsiniz:

  • git clone [deponuz]
  • Orijinal deponuzdaki .git dizininin üzerine, şu anda klonladığınız deponun .git dizini üzerine yazın.
  • git orjinali ekle ve git
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.