Git'i kullanarak yerel ve uzak arasındaki değişiklikleri nasıl bulabilirim?


152

İşte iki farklı soru ama bence bunlar birbiriyle ilişkili.

  1. Git'i kullanırken, yerel olarak yaptığım ancak henüz uzak bir şubeye aktarmadığım değişiklikleri nasıl bulabilirim? Mercurial komutuna benzer bir şey arıyorum hg outgoing.

  2. Git'i kullanırken, uzak bir dalın çekme işleminden önce ne gibi değişiklikler yaptığını nasıl bulabilirim? Mercurial komutuna benzer bir şey arıyorum hg incoming.

İkincisi: Neyin mevcut olduğunu görmenin ve sonra çekmek istediğim değişiklikleri seçmenin bir yolu var mı?


11
Yanıtlara bakıldığında, ne olduğu bazı karışıklıklar var gibi görünüyor hg incomingve hg outgoingaslında yok. Bulduğum en yakın Git eşdeğeri --dry-runseçenek. Sadece git pull --dry-runve gerçekleşmesi gereken tüm şeylerin bir listesini göreceksiniz.
Roman Starkov

Yanıtlar:


97

Git, Hg gibi ağ üzerinden bu tür bilgileri gönderemez. Ama çalıştırabilirsiniz git fetch(daha fazla gibi olduğu hg pulldaha hg fetchuzak sunucularından yeni kaydedilmesini getirmesi).

Bu nedenle, denilen bir dalınız masterve denilen bir uzaktan kumandanız varsa origin, çalıştırdıktan sonra git fetch, adlı bir dalınız da olmalıdır origin/master. Daha sonra alabilirsiniz git logtüm kaydedilmesini ait masterbir üst olması gerekiyor origin/masteryaparak git log master..origin/master. Tam tersini almak için bu ikisini ters çevirin.

Bir arkadaşım David Dollar, simüle etmek için birkaç git kabuk komut dosyası oluşturdu hg incoming/outgoing. Bunları http://github.com/ddollar/git-utils adresinde bulabilirsiniz .


113

Git 1.7.0 ile başlayarak, genel olarak yukarı akış dalına başvurmanıza izin veren özel bir sözdizimi vardır: @{u}veya @{upstream}.

Taklit etmek için hg incoming:

git log ..@{u}

Taklit etmek için hg outgoing:

git log @{u}..

Yukarıdakilerin kullanımını kolaylaştırmak için aşağıdakileri incomingve outgoingtakma adları kullanıyorum:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

git log .. @ {u} bana bu hataları veriyor. (Git yapılandırmada hem başlangıç ​​noktası hem de yukarı akış deposuna sahibim). hata: '' için akış yukarı şube bulunamadı hata: '..' için akış yukarı şube bulunamadı hata: '..' için akış yukarı şube bulunamadı ölümcül: belirsiz argüman '.. @ {u}': bilinmeyen düzeltme veya yol yok çalışma ağacı. Yolları revizyonlardan ayırmak için '-' kullanın
Henrik

6
Yerel şubeniz yukarı akışla yapılandırılmamışsa bu hataları alırsınız. Düzeltmek için çalıştırın git branch --set-upstream foo origin/foo.
Richard Hansen

git log @{u}..Repodaki her değişikliği benim için listeler. Henüz var olmalarının bir yolu yok.
Roman Starkov

@romkyns: Yerel şubeniz, yukarı akış olarak yapılandırılmış yanlış uzak şubeye sahip olabilir. git rev-parse --symbolic-full-name @{u}Uygun uzaktan referansı yazdırdığınızdan emin olun . Ayrıca, git log @{u}..yukarı akış dalı tarafından erişilemeyen ve zaten uzak depoda bulunan (farklı bir başvuru tarafından ulaşılabiliyorsa) taahhütleri içerebilen taahhütleri gösterir. Bu, zaten itilmiş bir dalda birleştikten hemen sonra gerçekleşecektir.
Richard Hansen

@RichardHansen Korkarım, uzak referans için neyin uygun olacağını bilmek için çok çaylak değilim, ancak bu sadece bir checkout <somebranch>ve yaptığım taze klonlanmış bir repo idi merge <otherbranch>. Bu noktada, log @{u}..listelenen her değişikliği gördüm ve gördüm.
Roman Starkov

42

Tam bir cevap değil, git getirme uzak repoyu çekecek ve birleştirme yapmayacaktır. Daha sonra bir

git diff master başlangıç ​​noktası / master


1
Benim için çalıştı (ama başka bir şekilde) -git diff origin/master master
Nick Grealy

34
  1. "Git log origin..HEAD" kullanın

  2. Önce "git fetch" ve ardından "git log HEAD..origin" kullanın. Listelenen taahhütlü kimlikleri kullanarak bireysel taahhütleri kiraz olarak seçebilirsiniz.

Yukarıdaki, elbette, "orijin" in uzaktan izleme şubenizin adı olduğunu varsayar (varsayılan seçeneklerle klon kullandıysanız).


3
(Ve uzak dalı izlemiyorsanız, “git log origin /
master..HEAD

4
"origin" uzaktan izleme bölümünün adı değil, uzaktan kumandanın adıdır. Ve sadece uzak adın çalışmadığını belirtmek için, başlangıç ​​/ ana olabilecek uzaktan izleme dalını belirtmeniz gerekir.
Robinbin

22

Ayrıca, tüm dalları karşılaştırmak için:

git log --branches --not --remotes=origin

Git log man sayfası bunun hakkında şöyle diyor:

Yerel şubelerden herhangi birinde bulunan ancak kaynak için uzaktan izleme dallarının hiçbirinde olmayan tüm taahhütleri gösterir (bu kaynağa sahip olduğunuz şey yoktur).

Yukarıdaki içindir outgoing. Çünkü incoming, sadece değiştirin:

git log --remotes=origin --not --branches

8

yapardım

$ git fetch --dry-run

için hg incomingve

$ git push --dry-run

için hg outgoing.


Üzgünüm, bunun zaten OP'ye bir yorum olarak söylendiğini göz ardı ettim.
chris

1

git-outhg outgoing oldukça doğru bir şekilde taklit eden bir betiktir . "Push-n" çıkışını ayrıştırır, bu nedenle itmek için ek argümanlar belirtmeniz gerekiyorsa doğru çıktı üretir.


0

git gelen

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git giden

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch

0

"Git log" ve @ {u} cevapları başlangıçta bana "bilinmeyen revizyon" hataları verdiğinde, Chris / romkyns'in önerisini denedim git push --dry-run.

"5905..4878 master-> master" gibi bir çıktı alırsınız. 5905, uzaktan kumandanın 4878 aracılığıyla (ve dahil) yürüttüğü ve uzaktan kumandaya uygulayacağı en son taahhüttür.

Daha sonra, daha fazla ayrıntı almak için diğer git komutlarına 5905..4878 parametresini bağımsız değişken olarak kullanabilirsiniz:

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment

-1

Git getirme işlemini yaptığınızda, dallar, etiketler (refs) dahil tüm içerikler geçici olarak .git / FETCH_HEAD içinde depolanır ve içeriği şu komutla görüntülenebilir: git log FETCH_HEAD git fetch ile -a son ekini kullanmazsanız varsayılan olarak , FETCH_HEAD içeriğinin üzerine yeni içerik yazılır. Bu içeriklerden, hangi şubeyi birleştirmek istediğinizi görüntüleyebilir ve karar verebilirsiniz veya getirme ile getirilenlerden yalnızca birkaç taahhüt istiyorsanız basit kiraz toplama yapabilirsiniz.

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.