Git belirli bir işleme kadar çek


96

Bir yapmak istiyorum git pullama sadece belirli bir işleme kadar.

 A->B->C->D->E->F (Remote master HEAD)

Öyleyse başımın local masterişaret ettiğini varsayalım Bve ben de sonuna kadar çekmek istiyorum E. Ne yapmalıyım ?

Bu, belirli bir kaydetmeyi değil, belirli bir kaydetmeyi gerektirir.



3
git fetchve git merge E.
dürtmek

Şu anda B'deyim, ancak sadece C, E ve F'yi çekmek istiyorum. D'yi çıkarmak istiyorum. Teşekkürler!
Frenkey

@Frenkey, ustayı birleştirebilir, ardından son üç kaydı kaldırabilir ve ardından son ikisini kiraz seçebilirsiniz. Ayrıca daha kontrollü git birleştirme için yeniden
tabanlamayı

Ya sadece C'den değişiklikleri almak istiyorsam, sadece A ve B'deki değişiklikleri dahil etmiyorsam, sadece C? Bunu nasıl yapabilirim?
Vikas Chauhan

Yanıtlar:


113

git pullgit fetchonu takip etmekten başka bir şey değildir git merge. Yani yapabileceğin şey

git fetch remote example_branch

git merge <commit_hash>


"Şuna bakın" ne anlama geliyor?
developerbmw

@Brett Bağlantıyı göndermeyi unuttu .. tamamen kaldırıldı
unrealsoul007

@ unrealsoul007 bu sadece belirli bir commit'i birleştirecek değil mi? Yani B'den E'ye çekmek için komut git merge <commit_hash C> <commit_hash D> <commit_hash E> olacaktır, değil mi?
Wim Feijen

6
@WimFeijen tüm atalarıyla git merge Ebirleşecek ve (git bunu biliyor ve zaten sizin şubenizde oldukları için birleştirilmelerine gerek yok). YALNIZCA değişikliklerini istiyorsanız, bunun yerine yapmalısınız . ECDABEgit cherry-pick E
neXus

Cevap için teşekkürler arkadaşlar, ben de aynı sorunu arıyordum.
Akash Bisariya

21

İlk olarak, uzak depodan en son taahhütleri alın. Bu, yerel şubenizi etkilemeyecektir.

git fetch origin

Ardından, uzaktan izleme şubesini kontrol edin ve taahhütleri görmek için bir git günlüğü yapın

git checkout origin/master
git log

Birleştirmek istediğiniz commit'in commit karmasını (veya sadece ilk ~ 5 karakterini) alın ve bu commit'i master ile birleştirin

git checkout master
git merge <commit hash>

