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.