Bir çatalı temizleyin ve yukarı akıştan yeniden başlatın


396

Bir havuzu çatalladım, sonra bazı değişiklikler yaptım ve her şeyi berbat ettim.

Çalışmamın temeli olarak mevcut yukarı akım / master'ı kullanarak sıfırdan tekrar başlatmak istiyorum.
Depomu yeniden adlandırmalı mıyım veya silmeli miyim?


4
Basit bir soruya çok karmaşık cevaplar. Her şeyi silin ve veri havuzunu yeniden klonlayın.
Yaza

1
@Yaza, hayır, bu bazı senaryolarda daha da sıkıntıya neden olabilir.
Shimmy Weitzhandler

@ shimmy, OP'nin istediği gibi sıfırdan tekrar başlamak istiyorsanız değil.
Yaza

Yanıtlar:


796

En basit çözüm ( upstreamorijinal repo çatalını referans alan uzak ad olarak ' ' kullanarak ) olacaktır:

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(Bu GitHub sayfasına benzer şekilde , "Kötü bir durumdaysam ne yapmam gerekir?" Bölümü )

masterŞube üzerinde yapılan değişiklikleri kaybedebileceğinizi unutmayın (hem yerel, hem reset --hardde uzak tarafta, çünkü push --force).

Bir alternatif, taahhütlerinizi korumak istiyorsanız master, bu taahhütleri akımın üzerinde tekrar oynatmaktır upstream/master.
Sıfırlama parçasını a ile değiştirin git rebase upstream/master. O zaman hala zorla itmeye ihtiyacınız olacak.
Ayrıca bkz. " Kötü bir durumdaysanız ne yapmalıyım? "


Mevcut çalışmanızı yedekleyen daha eksiksiz bir çözüm (her ihtimale karşı) " Git ana dalını temizleme ve bazı taahhütleri yeni şubeye taşıma " bölümünde ayrıntılı olarak açıklanmıştır .

Ayrıca " " ne olduğunu göstermek için " Orijinal GitHub veri havuzundan yeni güncellemeleri çatallı GitHub veri havuzuna alma " konusuna bakın upstream.

akıntıya karşı


Not: Son GitHub depoları şubeye karşı koruma sağlarmasterpush --force .
Bu yüzden masterönce korumayı kaldırmanız gerekir (aşağıdaki resme bakın) ve ardından zorla ittikten sonra yeniden korumalısınız .

resim açıklamasını buraya girin


Not: GitHub'da özellikle, yukarı akışta birleştirilen çekme istekleri için çatallı depoları silmek için bir kısayol var (Şubat 2019) .


4
merhaba, harika çalıştı! btw doğru sıfırlama sözdizimigit reset --hard upstream/master
tampe125

1
@ tampe125 Mükemmel. git resetCevabın sözdizimini düzelttim .
VonC

ölümcül: 'akış yukarı' git deposu gibi görünmüyor
Benubird

@Benubird, orijinal repoya (çatalladığınız) başvuran uzaktan kumandanın adıdır: grafiğe ve stackoverflow.com/a/3903835/6309'daki " git remote" komutlarına bakın .
VonC

Doğru, ancak sorunuzun nasıl ayarlanacağı belli değil, çünkü varsayılan olarak 'upstream' komut satırında github ile çatallandığım gibi tanımlanmadı.
Benubird

31

VonC'nin cevabını seviyorum. İşte yeni başlayanlar için kolay bir sürümü.

Orada originhepiniz farkında eminim denilen bir git uzaktan var . Temel olarak, git deposuna istediğiniz kadar uzaktan kumanda ekleyebilirsiniz. Yani, yapabileceğimiz, çatal değil orijinal repo olan yeni bir uzaktan kumanda tanıtmak. Aramayı severimoriginal

Uzaktan kumanda olarak çatalımıza orijinal repoları ekleyelim.

git remote add original https://git-repo/original/original.git

Şimdi en son kodladığımızdan emin olmak için orijinal depoyu getirelim

git fetch original

VonC'nin önerdiği gibi, usta olduğumuza emin olun.

git checkout master

Şimdi çatalımızı orijinal repo'daki en son kodla hızlandırmak için, tek yapmamız gereken ana dalımızı orijinal uzaktan kumandayla uyumlu olarak sıfırlamak.

git reset --hard original/master

Ve işiniz bitti :)


2
Ben alıyorum fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.son adımı. Herhangi bir tavsiye?
TomNorway

Görünüşe göre bu sadece orijinal uzak dalda stok bırakıyor. Bunun çatalınızı doğru uzaktan kumandaya sıfırlamak için bir adım eksik olduğunu varsayıyorum?
Ray Suelzer

1
originalyerel "yukarı akış" olduğu upstreamgibi (Github dokümanlarının kullandığı) daha iyidir . Belirsizliği azaltır. Acaba bu yüzden mi kullanıyorsun? origin/mastermaster
vaughan

