Git yerine yerel şubeyi uzak şubeyle nasıl değiştirebilirim?


779

İki şubem var:

  1. yerel şube (birlikte çalıştığım şube)
  2. uzak şube (halka açık, sadece iyi test edilmiş taahhütler oraya gider)

Son zamanlarda yerel şubemi ciddiye aldım.

Yerel şubeyi tamamen uzak olanla nasıl değiştiririm, böylece uzak şubenin bulunduğu yerden çalışmaya devam edebilir miyim?

Ben zaten SO aradım ve yerel olarak uzak şubeye kontrol herhangi bir etkisi yoktur.


1
Kabul edilen cevabın 1280 oyu olduğunu biliyorum, ancak kabul edilen cevabı @TTT ile değiştirmeyi gerçekten düşünmelisiniz.
Jamie

Yanıtlar:


1289
  1. Değiştirdiğiniz şubeyi kontrol ettiğinizden emin olun (Zoltán'ın yorumundan ).
  2. Master'ın değiştirdiğiniz yerel şube olduğunu ve "orijin / master" değerini sıfırlamak istediğiniz uzak şube olduğunu varsayarsak:

    git reset --hard origin/master
    

Bu, yerel HEAD dalınızı başlangıç ​​/ ana ile aynı düzeltme olacak şekilde günceller ve --hardbu değişikliği dizin ve çalışma alanına da senkronize eder.


4
Öneriniz için teşekkürler, --hard ve --force'u kullanmaktan çok 'korkuyorum', bu yüzden bunları kullanmayan çözümü seçtim.
YemSalat

13
@KonstantinLevin: ah evet, bu seçeneklerin isimlendirilmesi oldukça rahatsız edici. git resetvarsayılan olarak geçerli dalınızı yeniden işaretler ve dizini senkronize eder. --softdizini güncellemeyi atlayacak --hard, çalışma alanını da senkronize edecektir. Kendi deneyimim --hardçoğu zaman kullanıyor, ancak son taahhüdü (sadece git reset HEAD^) geri almak istediğim zaman
araqnid

9
Git ile daha fazla deneyim yaşadıktan sonra bunun daha iyi bir çözüm olduğuna ikna oldum, teşekkürler.
YemSalat

24
muhtemelen önce getirmeniz gerekecek:git fetch origin remote_branch
b1r3k

53
Bunun , şu anda hangi dalda olursanız olun , ana içeriğin yerine geçeceğini unutmayın . Bu nedenle, örneğin bir özellik dalındaysanız, tüm taahhütlerini değiştirecektir master, bu nedenle önce değiştirdiğiniz dalı kontrol ettiğinizden emin olun.
Zoltán

218

Üç adım kadar kolay:

  1. Yerel şubenizi silin: git branch -d local_branch
  2. En son uzak dalı getir: git fetch origin remote_branch
  3. Uzak şubeye göre yerel şubeyi yeniden oluşturun: git checkout -b local_branch origin/remote_branch

7
Aslında @araqnid'in söyledikleri doğru ve daha özlü. Test ettim ve siz de deneyebilirsiniz.
adamsmith

Vay canına, git checkout -b local_branch kökenli / remote_branch harika! Bunu her zaman iki ayrı komutla yaptım. Teşekkürler!
kendepelchin

11
git branch -D local_branchŞubeniz birleştirilmezse ilk adımda yapmanız gerekebilir .
szeryf

teşekkürler, gitflow kullanırken zor bir zaman geçirdim, bir şube yayınladıktan ve bitirdikten sonra, silinen şubeye gitmek istedim ve çözümünüz işe yarayan tek şeydi, çekme işe yaramadı gibi görünüyor ... iyi kullanmıyorum -
Decebal

2
mevcut şubenin silinecek olan şube olmadığından emin olmalıyız.
a_secenthusiast

43
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>

--Track kısmı ne işe yarar?
eonist

3
@GitSync, Bu ne git help branchdiyor --track. When creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out. Cevapta bu komutu düzelttim. Puanı yükselttiğiniz için teşekkürler.
Sailesh

Yani layman terimleriyle: uzak URL'yi yeni şubeye ekler. Böylece sonsuza dek eşzamanlıdırlar. Tabiri caizse.
eonist

2
Sadece rahatlık için olduğunu söyleyebiliriz. Bunu yaparsanız git status, ilişkilendirilmişseniz yerel şubenizin uzak şubenin önünde mi yoksa arkasında mı olduğunu bildirir. Ayrıca, şubenizi zaten izlemeye ayarladıysanız , tam yerine git pull(veya push) yapabilirsiniz . git pull <remote> <branch><remote/branch>
Sailesh

22

Her şeyi uzak dal ile değiştirin; ancak , yalnızca aynı taahhütten yerel şubeniz açıktır:

git reset --hard origin/some-branch

VEYA , uzak daldan en son sürümü alın ve her şeyi değiştirin:

git fetch origin some-branch
git reset --hard FETCH_HEAD

Bir kenara, gerekirse, henüz işlemediğiniz izlenmemiş dosyaları ve dizinleri silebilirsiniz:

git clean -fd

git cleanKomut benim için yaptı. git reset hard origin/masterizlenmeyen dosyaları silmeyin. Teşekkürler!
Mornor

9

Geçerli yerel şubeyi uzaktan kumanda ile değiştirmenin en güvenli ve en eksiksiz yolu:

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

stashÇizgi işlememiş olmaları değişiklikleri kaydeder. branchHat orijinal ismi serbest bırakarak, farklı bir isme şubenize taşır. fetchHat uzaktan son kopyasını alır. checkoutÇizgi izleme dalı olarak orijinal dalını yeniden oluşturur.

Veya bash işlevi olarak:

replaceWithRemote() {
    yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}
    git stash
    git merge --abort
    git rebase --abort
    git branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`
    git fetch origin ${yourBranch}:${yourBranch}
    git checkout ${yourBranch}
}

mevcut dalı, replace_master_98d258f gibi bir adla yeniden adlandırır.


git stash popBu iş akışına dahil etmek isteyebilir . Stashed dosyalarınızı yeniden uygulamak istiyorsanız.
eonist

Stashed şubesi ile ne yaparsınız? Ne için olduğunu unuttuktan uzun bir süre sonra tekrar bir yere çıkacağından korkuyorum.
Scott Biggs

1
@ScottBiggs Stashed dalını kaldırmak istiyorsanız, "git stash clear" kullanın.
Mark A. Durham

4

Henüz kimsenin bundan bahsetmediğine şaşırdım; Neredeyse her gün kullanıyorum:

git reset --hard @{u}

Temel olarak, @{u}mevcut dalınızın izlediği akış yukarı dal için kısayol. Örneğin, bu genellikle eşittir origin/[my-current-branch-name]. Güzel çünkü şube agnostik.

git fetchİlk olarak uzak dalın en son kopyasını aldığınızdan emin olun .


1
gerçekten güzel görünüyor, sıfırlamak için şube adını kopyalayıp yapıştırma bıktım!
pedroct92

1
Eski sorulara cevaplar eklediğim birkaç örnek yaşadım ve yanıtlarım lider tablosunda yükseldi. Umarım bunu yapar.
Jamie

3

Daha iyi bilgi perspektifi yaymak için bu cevabı düzenlemeye devam ederek birçok yolla yapılabilir.

1) Sert sıfırlama

Uzaktan geliştirme dalından çalışıyorsanız, HEAD'i uzak daldaki son taahhüdüne aşağıdaki gibi sıfırlayabilirsiniz:

git reset --hard origin/develop

2) Geçerli dalı silin ve uzak depodan yeniden ödeme yapın

Dikkate alındığında, yerel repoda geliştirme dalı üzerinde çalışıyorsunuz, uzaktan / geliştirme dalı ile senkronize oluyor, aşağıdaki gibi yapabilirsiniz:

git branch -D develop
git checkout -b develop origin/develop

3) Birleştirmeyi İptal Et

Kötü bir birleştirme arasındaysanız (yanlışlıkla yanlış dalla yapılırsa) ve birleştirme işleminin aşağıdaki gibi en son şubeye geri dönmesini önlemek istiyorsanız:

git merge --abort

4) Rebase'i İptal Et

Kötü bir rebase arasındaysanız, rebase isteğini aşağıdaki gibi iptal edebilirsiniz:

git rebase --abort

2

@Laurent'in @Hugo'su gibi yapabilir veya git rebasehangilerini biliyorsanız, kurtulmak istediğiniz taahhütleri silmek için kullanabilirsiniz . git rebase -i head~NBu tür işlemler için (N'nin bir sayı olduğu, son N taahhütlerini değiştirmenize izin veren) kullanma eğilimindeyim .


Aslında her şeyi berbat 'git rebase' komutu, sonra bazı zorla birleştirme ve sabit sıfırlama .. Neyse, aradığım şey tüm repo birleştirmeden uzak sunucudan çekmek için sadece kolay bir yoludur.
YemSalat

2

Seçilen cevap kesinlikle doğru ancak / işlemek en son iter beni bırakmadı, ...

Yani benim için:

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

Yukarı akış şubemi geçici olarak belirli bir şubeye birkaç hafta ayarlamak istediğimi bildiğimden (daha önce açtığım / teslim aldığım ve sabit sıfırlama yaptığımla aynı)

Bu yüzden sıfırlama SONRASI

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 

1

Şu anda kullanıma alınmamış bir dalı güncellemek istiyorsanız şunları yapabilirsiniz:

git fetch -f origin rbranch:lbranch

0

Seçilen açıklamada belirtildiği gibi, git reset iyidir. Ancak günümüzde sıklıkla alt modüller kullanıyoruz: depoların içindeki depolar. Örneğin, projenizde ZF3 ve jQuery kullanıyorsanız, büyük olasılıkla orijinal depolarından klonlanmasını istersiniz. Bu durumda git reset yeterli değildir. Alt modülleri, depomuzda tanımlanan tam sürümle güncellememiz gerekir:

git checkout master
git fetch origin master
git reset --hard origin/master
git pull

git submodule foreach git submodule update

git status

her bir alt modülün çalışma dizinine özyinelemeli olarak (cd) gelecek ve aynı olacaktır:

git submodule update

Ve çok farklı

git checkout master
git pull

çünkü alt modüller şubeyi değil, taahhüdü işaret eder.

Bu gibi durumlarda 1 veya daha fazla alt modül için bir dalı manuel olarak kontrol ettiğinizde,

git submodule foreach git pull

Lütfen özellikle bu eski soruları cevaplarken bir açıklama yapın. Cevabınız olduğu gibi yardımcı olmuyor.
Erik A

Kabul edilen cevap zaten önerdi git reset --hard. Bu çok az değer katar.
florisla

0
git reset --hard
git clean -fd

Bu benim için çalıştı - temiz de sildiği tüm dosyaları gösterdi. Değişiklikleri kaybedeceğinizi söylerse, saklamanız gerekir.


-6

Çirkin ama daha basit bir yol: yerel klasörünüzü silin ve uzak depoyu tekrar klonlayın.


10
Ya da şubeyi silin ve tekrar kontrol edin.
laurent

Evet, sanırım daha az 'çirkin' bir şekilde nasıl yapacağımı bulamazsam ne yapacağım
YemSalat

2
Çirkin bazen bilmek faydalıdır. Keşke insanların konvansiyonel yol olmadıkları için şeyleri küçümsememelerini dilerim: downvoting için daha akılcı bir neden olmalı ... ve verilmeli. Git, sonuçlara ulaşan bir şeydir. Bir tür kutsal metin değil.
mike kemirgen

3
Downvotes anlamıyorum :-( Evet, yetersiz, vb ama bazı durumlarda en iyi şekilde çalışabilir ... üzgünüm @Hugo
silverdr

@Hugo, Kabul etti. Yerel geliştirme şubemde gizemli ve kötü kokulu bir şey oldu ve hem Takım Lideri hem de Mühendislik Yöneticisi, daha zarif çözümler arasında, yalnızca özellikli çalışmamı (zip, kopyala ve kaydet, sonra) yerel repo ve reclone'u nükleer silahlara indirmeyi önerdi.
AmitaiB
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.