Yerel Git deposunu uzaktaki bir depoyla senkronize etme


297

Yerel veri havuzumu uzak bir dosyayla senkronize etmek istiyorum, böylece yerel veri havuzum uzak olanın% 100 kopyası haline geliyor - bu, belirli dosyaların bu depolarda farklı olması durumunda yerel olanları uzak olanlarla geçersiz kılıyoruz ve varsa uzaktan kumandada bulunmayan yerel depolardaki dosyalar, yerel dosyalar kaldırılır.

Yeni bir uzak depo klonu yapmak dışında bunu başarmanın bir yolu var mı?

Yerel değişiklikleri / taahhütleri atarak uzaktan kumanda ile yerel git repo'yu senkronize et gibi soru .


4
Her zaman buraya geldiğimde çatal senkronizasyonu
Martin Thoma

1
git fetch --prune
hassanzadeh.sd

Yanıtlar:


342
git fetch --prune

-p, --prune
Getirdikten sonra, artık uzaktan kumandada bulunmayan uzaktan izleme dallarını kaldırın. kuru erik seçenekleri


6
Aradığım şey buydu! PS Bir dahaki sefere stackoverflow'u
kazmadan

5
Evet, git pull -paynı - 'git pull verilen parametreler ile git fetch'i çalıştırır
jobwat

2
git fetch <remote> --pruneBirisinin yalnızca --prunebelirli bir uzaktan kumandaya ihtiyacı olması durumunda kullanın . Örneğin. git fetch upstream --prune.
Fery Wardiyanto

git fetch origin --pruneyerel upstream
repoyu

2
@SergiySokolenko hepimizin söylediği bu, ama derinlerde biliyoruz ki SO sayfalar daha uygun hale geldi :-P
Marcello Romani

144

Bu adımlar bunu yapacaktır:

git reset --hard HEAD
git clean -f -x -d -n

o zaman olmadan -n

Bu, tüm yerel değişikliklerle ilgilenecektir. Şimdi taahhütler ...

git status

ve aşağıdaki gibi bir satıra dikkat edin:

Your branch is ahead of 'xxxx' by N commits.

Şimdi 'N' numarasını not edin:

git reset --hard HEAD~N
git pull

ve sonunda:

git status

eklemek / işlemek için hiçbir şey göstermemelidir. Hepsi temiz.

Bununla birlikte, taze bir klon da aynısını yapabilir (ancak çok yavaştır).

=== Güncel ===