1
Tam da bu yüzden kullanıyorum!
Ahmad Awais

2
Bu talimatları izledim ve git durumu şöyle diyor: Şube yöneticisinde Şube ve 'orijin / master' birbirinden ayrıldı ve her biri sırasıyla 52 ve 5 farklı komisyona sahip. (uzak dalı sizinkiyle birleştirmek için "git pull" komutunu kullanın) - ancak 5 taahhüdümü silmek istiyorum. Bir sonraki adım nedir?
user3562927

6

@VonC harika cevabını takiben. GitHub şirket politikanız master'da 'zorunlu itmeye' izin vermeyebilir.

remote: error: GH003: Sorry, force-pushing to master is not allowed.

Bunun gibi bir hata mesajı alırsanız, lütfen aşağıdaki adımları deneyin.

Çatalınızı etkili bir şekilde sıfırlamak için şu adımları izlemeniz gerekir:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

GitHub'da çatalınızı açın, "Ayarlar -> Şubeler -> Varsayılan şube" bölümünde yeni varsayılan şube olarak 'new_master'ı seçin. Şimdi 'ana' dalı zorlamaya zorlayabilirsiniz:

git checkout master
git push --force origin

Ardından GitHub ayarlarında 'master'ı varsayılan dal olarak ayarlamanız gerekir. 'Tmp_master'ı silmek için:

git push origin --delete tmp_master
git branch -D tmp_master

Değişikliğinizi kaybetmeyle ilgili uyarı diğer yanıtlar hala geçerlidir, dikkatli olun.


4

Sourcetree GUI aracılığıyla% 100 nasıl yapılır

(Git komut satırı arabirimi aracılığıyla herkes bir şeyler yapmayı sevmez)

Bu ayarlandıktan sonra, bundan sonra yalnızca 7-13 arasındaki adımları uygulamanız gerekir.

Getir> ödeme ana dalı> yöneticilerine sıfırla> Değişiklikleri sunucuya aktar

adımlar

  1. Ekranın üst kısmındaki menü araç çubuğunda: "Depo"> "Depo ayarları"

Üst menü çubuğunda vurgulanan "havuz"

  1. "Ekle"

İletişim kutusunun altındaki "Ekle" düğmesi

  1. GitHub'a geri dönün ve klon URL'sini kopyalayın.

Github web sitesinde "Klonla veya İndir" düğmesinin ardından git url'si

  1. URL'yi "URL / Yol" alanına yapıştırın ve ardından anlamlı bir ad verin. Ben buna "efendi" dedim. "Varsayılan uzaktan kumanda" onay kutusunu işaretlemeyin . Doğrudan bu depoya zorlayamazsınız.

"Uzak ayrıntılar" iletişim kutusunda vurgulanan "Uzak ad" ve "URL / Yol" alanları

  1. "Tamam" a basın, şimdi depo listenizde göründüğünü görmelisiniz.

"Ana ayarlar" havuzu, "Depo ayarları" iletişim kutusundaki depolar listesine eklendi

  1. Tekrar "Tamam" a basın ve "Uzaktan kumandalar" listenizde göründüğünü görmelisiniz.

Yan çubuktaki uzaktan kumandalar listesinde vurgulanan "ana" depo

  1. "Getir" düğmesini tıklayın (Kaynak ağaç başlık alanının sol üst kısmı)

Başlık alanındaki "Getir" düğmesi

  1. "Tüm uzaktan kumandalardan getir" onay kutusunun işaretli olduğundan emin olun ve "Tamam" a basın

"Getir" iletişim kutusunda vurgulanan "Tüm uzaktan kumandalardan getir" onay kutusu

  1. Henüz kontrol edilmemişse kontrol etmek için "ana" dalınıza çift tıklayın.

  2. Sıfırlamak istediğiniz taahhüdü bulun, repo "master" adını verdiyseniz, büyük olasılıkla üzerinde "master / master" etiketi bulunan taahhüdü bulmak isteyeceksiniz.

Üzerinde "master / master" etiketi bulunan bir taahhüt örneği

  1. Tarayıma sağ tıklayın> "Geçerli dalı bu talimata sıfırla".

  2. İletişim kutusunda, "Modu kullanma:" alanını "Tüm çalışan kopya değişikliklerini sabitle" olarak ayarlayın ve ardından "Tamam" düğmesine basın (önce kaybetmek istemediğiniz değişiklikleri ayrı bir şubeye koyduğunuzdan emin olun).

"İşlemeyi sıfırla" iletişim kutusunda "Modu kullanma" alanı vurgulanır.  "Tüm çalışan kopya değişikliklerini sil" olarak ayarlandı

  1. Değişiklikleri repo kopyanıza yüklemek için "Push" düğmesini (Kaynak ağaç başlığı alanının sol üst kısmı) tıklayın.

Başlık alanındaki "Push" düğmesi

Yaptın!

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.