1
Size olumsuz oy verdim çünkü bu ilan edildiği gibi çalışmıyor. Her şeyden önce, "git fetch origin" yönteminiz ile tüm uzak dalları alır (bu, özellikle çok sayıda ve büyük dallı projelerde çalışan kişiler için açıkça belirtilmelidir). İkincisi, bu yöntemle "git merge <commit hash>", eğer geçmişe döndüyseniz, yerel geçmişinizi istenen commit ile birleştirmez. Örnek: Yerel olarak yürütme 100'desiniz, her şeyi getirerek 150'ye varmak istiyorsunuz (uzak HEAD 100'dür).
Yer tutucu

8
@Placeholder git fetchböyle saçmalıklar yazmadan önce kılavuzu okumalısınız . Dahası, orijinal soruyu ve cevabımı okumalısınız. Cevabımı takip ederseniz, kullanıcıya açıkça talimat verdiğim gibi "geçmişe geri dönmeyeceksiniz" git checkout master. Genel olarak, ne yaptığınız konusunda en az% 50 net değilseniz lütfen bir şeyler yayınlamayın.
developerbmw

1
Başkası için açık olmaması durumunda, git fetch originaçıkça menşei alır .
Daniel Farrell

2
Bu mükemmel çalışıyor ve kabul edilen cevaptan daha iyi açıklanıyor.
2019

1
En iyi cevap, Mükemmel Çalıştı
Asfandyar Khan

13

Ayrıca, en son yürütmeyi çekebilir ve istediğiniz işleme kadar geri alabilirsiniz:

git pull origin master
git reset --hard HEAD~1

masterİstediğiniz şubeyle değiştirin .

Geri dönmek istediğiniz işlemi görmek için git log'u kullanın:

git log

Şahsen, bu benim için daha iyi çalıştı.

Temel olarak, bunun yaptığı şey en son kaydetmeyi çekmektir ve taahhütleri tek tek manuel olarak geri alırsınız. Kaydetme geçmişini görmek için git log kullanın.

İyi noktalar: İlan edildiği gibi çalışır. Kaydetme karması kullanmak veya gereksiz dalları çekmek zorunda değilsiniz.

Kötü puanlar: Kayıtları birer birer geri almanız gerekir.

UYARI: Tüm yerel değişikliklerinizi taahhüt edin / saklayın, çünkü --hardsizinle birlikte onları kaybedeceksiniz. Kendi sorumluluğunuzdadır kullanın!


3
Neden olumsuz oylar verdiklerini bilmiyorum, bu en temiz yol gibi görünüyor ve güncelleşmek istediğinizde, diğer cevapların bazılarının aksine basit bir çekiş yapacak
Mauricio Pasquier Juan

Neden daha fazla olumlu oy kullanmayalım, tek dezavantajı HEADgeri dönmeden önce gitmeniz gerekmesidir - ve çatışmaları çözmek zorunda kalırsanız ne olacağını bilmiyorum. Ancak bu çözüm izin verir git pull --rebaseve söylenenin aksine, Nile git reset --hard HEAD~N(yani 3 kaydetme için) doğrudan önceki işlemlere geri dönebilirsiniz git reset --hard HEAD~3.
Stok Overflaw

2

Şubenize bir commit birleştirirseniz, aradaki tüm geçmişi almalısınız.

Gözlemek:

$ git init ./
/Users/dfarrell/git/demo/.git/ içinde başlatılmış boş Git deposu
$ echo 'a'> harf
$ git mektup ekle
$ git commit -m 'İlk Harf'
[ana (kök işleme) 6e59e76] Başlangıç ​​Mektubu
 1 dosya değiştirildi, 1 ekleme (+)
 100644 mektup modu oluştur
$ echo 'b' >> mektup
$ git mektup ekle && git commit -m 'Mektup ekleniyor'
[master 7126e6d] Harf ekleme
 1 dosya değiştirildi, 1 ekleme (+)
$ echo 'c' >> mektup; git add letter && git commit -m 'Mektup ekleniyor'
[master f2458be] Mektup ekleme
 1 dosya değiştirildi, 1 ekleme (+)
$ echo 'd' >> mektup; git add letter && git commit -m 'Mektup ekleniyor'
[master 7f77979] Harf ekleme
 1 dosya değiştirildi, 1 ekleme (+)
$ echo 'e' >> mektup; git add letter && git commit -m 'Mektup ekleniyor'
[master 790eade] Mektup ekleniyor
 1 dosya değiştirildi, 1 ekleme (+)
$ git günlüğü
790eade367b0d8ab8146596cd717c25fd895302a işlemek
Yazar: Dan Farrell 
Tarih: 16 Temmuz 14:21:26 2015 -0500

    Mektup ekleniyor

7f77979efd17f277b4be695c559c1383d2fc2f27 işlemek
Yazar: Dan Farrell 
Tarih: 16 Temmuz, 14:21:24 2015 -0500

    Mektup ekleniyor

işlemek f2458bea7780bf09fe643095dbae95cf97357ccc
Yazar: Dan Farrell 
Tarih: 16 Temmuz, 14:21:19 2015 -0500

    Mektup ekleniyor

7126e6dcb9c28ac60cb86ae40fb358350d0c5fad işlemek
Yazar: Dan Farrell 
Tarih: 16 Temmuz 14:20:52 2015 -0500

    Mektup ekleniyor

taahhüt 6e59e7650314112fb80097d7d3803c964b3656f0
Yazar: Dan Farrell 
Tarih: 16 Temmuz, 14:20:33 2015 -0500

    İlk mektup
$ git ödeme 6e59e7650314112fb80097d7d3803c964b3656f
$ git ödeme 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Not: '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad' kontrol edin.

'Ayrılmış KAFA' durumundasınız. Etrafa bakabilirsin, deneysel yapabilirsin
değişiklikleri yapın ve bunları uygulayın ve bunda yaptığınız herhangi bir taahhüdü iptal edebilirsiniz
başka bir kontrol gerçekleştirerek herhangi bir şubeyi etkilemeden durumu belirtin.

Oluşturduğunuz taahhütleri saklamak için yeni bir şube oluşturmak istiyorsanız,
bunu (şimdi veya daha sonra) checkout komutuyla tekrar -b kullanarak yapın. Misal:

  git checkout -b new_branch_name

HEAD şimdi 7126e6d'de ... Harf ekleniyor
$ git ödeme -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Yeni bir "B" şubesine geçildi
$ git çekme 790eade367b0d8ab8146596cd717c25fd895302a
ölümcül: '790eade367b0d8ab8146596cd717c25fd895302a' bir git deposu gibi görünmüyor
ölümcül: Uzak depodan okunamadı.

Lütfen doğru erişim haklarına sahip olduğunuzdan emin olun
ve depo var.
$ git birleştirme 7f77979efd17f277b4be695c559c1383d2fc2f27
7126e6d..7f77979 güncelleniyor
İleri sar
 mektup | 2 ++
 1 dosya değiştirildi, 2 ekleme (+)
$ kedi mektubu
a
b
c
d

1

Bu benim için çalışıyor:

git pull origin <sha>

Örneğin

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

Bu, 28eb00, ff39e4 ve daha önceki her şeyi çeker, ancak f4d10ad'yi çekmez. Pull --rebase kullanımına izin verir ve gitconfig'inizdeki çekme ayarlarını onurlandırır. Bu işe yarıyor çünkü temelde 28eb00'a bir dalmış gibi davranıyorsunuz.

Kullandığım git sürümü için, bu yöntem tam bir kesinleştirme karması gerektirir - kısaltmalara veya takma ada izin verilmez. Şunun gibi bir şey yapabilirsiniz:

[dbn src]$ git pull origin `git rev-parse origin/master^`
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.