Bir taahhüdü ebeveyniyle nasıl dağıtır?


460

Bir takma ad veya komut dosyası yazmanın yanı sıra, belirli bir taahhüdün farkını almak için daha kısa bir komut var mı?

git diff 15dc8^..15dc8

Yalnızca tek bir taahhüt kimliği verirseniz, git diff 15dc8HEAD'e karşı taahhütte bulunulması fark edilir.


Bu konuda en havalı şey fark göstermek için araçları kullanarak, "git difftool" ile çalışması olacaktır.
orip

Referans olarak, bu diğer sorunun cevabı, aşağıdakileri basitleştirmek için bash destekli bir takma adı nasıl ayarlayabileceğinizi gösterir: stackoverflow.com/questions/3321492/…
Nick

Yanıtlar:


641

Kullanın git show $COMMIT. Size kesinleştirme için günlük iletisini ve söz konusu kesinliğin farkını gösterir.


45
Çok kötü difftool kullanamaz :(
orip

1
@orip, GIT_EXTERNAL_DIFF değerini her zaman difftool'unuzla aynı şeyi yapan bir betiğe ayarlayabilirsiniz.
slacy

7
JakubNarebski'nin cevabını tercih ediyorum, çünkü verilen taahhüt ifadesi birçok bağlamda çalışacak: stackoverflow.com/a/449128/992887
RichVel

1
Gösterilen fark yoksa, muhtemelen bir birleştirme taahhüdü gibi gerçek bir değişiklik yoktur
Devin G Rhode

6
@PTWithy: Soru, bu sorunun yanıtladığı "Belirli bir taahhüdün farkını almak için daha kısa bir komut var mı?"
mipadi

439

kullanın:

git diff 15dc8^!

git-rev-parse (1) manpage'in ( veya modern git gitrevisions (7) manpage) aşağıdaki bölümünde açıklandığı gibi :

Bir taahhüt ve üst taahhütleri tarafından oluşturulan bir seti adlandırmak için iki kısayol daha vardır. R1 ^ @ gösterimi, r1'in tüm ebeveynleri anlamına gelir. r1 ^! taahhüt r1'i içerir ancak tüm ebeveynlerini hariç tutar.

Bu , git'de revizyonların gerekli olduğu her yerde 15dc8^!stenografi olarak kullanabileceğiniz anlamına gelir 15dc8^..15dc8. İçin fark komut git diff 15dc8^..15dc8olarak anlaşılmaktadır git diff 15dc8^ 15dc8tamamlama ebeveyn (arasındaki fark anlamına gelir, 15dc8^) ve tamamlama ( 15dc8).

Not : git-rev-parse(1)manpage'deki açıklama, birleştirme taahhütleri için de çalışması gereken revizyon aralıkları hakkında birden fazla ebeveynle konuşuyor . O zaman r1^!" r1 --not r1^@" yani " r1 ^r1^1 ^r1^2 ..."


Ayrıca, git show COMMITtaahhüt açıklaması almak ve bir taahhüt için fark almak için kullanabilirsiniz . Sadece fark istiyorsanız, kullanabilirsinizgit diff-tree -p COMMIT


7
Bu kabul edilen cevap olmalı, çok daha temiz. Bununla birlikte, git-rev-ayrıştırma özütünün son cümlesi oldukça kafa karıştırıcıdır - 'bu taahhüdün ebeveyninden bu taahhüdüne kadar uzanmak' anlamına gelir.
RichVel

1
@RichVel: biraz kafa karıştırıcı çünkü taahhütün birden fazla ebeveyne sahip olduğu durumu da tarif etmeye çalışıyor (bir birleştirme taahhüdüdür). r1 ^! beklendiği gibi çalışır.
Jakub Narębski

@ JakubNarębski: iyi bir nokta, belki de tek ebeveynli ve çok ebeveynli vakaları anladığınızı özetlemek için cevabınızı düzenleyebilirsiniz - her biri için ayrı ifadelerin anlaşılması daha kolay olabilir.
RichVel

1
@ JakubNarębski: evet, çok daha iyi! Şimdi bu kısayolu her zaman kullanıyorum - teşekkürler.
RichVel

1
^!Ebeveyn kısa yazılımları, normal kaydedilmesini için difftool ile düzgün çalışır ancak fark birleştirme kaydedilmesini tersine dönmektedir. Neden öyle?
hIpPy

56

Ne kadar geriye döndüğünüzü biliyorsanız, şöyle bir şey deneyebilirsiniz:

# Current branch vs. parent
git diff HEAD^ HEAD

# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2

Önceki taahhütler şu şekilde çalışır:

# Parent of HEAD
git show HEAD^1

# Grandparent
git show HEAD^2

Taahhütleri belirtmenin birçok yolu vardır:

# Great grandparent
git show HEAD~3

Ayrıntılar için bu sayfaya bakın .


2
HEAD ^ 2 büyükbaba veya büyükanne değildir, HEAD ^ 1 baba ise, HEAD ^ 2 anne demektir. Babanın babası için HEAD ~ 2 kullanın.
Binarian

11

@Mipadi'nin işaret ettiği gibi kullanabilirsiniz git show $COMMIT, ancak bu aynı zamanda bazı başlıkları ve tamamlama mesajını gösterir. Düz bir fark istiyorsanız kullanın git show --pretty=format:%b $COMMIT.

Bu, açıkçası çok kısa bir el değil, bu yüzden bu takma adı .gitconfig'mde saklıyorum

    [alias]
      sd = show --pretty=format:%b

Bu kullanmak için bana olanak git sd $COMMITetmek diff göstermek .


1
Bu takma ad, okumayı kolaylaştıran --color içerebilir: sd = show --color --pretty = format:% b
RichVel

@RichVel Gerçekten! Çok iyi bir nokta. Git'te varsayılan olarak renkleri etkinleştirdiyseniz, bu anahtara ihtiyacınız olmayacaktır. Normalde yaptığım bu.
Øystein Steimler

5

Zsh kullanıyorsanız ve seçenek kümeniz varsa , belirtilen örneklerin çoğu (örn. git diff 15dc8^!, Veya git diff 15dc8^..15dc8) çalışmaz extendedglob. Aşağıdaki üç yoldan biriyle düzeltebilirsiniz:

  1. unsetopt extendedglob (ve / veya .zshrc'den kaldırın)

  2. setopt NO_NOMATCH (ve / veya .zshrc olarak ayarlayın)

  3. şapkadan kaç ve her seferinde ters eğik çizgi ile vur git diff 15dc8\^\!



2

Paul'ün yukarıdaki çözümü umduğum şeyi yaptı.

$ git diff HEAD^1

Ayrıca, belirtilen ocaklar gibi takma adlar eklemek yararlıdır, eğer ~ / .gitconfig dosyanızın [takma ad] bölümüne aşağıdakileri koyarsanız, baş ve önceki arasındaki farkları görüntülemek için kısa el kullanabilirsiniz.

[alias]
    diff-last = diff HEAD^1

Sonra $ git diff-last'i çalıştırmanız sonucunuzu verecektir. Not Bu da olacağını dahil henüz işlememiş ettik herhangi bir değişiklik yanı sıra kaydedilmesini arasındaki diff. Henüz yapmadığınız değişiklikleri göz ardı etmek istiyorsanız , HEAD'ı doğrudan üst öğesiyle karşılaştırmak için diff'i kullanabilirsiniz:

$ git diff HEAD^1 HEAD

0

Takma adlar kullanır, bu nedenle sorunuza tam olarak cevap vermez, ancak bunları amaçladığınız şey için yararlı buluyorum ...

alias gitdiff-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"

alias gitlog-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
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.