Git-pull getirmeden nasıl önizlenir?


204

Hatta mümkün mü?

Temel olarak, sadece kullanarak çektiğim uzak bir depo var:

git pull

Şimdi, bu çekmenin benim tarafımdaki hiçbir şeye dokunmadan neyin değişeceğini (fark) önizlemek istiyorum. Nedeni çektiğim şey "iyi" olmayabilir ve ben benim deposunu "kirli" yapmadan önce başka birinin düzeltmek istiyorum.


4
Yaptığınız düzenleme garip. "Git getirme" işlemi, çalışma ağacınızı hiçbir şekilde değiştirmez, bu nedenle taahhüt edilmemiş yerel değişiklikleriniz olması önemli değildir. Ve geri almak istediğiniz getirinin bir parçası değil, çünkü çalışma ağacınıza dokunmuyor.
dkagedal

Teşekkürler dkagedal, Git'in nasıl çalıştığını tam olarak anlamadan önce bunu yazdım. Bu düzenlemeyi kaldırdım.
Milan Babuškov

Yanıtlar:


234

Bir yaptıktan sonra git fetch, bir yapmak git log HEAD..origin/masterson ortak arasındaki günlük girişlerini işlemek arşivde master şubesini göstermek için. Farkları göstermek için, git log -p HEAD..origin/masterher yamayı göstermek için ya da git diff HEAD...origin/mastertek bir fark göstermek için (iki değil üç nokta) kullanın.

Bir getirme yapan tek güncelleştirmesi nedeniyle normalde bir getirme geri almak için herhangi bir ihtiyaç, yok uzak şube ve hiçbiri senin dalları. Tüm uzaktan kumanda işlemlerinde çekme ve birleştirme yapmaya hazır değilseniz, git cherry-pickyalnızca istediğiniz belirli uzaktan işlemleri kabul etmek için kullanabilirsiniz . Daha sonra, her şeyi almaya hazır olduğunuzda git pull, taahhütlerin geri kalanında bir birleşme olacaktır.

Güncelleme: Git getirmesinin neden kullanılmasını önlemek istediğinizden tam olarak emin değilim. Tüm git getirme, uzak dalların yerel kopyanızı güncellemektir. Bu yerel kopyanın hiçbir şubenizle ilgisi yoktur ve taahhüt edilmemiş yerel değişikliklerle hiçbir ilgisi yoktur. Git alımını bir cron işinde yapan insanları duydum çünkü çok güvenli. (Normalde bunu yapmanızı tavsiye etmem.)


Belgeleri okurken 'şubelerimle hiçbir ilgisi olmayan' kısmını kaçırdım sanırım. Teşekkürler.
Milan Babuškov

1
Nedense benim için işe yaramıyor. Git diff HEAD ... origin / master'ı denedim ve 'orijin master'ı çektiğimde henüz değişiklikleri listelemedi. Bunun nedeni git remote add kullanarak uzak depoyu ayarladığım için mi?
screenm0nkey

@ screenm0nkey: Bilmiyorum (daha fazla bilgi bilmeden). Hala emin değilseniz, bu konuda soru sormak için yeni bir soru açmanızı öneririz.
Greg Hewgill

1
Benim için ne işe
yarar

2
git diff ...@{u}aynıdır git diff HEAD...origin/masterkökenli / ana üst akışındaki ise
cambunctious

47

Bence git getirme aradığın şey.

Değişiklikleri ve nesneleri yerel repo dizininize eklemeden çeker.

Daha sonra git merge ile birleştirilebilir .

Man Sayfası

Düzenleme: Daha Fazla Açıklama

Doğrudan Git- SVN Crash Course bağlantısından

Şimdi, uzak bir depodan yeni değişiklikleri nasıl alırsınız? Onları getirirsiniz:

git fetch http://host.xz/path/to/repo.git/ 

Bu noktada onlar deponuzdadır ve bunları kullanarak inceleyebilirsiniz:

git log origin 

Ayrıca değişiklikleri değiştirebilirsiniz. Ayrıca kullanabilirsiniz git günlük HEAD..origin Sizin postanede yok sadece değişiklikleri görmek için. O zaman onları birleştirmek istiyorsan - yap:

git merge origin

Alınacak bir dal belirtmezseniz, izleme uzaktan kumandasına uygun bir şekilde varsayılan olarak ayarlanacağını unutmayın.

Kılavuz sayfasını okumak dürüstçe seçenekleri ve nasıl kullanılacağını en iyi şekilde anlayacaktır.

Ben sadece örnekler ve hafıza ile yapmaya çalışıyorum, şu anda üzerinde test etmek için bir kutu yok. Şuna bakmalısınız:

git log -p //log with diff

