Uzak şubemle yerel şubemin üzerine yazma


153

Yerel şubemi tamamen irdeledim ve baştan başlamak istiyorum. Sunucudaki sürüm doğru.

Başlamak istemiyorum, büyük tarihçemi düzeltmek için yerel geçmişimi kullanmak istiyorum. (Gerekirse yapabilirim.)

git fetch branchnameve git pull branchnameçalışmaz. Aldığım ileti " güncel " ancak yerel sürümüm sunucunun sürümüyle eşleşmiyor.

git pull origin/branchnamebana " bulunamadı " hatası veriyor .


Yanıtlar:


248

ilk olarak, mevcut konumda yeni bir dal oluşturun (eski 'berbat' geçmişinize ihtiyacınız varsa):

git branch fubar-pin

uzak dallar listenizi güncelleyin ve yeni taahhütleri senkronize edin:

git fetch --all

ardından dalınızı başlangıç ​​noktasının / dalın işaret ettiği noktaya sıfırlayın:

git reset --hard origin/branch

dikkatli olun , bu çalışma ağacınızdaki değişiklikleri kaldıracaktır !


2
+1 ancak git fetch originsıfırlamadan önce bir hatırlatma eklemek isteyebilirsiniz
Mark Longair

Bunu küçük bir değişiklikle yaptım ve işe yaramadı: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (diğer bazı şeyler), git reset --hard origin / branch. Nihai sonuç, hala eski taahhütte olduğum oldu. Bu nedenle, bu yaklaşım bazı durumlarda işe yarayabilir, ancak bence hiç işe yaramaz.
15'te greggles

@greggles: Herhangi bir hata var mı? Son komuttan sonra, HEAD başlangıç ​​noktasını / dalını göstermelidir.
knittl

1
@Gavin: hayır, bu hiçbir koşulda başka şubeleri etkilemez origin/branch. Asla.
knittl

1
@greggles Bunun çok geç olduğunu biliyorum, ancak bunun neden olabileceğini merak eden diğer insanlar için, bu yaklaşım sadece bir şubeniz kontrol edildiğinde işe yarayacaktır. Sizin için işe yaramadı çünkü bağımsız HEAD durumundaydınız (HEAD bir şubeyi değil, bir taahhüt noktasını işaret ediyor) ve bu komutlar yalnızca HEAD bir şubeyi işaret ediyorsa çalışır. git resetHEAD bir şubeyi işaret ederken yaptığınız zaman , o dal takip edecektir.
Michael Dorst

60

Yerel şubemi bozduğumda yaptığım şey, sadece kırık şubemi yeniden adlandırmak ve yukarı akış şubesini tekrar kontrol etmek / dallamak:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Ardından, eski şubenizden hiçbir şey istemediğinizden eminseniz, kaldırın:

git branch -D branch-old

Ama genellikle orada eski bir şubem var.


4
Bu en iyi cevap gibi görünüyor. Her ihtimale karşı bir yedek kopya oluşturulmasına yardımcı olur ve yerel şubenin uzak olanın tam bir kopyası olmasıyla sonuçlanması çok olasıdır.
15'te greggles

Harika cevap, benim için yararlı. Bir S: Resmi git-checkout belgelerinde 3. komutunuzun olması gerektiği söyleniyor: git checkout -b <branch> --track <remote>/<branch>Sizinki de olmadan eşit derecede iyi çalışıyor mu --track?
Starman

1
Bence config var branch.autoSetupMerge(ki varsayılan olarak true olduğunu düşünüyorum) --trackörtük yapar . Ve, evet, tüm git kurulumlarımda --trackbir checkout -b, ama YMMV yaparken açıkça yapmam gerekmiyor .
Casey Marshall

5

Yerel şubenizde atmak istediğiniz değişiklikler olabilir. Bunu yapmak git resetiçin, şube kafasını yukarı akış deposunun dalından saptırdığınız son noktaya sıfırlamak için kullanmanız gerekir . git branch -vAkış yukarı dalın sha1 kimliğini bulmak için kullanın ve kullanarak dalınızı sıfırlayın git reset SHA1ID. Ardından git checkout, dizininizde bıraktığı değişiklikleri atmak için a yapabilirsiniz .

Not: bunu daima yedeklenmiş bir repoda yapın. Bu şekilde kendinizin çalıştığından emin olabilirsiniz. Yoksa, geri döndürülecek bir yedeğiniz vardır.


Bu muhtemelen işe yarayacak gibi geliyor, ancak "işinizin bir kopyasını başka bir yere koyun, uzak dalın yeni bir kopyasını alın" yaklaşımının basitliği ve güvenilirliği göz önüne alındığında, bunun nasıl daha iyi olduğunu göremiyorum.
15'te greggles

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.