Git'te bir şubedeki değişiklikleri alma


264

Mevcut daldan ayrıldığından beri bir dalda taahhütlerin bir kaydını almanın en iyi yolu nedir? Şimdiye kadarki çözümüm:

git log $(git merge-base HEAD branch)..branch

Belgelerine git-fark olduğunu gösterir git diff A...Beşdeğerdir git diff $(git-merge-base A B) B. Öte yandan git-rev-ayrıştırma belgeleri bunun r1...r2olarak tanımlandığını gösterir r1 r2 --not $(git merge-base --all r1 r2).

Bunlar neden farklı? Bunun git diff HEAD...branchbana istediğim farkları verdiğini, ancak karşılık gelen git log komutunun bana istediğimden fazlasını verdiğini unutmayın.

Resimlerde, varsayalım:

         X --- Y --- Z --- dal
        /
--- a --- b --- C --- d --- E --- KAFA

X, y, z komutlarını içeren bir günlük almak istiyorum.

  • git diff HEAD...branch bu taahhütleri verir
  • ancak, git log HEAD...branchx, y, z, c, d, e verir.

Görebildiğim kadarıyla "git log" u yanlış kullanıyorsunuz. Cevabımı aşağıya ekledim.
PlagueHammer

Yanıtlar:


186

Bir revizyon listesi bağlamında, listeyi A...Bnasıl git-rev-parsetanımlar. git-log bir düzeltme listesi alır. git-diffbir düzeltme listesi almaz - bir veya iki düzeltme alır ve A...Bsözdizimini, git-diffkılavuzda nasıl tanımlandığı anlamına gelecek şekilde tanımlamıştır . Eğer git-diffaçıkça tanımlamak vermedi A...B, sonra sözdizimi geçersiz olacağını. O Not git-rev-parsemanpage açıklar A...B"belirtilmesi Aralıkları" bölümünde ve revizyon aralığı geçerli olduğu o bölümdeki her şeyi durumlarda geçerlidir (yani bir düzeltme listesi arzu edildiğinde).

Yalnızca x, y ve z içeren bir günlük almak için deneyin git log HEAD..branch(üç değil iki nokta). Bu, git log branch --not HEADHEAD'de olmayan daldaki tüm taahhütlerle aynıdır ve anlamına gelir.


31
Vay canına, bu kafa karıştırıcı. "Git diff HEAD..branch" kullanmanın tüm taahhütleri (x, y, z, c, d, e) gösterdiğini, ancak "git log HEAD..branch" tam olarak istediğimi yaptığını ve yalnızca x, y gösteriyor , z! Bu "..." kullanmanın tam tersidir.
Greg Hewgill

22
git diff HEAD..branchile aynıdır git diff HEAD branch. Burada hatırlanması gereken en önemli şey, günlüğün bir liste / revizyon aralığı alması, diff'in fark etmemesi. Bu yüzden argümanlarına farklı davranıyorlar.
Lily Ballard

4
Görünüşe göre git diff HEAD...branch(üç nokta) çıktısına karşılık gelirgit log HEAD..branch
jchook

72
git cherry branch [newbranch]

tam olarak sorduğunuzda, masterdalda olduğunuzda.

Ayrıca aşağıdakileri de çok seviyorum:

git diff --name-status branch [newbranch]

Bu tam olarak sorduğunuz şey değil, aynı bağlamda hala çok yararlı.


8
'git cherry' taahhüt kimlikleri listesi verir. Bunları her taahhütteki tüm değişiklikleri birleştirerek tek bir fark haline getirebilir miyim?
Jonathan Hartley

1
git cherrygerçekten çok faydalı. Teşekkürler :)
jkp

2
@JonathanHartley Taahhüt kimlikleri gibi ilk ve sonuncusu alın ve bunları şu adrese atın gif-diff: git diff x..zveya kendi örneğim için git diff 13bc4d..8eda3a.
towi

3
Şube veya newbranch'tan birinin anahtar kelime olduğu ve özel şube adı ile değiştirilmesi gereken komutunuzda hangi kodun değiştirilmesi gerektiğini anlamak zor
pal4life

37

Görmek istediğiniz şey, giden taahhütlerin listesidir. Bunu kullanarak yapabilirsiniz

git log master..branchName 

veya

git log master..branchName --oneline

Burada "branchName" in "master" bir izleme dalı olarak oluşturulduğunu varsayıyorum.

Benzer şekilde, gelen değişiklikleri görmek için şunları kullanabilirsiniz:

git log branchName..master

1
@ABB, branchName atlanırsa, varsayılan olarak yukarıdaki örnekte etkin bir şekilde branchName olan "head" olur.
PlagueHammer

25

Bu, gönderdiğim cevaba benzer: Git tuşuna basmak

Bu işlevleri Bash profilinize bırakın:

  • gbout - git şube giden
  • gbin - git şube gelen

Bunu aşağıdaki gibi kullanabilirsiniz:

  • Master ise: gbin branch1 <- bu size master1 değil branch1'de ne olduğunu gösterir
  • Usta ise: gbout branch1 <- bu size şube 1'de olmayan ustada ne olduğunu gösterecektir

Bu herhangi bir dal ile çalışacaktır.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

16

Alex V ve NDavis gibi çeşitli cevaplara benzer, ancak hiçbiri aynı değildir.

Zaten söz konusu dalda olduğunda

Kullanımı:

git diff master...

Hangi çeşitli özellikleri birleştirir:

  • süper kısa
  • gerçek değişiklikleri gösterir

Güncelleme:

Bu muhtemelen olmalı git diff master, ama aynı zamanda belirtilen sorudaki taahhütleri değil, farkı gösterir.


1
Eğer ettiyseniz git co master; git pullsize dalını yarattı beri, git diff masterSADECE belirtilen branşında kaydedilmesini getirdiği farklılıkları almak için çok kullanım olmayacaktır.
guival

1
Veya dalları açıkça belirtmek için: git diff <branch1>...<branch2>tarafından yapılan değişiklikleri gösterecektir branch2.
Alex

10

Bazı DOSYA DEĞİŞİKLİKlerini görmek için oraya a -p atın

git log -p master..branch

Bazı takma adlar yapın:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

Bir şubenin benzersiz taahhütlerine bakın:

gbl

6

Ana daldan bu yana geçerli dalın günlüğünü görmek için:

git log master...

Şu anda master'daysanız, master'dan ayrıldığı için farklı bir şubenin günlüğünü görmek için:

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3dots) ancak bazen '=' yerine '+' gösterir


3 nokta, daldaki ilk taahhüdü iki kez gösterir, iki nokta göstermez.
TJ Biddle

2

buldum

git diff <branch_with_changes> <branch_to_compare_to>

daha yararlıdır, çünkü yalnızca taahhüt mesajlarını almakla kalmaz, tüm farkları alırsınız. Zaten daldaysanız ve değişikliklerini görmek ve (örneğin) kaptana neyin değiştiğini görmek istiyorsanız, aşağıdakileri kullanabilirsiniz:

git diff HEAD master
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.