Git bilgim zamanla biraz geliştikçe, aynı şeyi yapmanın daha basit bir yolunu buldum. İşte nasıl (# açıklama ile). Çalışma kolunuzdayken:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

Yerel taahhütleriniz ve değişiklikleriniz bundan sonra gözden kaybolacak olsa da, gerekirse taahhüt edilen değişiklikleri geri almak mümkündür.


1
güncelleme için çok teşekkürler github ve
bitbucket

bu cevap benim için burada en güvenilir çözümlerden biri oldu.
AlanH

95

Git havuzunun sadece bir dizin ve dosya ağacı olmadığını, aynı zamanda dalların ve birleşmelerin olabileceği bu ağaçların geçmişini de sakladığını anlamalısınız.

Bir havuzdan getirilirken, oradaki şubelerin tümünü veya bir kısmını deponuza kopyalayacaksınız. Bunlar daha sonra deponuzda "uzaktan izleme dalları" olarak, örneğin benzeri remotes/origin/masterveya benzeri dallar olarak bulunur .

Uzak depodan yeni taahhütler almak, yerel çalışan kopyanızla ilgili hiçbir şeyi değiştirmez.

Çalışan kopyanızda normalde kullanıma alınmış bir taahhüt vardır HEAD. Bu taahhüt genellikle yerel şubelerinizin bir ucudur.

Yerel şubenizi (veya belki de tüm yerel şubeleri?) İlgili uzak şubeye güncellemek ve ardından en son şubeye göz atmak istediğinizi düşünüyorum.

Çalışma kopyanızla (yerel değişikliklerin olabileceği) herhangi bir çakışmadan kaçınmak için, önce sürüm oluşturmayan (kullanarak git clean) her şeyi temizlersiniz . Ardından, güncellemek istediğiniz uzak dala karşılık gelen yerel dalı kontrol git resetedip getirilen uzak dalata geçmek için kullanın. ( git pulluzak dalın güncellemelerini yerel olana da dahil edebilir, bu da aynısını yapabilir veya yerel taahhütleriniz varsa bir birleştirme taahhüdü oluşturur.)

(Ama sonra hem çalışma kopyasında hem de yerel taahhütlerde yerel değişiklikleri gerçekten kaybedeceksiniz. Bunu gerçekten istediğinizden emin olun - aksi takdirde yeni bir şube daha iyi kullanın, bu yerel taahhütlerinizi kaydeder. Ve git stashhenüz taahhüt edilmemiş değişiklikleri kaydetmek için kullanın .)


Düzenleme: Yalnızca bir yerel şubeniz varsa ve bir uzak dalı izliyorsanız, tek yapmanız gereken

git pull

çalışma dizininin içinden.

Bu, izlenen tüm uzak dalların geçerli sürümünü getirir ve geçerli dalı (ve çalışma dizinini) izlediği uzak dalın geçerli sürümüne güncelleştirir.


Yerel veri havuzumdaki NOTHING'i değiştirirsem, sadece a.) Uzaktan kumandadaki her şeyin bir kopyasını almak ve b.) Sürümler arasındaki farkların gösterilmesini istemek. Bu yüzden ben bir şey değiştirmiyorum taahhüt DEĞİL = hiçbir yerel güncelleme / değişiklik. Yukarıdaki iki işleve ulaşmak için periyodik olarak hangi komutları kullanmalıyım (örneğin her hafta veya daha fazla)? Lütfen, cevap KISS (Basit Tutmak Aptal) - Ben de bir git çaylak ve ofc RTFM olacak - ama başlangıç ​​için yardıma ihtiyacınız var. ;)
kobame

Basit bir durumda a git pullyeterli olmalı diye düşünüyorum. (Cevabı güncelledim.)
Paŭlo Ebermann

taahhüt etmek istemiyorum bazı yerel değişiklikler varsa ne. Şimdi bir çektiğimde, onları işlemek veya saklamak için bana diyor. Peki bu durumda git'e bunları geçersiz kılmayı ve çekme işlemini nasıl söyleyebilirim?
Harshana

89

Yapmak istiyorsun

git fetch --prune origin
git reset --hard origin/master
git clean -f -d

Bu, yerel reponuzu tam olarak uzak repo gibi yapar.

Başlangıç ​​noktasını ve ana öğeyi, senkronize etmek istediğiniz uzaktan kumanda ve dal ile değiştirmeyi unutmayın.


2
Ayrıca .gitignore
chwagssd

Benim çıkarmadı node_modules, tam istediğim gibi çalışıyor.
Vahid Amiri

UYARI: İzlenmeyen dosyaları kaldırır
Amit Yadav

Bu kodu kullanarak tüm verilerimi kaybettim, yerel veri havuzumu git deposu ile senkronize etmeye çalıştım. Ancak global depomun yerel depomla senkronize olmasını sağladı.
Zahid Khan

10

Yerel depoyu uzak dalla sıfırlama ve eşitleme

Komut: Başlangıç ​​noktasını ve ana öğeyi, senkronize etmek istediğiniz uzaktan kumanda ve dal ile değiştirmeyi unutmayın.

git fetch origin && git reset --hard origin/master && git clean -f -d

Veya adım adım:

git fetch origin
git reset --hard origin/master
git clean -f -d

Yerel şubeniz artık uzak şubenin tam bir kopyası (taahhütler ve tümü).

Komut çıkışı:

Komutu Forge git git deposunun yerel bir klonunda çalıştırma örneği.

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$

4

(Bu bilgi Git Kullanım Kılavuzu'ndan alınmıştır )

Ayrıca öğreniyorum, bu yüzden bu soruya tam olarak bir cevap olmayabilir, ancak birine yardımcı olabilir:

  1. Uzak bir depo başlangıçta klonlandığında, tüm dalların kopyaları yerel havuzunuzda saklanır (ile görüntüleyin git branch -r)
  2. Bu kopyaları güncellemek ve güncelleştirmek (yani uzak dal ile senkronize etmek) için kullanın git fetch. Bu, mevcut, özel olarak oluşturulmuş şubelerinizi etkilemez.
  3. Yerel şube kasanızın üzerinde çalıştığınız herhangi bir şubenin yeni bir sürümünü geçersiz kılmak için (zaten yürüttüğünüzü varsayarsak git add origin /path/to/repository) git checkout origin/branch_namebu, şube üzerindeki yerel değişikliklerinizi geçersiz kılarbranch_name

3

Uzak deponun aynasını istediğiniz gibi geliyor:

git clone --mirror url://to/remote.git local.git

Bu komut çıplak bir depo oluşturur. Çıplak bir depo istemiyorsanız işler daha karmaşık hale gelir.


3

Çatallı bir depoyu senkronize etmekten bahsediyorsanız, bu adımları takip edebilirsiniz.

Git'ten bir çatal deposu nasıl senkronize edilir

  1. mevcut git şubenizi kontrol edin

    git branch

  2. Master'da değilseniz master için ödeme yapın

    git checkout master

  3. Doğru erişim haklarına sahipseniz akış yukarı deposunu getir

    git fetch upstream

  4. Aşağıdaki hatayı alıyorsanız, çalıştırın

    git remote add upstream git@github.com:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. Şimdi aşağıdaki komutu çalıştırın.

    git fetch upstream

  6. Şimdi master kullanıyorsanız, akış yukarı / master'ı ana şubeye birleştirin

    git merge upstream/master

    Bu kadar!!

    Komut ile çapraz kontrol git remote, daha spesifikgit remote -v

    Ayrıca yukarı akış repo için taahhüt haklarım varsa, yerel bir yukarı akış dalı oluşturabilir ve orada yukarı doğru gidecek işler yapabilirim.


Üçüncü adımda zaten bir hata aldığımda neden 5.git yukarı akış yapmalıyım?
Md Sifatul İslam

-2

Bunun için git kancalarını kullanabilirsiniz . Güncellemeden sonra diğer repo ile değiştirilen itmeli kanca oluşturun.

Elbette birleştirme çatışmaları yaşayabilirsiniz, bu yüzden onlarla nasıl başa çıkacağınızı anlamanız gerekir.

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.