Bir getir git reset --hard ( link ) ile geri alınabilir , ancak ağacınızdaki tüm taahhüt edilmemiş değişiklikler ve getirdiğiniz değişiklikler kaybolacaktır.


İki şeyi açıklarsanız, bu iyi olabilir: 1. git-fetch'i nasıl geri alabilirim? 2. Farkı nasıl görebilirim?
Milan Babuškov

1
1) Git-getirme geri alınıyor mu? 2) git diff HEAD..origin
Chris Vest

Fark Hristiyan'ın dediği gibi, bir getir git reset --hard ile geri alınabilir, ancak ağacınızdaki tüm taahhüt edilmemiş değişiklikler ve getirdiğiniz değişiklikler kaybolacaktır.
Brian Gianforcaro

Arıyorsunuz git reset --softya da --mixed? Sayfayı kontrol edin.
Aristoteles Pagaltzis

1
Eğer doğru anlıyorsam o zaman bir "git getirme" geri almak için gerek yoktur, çünkü o çalışma kopya değil, aynı zamanda havuz değil. "git fetch" nesneleri ve referansları .git / FETCH_HEAD içinde saklar
Thorsten Niehues

21

Uzak bir depodan getirebilir, farklılıkları görebilir ve sonra çekebilir veya birleştirebilirsiniz.

Bu, denilen uzak bir repo örneği ve uzak dalı izleme originadı verilen bir dal için bir örnektir :masterorigin/master

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master

8

Bunu yapmak için özel bir git takma adı oluşturdum:

alias.changes=!git log --name-status HEAD..

bununla bunu yapabilirsiniz:

$git fetch
$git changes origin

Bu, bir değişiklik yapmadan önce değişiklikleri önizlemenin güzel ve kolay bir yolunu sağlayacaktır merge.


sen tanrısın. bu
git'in

3

Bu iki komutu kullanıyorum ve değiştirilecek dosyaları görebiliyorum.

  1. İlk önce git getirme işlemini gerçekleştirir , şöyle çıktı verir (çıktının bir kısmı):

    ...
    72f8433..c8af041 geliştirmek -> kökeni / geliştirmek
    ...

Bu işlem bize iki taahhüt kimliği verir, birincisi eskisi, ikincisi yenidir.

  1. Sonra git diff kullanarak bu iki taahhüdü karşılaştırın

    git fark 72f8433..c8af041 | grep "diff --git"

Bu komut güncellenecek dosyaları listeler:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Örneğin app / controller / xxxx.php ve app / view / yyyy.php güncellenecektir.

Git diff kullanarak iki taahhüdü karşılaştırmak, güncellenmiş tüm dosyaları değiştirilmiş satırlarla yazdırır, ancak grep ile yalnızca satırları çıktıdan farklı içerir - alır .


3

Partiye geç kalabilirim, ama bu beni çok uzun süre rahatsız eden bir şey. Deneyimlerime göre, çalışma kopyamı güncellemek ve bu değişikliklerle uğraşmak yerine hangi değişikliklerin beklemede olduğunu görmek isterim.

Bu ~/.gitconfigdosyaya gider :

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Geçerli dalı getirir, ardından çalışan kopya ile bu getirilen dal arasında bir fark oluşturur. Bu yüzden, sadece beraberinde getirilecek değişiklikleri görmelisiniz git pull.


1
Ref dizesini değiştirebilir misiniz HEAD..@{u}? Daha basittir ve uzaktan kumandanın "orijin" olarak adlandırılmasını veya dalınızın uzaktan kumandadaki adıyla aynı şekilde adlandırılmasını gerektirmez.
Michael - Clay Shirky

Bu iyi yapılmış bir takma ad, ancak bunu neden ilk etapta yapmak istediğinizden emin değilim. Bir ara değişikliklerle uğraşmak zorunda kalacaksın, değil mi? Yaptığı git pullişi sevmiyorsanız , birleştirme kısmını iptal edebilmelisiniz ... bu yüzden bunun kullanım durumunun ne olduğundan emin değilim.
Marnen Laibow-Koser

Bir noktada değişikliklerle uğraşmak zorunda olduğumu biliyorum, ama yazdığım gibi bazen istemiyorum. Sadece bir şeyin kırılacağını bilmek istiyorum ve bunun için biraz daha zaman ayırmam gerekiyor - ya da git pulldaha sonra yapabilir miyim . Ayrıca bence op'un sorusu bununla ilgiliydi.
Andy P

-1

Git-fetch öğesinin yerel .git'inizi güncellemesini istemiyorsanız , yerel deponuzu geçici bir dizine kopyalayın ve oradan bir çekim yapın. İşte bir kısa el:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Ör .:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)

'gtp' dosyasının .git'in bulunduğu yerel repo kökünde yürütülmesi gerekir.
AX Labs

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.