Git dalının ne zaman oluşturulacağı nasıl belirlenir?


327

Git dalının ne zaman oluşturulduğunu belirlemenin bir yolu var mı ? Repomda bir şubem var ve onu yarattığımı hatırlamıyorum ve belki de yaratma zaman damgasını görmenin hafızamda koşacağını düşündüm.



1
Bu soruyu sorduğunuzda, gerçekten sadece şubenin oluşturulma tarihini ve saatini almakla mı ilgileniyordunuz, yoksa şubenin tarihinizde nerede ilk oluşturulduğunu, yani şubenizin hangi dalda ilk dallandığını bilmekle de ilgileniyor musunuz? dan?

3
@ Cupcake, soru oldukça açık. Şubeyi ne zaman oluşturduğumla ilgileniyordum. Bu taahhüt genel bilmek kullanışlı bilgi olacağını söyledi.
paxos1977

Yanıtlar:


151

kullanım

git show - özet "git merge-base foo master"

Gitk kullanarak bağlamda görmeyi tercih ediyorsanız,

gitk --all --select-commit = `git birleştirme tabanı foo yöneticisi`

(burada foo, aradığınız şubenin adıdır.)

Ekran görüntüsü


24
Cevabı açıklığa kavuşturmak için, sürecin iki adımı vardır. (1) dalın ilgili dal olduğu "git merge-base <branch> master" kullanarak treesh'i edinin. (2) Tarihi almak için treesh'i git şovuna girdi olarak kullanın: "git show --summary <treesh>"
paxos1977

11
Bu cevap, dalın master'dan oluşturulması dışında görünmektedir. Ama durum böyle değilse? 1'den fazla çocuğu olan şubenin ilk taahhüdünü bulmanın bir yolu var mı?
Manitra Andriamitondra

20
Bu dalın oluşturulduğu tarih değil - bu "dallanma" taahhüdüdür.
Marco

44
Çözüm sadece 'şube' asla 'usta' ile birleştirilmezse işe yarayacaktır. İki dal için evrensel olarak ilk birleştirme üssünü bulmanın bir yolu var mı?
Ilya Ivanov

22
Bu, şube oluşturma değil, birleştirme tabanını göstermektedir.
Hedley

139

Gibi Açıklamalarda belirttiği ve Jackub cevabı sürece şube yapılandırma ayarında belirlediğiniz gün sayısından daha genç olduğu için,gc.reflogexpire bir şube referans iken (varsayılan 90 gündür), o zaman öğrenmek için reflog yararlanabilirler ilk oluşturuldu.

git reflogÇoğu git logbayrağı alabileceğinizi unutmayın . Ayrıca,HEAD@{0} stil seçicilerin etkili bir şekilde zaman kavramları olduğunu ve aslında (saldırıya uğramış bir şekilde) tarih dizeleri olarak ele alındığını unutmayın. Bu, bayrağı kullanabileceğiniz anlamına gelir.--date=local ve şu şekilde çıktı :

$ git reflog --date = yerel
763008c KAFA @ {Cum 20 Ağu 10:09:18 2010}: çekme: Hızlı ileri sarma
f6cec0a HEAD @ {Sal 10 Ağu 09:37:55 2010}: çekme: İleri sar
e9e70bc HEAD @ {Per 4 Şub 02:51:10 2010}: çekme: Hızlı ileri sar
836f48c KAFA @ {Per 21 Oca 14:08:14 2010}: ödeme: master'dan master'a geçiş
836f48c KAFA @ {Per 21 Oca 14:08:10 2010}: çekme: Hızlı ileri sarma
24bc734 KAFA @ {Çar 20 Oca 12:05:45 2010}: ödeme: 74fca6a42863ffacaf7ba6f1936a9f228950f657 
74fca6a KAFA @ {Çar 20 Oca 11:55:43 2010}: ödeme: master'dan v2.6.31'e geçiş
24bc734 KAFA @ {Çar 20 Oca 11:44:42 2010}: çekme: Hızlı ileri sarma
964fe08 KAFA @ {Pzt 26 Ekim 15:29:29 2009}: ödeme: 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 adresinden hareket ediyor 
4a6908a KAFA @ {Pzt 26 Ekim 14:52:12 2009}: ödeme: master'dan v2.6.28'e geçiş

Ayrıca, kullanımı bazen yararlı olabilir --date=relative:

$ git reflog --date = göreli
763008c HEAD @ {4 hafta önce}: çekme: Hızlı ileri sarma
f6cec0a HEAD @ {6 hafta önce}: çekme: Hızlı ileri sarma
e9e70bc HEAD @ {8 ay önce}: çekme: Hızlı ileri alma
836f48c HEAD @ {8 ay önce}: ödeme: master'dan master'a geçiş
836f48c HEAD @ {8 ay önce}: çekme: Hızlı ileri sar
24bc734 HEAD @ {8 ay önce}: ödeme: 74fca6a42863ffacaf7ba6f1936a9f228950f657'den ustalığa geçiş
74fca6a HEAD @ {8 ay önce}: ödeme: master'dan v2.6.31'e geçiş
24bc734 KAFA @ {8 ay önce}: çekme: Hızlı ileri sar
964fe08 HEAD @ {11 ay önce}: ödeme: 4a6908a3a050aacc9c3a2f36b276b46c0629ad91'den ustalığa geçiş
4a6908a HEAD @ {11 ay önce}: ödeme: master'dan v2.6.28'e geçiş

Son bir not: --allbayrak (gerçekten git-reflog tarafından anlaşılan bir git-log bayrağıdır), şube etkinliklerini açıkça gösterecek olan refs/(sadece yerine) bilinen tüm başvuruların refloglarını HEADgösterecektir:

git reflog --date = local --all
860e4e4 refs / heads / master @ {Paz 19 Eyl 23:00:30 2010}: taahhüt: İkinci.
17695bc refs / heads / example_branch @ {Pzt 20 Eylül 00:31:06 2010}: şube: HEAD tarafından oluşturuldu

3
Çok ilginç. +1. Tabii ki, bu gc.reflogexpiregün içinde gerçekleşir .
VonC

2
@VonC - haklısın. Gc.reflogexpire için varsayılan değer 90 gündür.
Aaron

1
En sonunda! git'in kendisinin "şube: HEAD'den yaratıldığı" dediği tek cevap. Yani gitmesi zor "dal" şey yaratılış tarihi ve saati takip edilebilir ... Teşekkürler, +1 ödül. Peki ya bu gc.reflogexpire olayı ve bunu uzak dallarda nasıl yapabilirim?
Motti Shneor

60

Pro Git § 3.1 Git Dallanma - Bir Dalın Nedir , bir git dalının gerçekte ne olduğuna dair iyi bir açıklaması vardır

Git'teki bir dal, [a] taahhüdüne basitçe hafifçe taşınabilir bir göstericidir.

Bir dal sadece hafif bir işaretçi olduğundan git'in geçmişi veya oluşturma tarihi hakkında açık bir fikri yoktur. "Ama bekle," dediğini duyuyorum, "elbette git benim şube tarihimi biliyor!" İyi sıralama.

Aşağıdakilerden birini çalıştırırsanız:

git log <branch> --not master
gitk <branch> --not master

"şubenizin tarihi" ne benzediğini göreceksiniz, ancak gerçekten "branştan" erişilebilen taahhütlerin bir listesi. Bu size istediğiniz bilgiyi verir, ancak ve ancak 'dal' ı hiç master ile birleştirmediyseniz ve master'ı asla oluşturduğunuzdan beri 'dal' ile birleştirmediyseniz. Eğer varsa var birleşti, o zaman farklılıkların bu tarih çökecek.

Neyse ki, burada diğer çeşitli cevaplarda açıklandığı gibi, reflog genellikle istediğiniz bilgileri içerir. Bunu kullan:

git reflog --date=local <branch>

Şube tarihini göstermek. Bu listedeki son giriş (büyük olasılıkla) dalı oluşturduğunuz noktadır.

Şube silinmişse, 'şube' artık geçerli bir git tanımlayıcısı değildir, ancak bunun yerine istediğinizi bulabilir:

git reflog --date=local | grep <branch>

Veya bir Windows cmd kabuğunda:

git reflog --date=local | find "<branch>"

Reflog'un uzak dallarda etkili olmayacağını, yalnızca yerel olarak çalıştığınızı unutmayın.


Hmm, bu cevabın henüz ne kadar yararlı olduğundan emin değilim, daha sonra çalışmam gerekecek. Buna değer olsa da, sadece kısa, tembel kısmi bir cevap değil, kapsamlı bir şey yazmak için çaba harcayarak iyi bir iş çıkardınız , bu kesinlikle iyi. Ayrıca, bu yanıtı ve bu yanıtagc.reflogexpire işaret edildiği gibi, dalınız günlerden daha eski olmadığı sürece bu bloğu yalnızca bunun için kullanabileceğinizi not etmek önemlidir .

4
Diğer cevaplardan refloglar hakkındaki tüm iyi bilgileri çoğaltmak istemedim, ancak yararlı olduğunu düşünüyorsanız gc.reflogexpire'ı eklemekten mutluluk duyuyorum. Cevabım (1) bir git dalının ne olduğu ve "tarihinin" neden biraz belirsiz olduğu hakkında daha fazla açıklık sağlamaktı, (2) (3) usta değil, bir dalda taahhütleri göstermek ve (4) silinmiş bir dal için reflog'u grep-gringing. Geribildirim hoş geldiniz.
yoyo

Teşekkürler @ Cupcake. Funnily yeterince 'başlangıç' etrafında köşeli parantez vardı ama bu benim cevap önizleme dışında tüm kelime sıyırma, bu yüzden yanlışlıkla (geçersiz) satır içi html olarak kabul edildi varsayılır.
yoyo

Bu yöntem intellij ve BitBucketgit reflog --date=local <branch>
isaac weathers ile

41

Öncelikle, şube içinde oluşturulmuşsa, gc.reflogexpiregün (varsayılan 90 gün, yani yaklaşık 3 ay), kullanabilirsiniz git log -g <branch>veya git reflog show <branch>aşağıda gibi yaratma olay olacağını reflog ilk girdiyi bulmak ve görünüm (için bir şey git log -g):

Reflog: <branch>@{<nn>} (C R Eator <creator@example.com>)
Reflog message: branch: Created from <some other branch>

Kimin bir şube oluşturduğunu, kaç operasyondan önce ve hangi branştan (yani, sadece "HEAD'den yaratılmış olabilir, ki bu çok yardımcı olmaz) elde edersiniz.

Yani ne MikeSep onun cevabını söyledi .


İkinci olarak, daha uzun süre şubeniz varsa gc.reflogexpireve koştuysanız git gc(veya otomatik olarak çalıştırıldıysa), oluşturulduğu dalla ortak bir ata bulmanız gerekir. Yapılandırma dosyasına bir göz atın, belki de bunun branch.<branchname>.mergehangi şubeye dayandığını söyleyen bir giriş var .

Söz konusu dalın ana daldan oluşturulduğunu biliyorsanız (ana daldan çatallama), ortak atayı görmek için aşağıdaki komutu kullanabilirsiniz:

git show $(git merge-base <branch> master)

git show-branch <branch> masterAlternatif olarak da deneyebilirsiniz .

Bu nedir gbacon onun cevaben söyledi .


3
"git reflog show <branch>" iyi çalışıyor, dalın ne zaman oluşturulduğunu çok açık bir şekilde gösteriyor. Treesh "git show --summary <treesh>" içine beslenir
paxos1977

1
'Git log -g <branch>' benim için çalışan bir detaydı. Bunlardan herhangi birini kullanmak için dalda olması gerekir.
Lidia

18

Bunun için git komutundan henüz emin değilim, ama onları refloglarda bulabileceğinizi düşünüyorum.

.git/logs/refs/heads/<yourbranch>

Dosyalarımın içinde unix zaman damgası var gibi görünüyor.

Güncelleme: Günlükleri yazdırırken yürütme geçmişi yerine reflog geçmişini kullanma seçeneği var gibi görünüyor:

git log -g

Şube oluşturduğunuz zamana kadar bu günlüğü de takip edebilirsiniz. git logAncak, taahhütte bulunma tarihini gösterir, ancak yeniden blog'a giriş yapan işlemi yaptığınız tarihi göstermez. Ben yukarıdaki yoldaki gerçek reflog bakarak dışında henüz bulamadım.


12

Bunu dene

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'

3
muhtemelen daha %önce ihtiyacınız olabilir(refname)
Vor

1
@Vor değişikliği yaptım
biniam

Bunu pipetledim | cut -c 5- | sort -r |ve sonra ay için grep ile pipetledim, bana aşağı yukarı kronolojik bir liste listesi verdi.
Noumenon

2
@Noumenon: for-each-ref, örneğin ekleyerek sizin için sıralayabilir --sort='-committerdate'(ters kronolojik sipariş için başlama tarihinden önce '-' not edin).
Pete

9

kullanın:

git reflog

deponuzun tüm yaşam döngüsünü geçerli klasörde göstermek için. İlk görünen şube adı (aşağıdan yukarıya) oluşturulan kaynaktır.

855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development
855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46
535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35
855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development
535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css
855a3ce HEAD@{7}: checkout: moving from development to feature-jira35
855a3ce HEAD@{8}: checkout: moving from master to development

Bu şu anlama gelir:

  • Masterdan şube geliştirme (checkout -b)

  • Şube özelliği-jira35 geliştirmeden yaratılır (kasa -b)

  • Şube özelliği-jira-sut-46 geliştirmeden oluşturulur (kasa -b)


2
ama tarihler nerede? ve her şubeye birçok kez check-out yaptığınızı görüyorsunuz. Bu sadece her dalın yaratıldığı İLK olay anlamına mı geliyor?
Motti Shneor

4

Bu konuyu bulamadan önce geldiğim bir şey.

git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'

3

Bu yakalanan görünen şube oluşturulma tarihi komutları devdanmain

$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main

"şubenin oluşturulduğu tarih" ... 90 günden az ise. Oluşturulduğu takdirde daha 90'dan gün, bu bilgiler temizlenir. Yukarıda belirtildiği gibi stackoverflow.com/a/3748722/6309 .
VonC

@Sazzad Hissain Khan Bu bizim için işe yaradı, çünkü Git'in bazı inceliklerinden biraz kaybolan bazı teknik olmayan halklara 'dostça hile sayfası ipuçları' sunmak istedik.
Chris22

2

Tüm şubelerin detaylarını almak istiyorsanız

for i in `git branch -r | tail -n +2 `;do git log --reverse $i|grep -A 2 -B 2 `echo $i | awk -F'origin/' '{print $2}'` |head -n 4; done

2

En iyi yolu buldum: Her zaman bu şekilde oluşturulan en son şubeyi kontrol ederim

git for-each-ref --sort=-committerdate refs/heads/


1

Bu benim için yaptı: (10 yıl sonra)

git log [--remotes] --no-walk --decorate

Şube oluşturma süreleri hakkında depolanmış bilgi olmadığından bunun yaptığı her bir şubenin ( --no-walk) taahhüt tarihini içeren ilk taahhüdünü göstermektir. kullanım--remotesUzak dallar için veya yerel dallar için atlayın.

Başka bir tane oluşturmadan önce bir dalda en az bir taahhütte bulunduğumdan, bu, dokümantasyon amacıyla birkaç aylık dal oluşturma (ve dev-start özelliği) izlememe izin verdi.

kaynağı: stackexchange üzerinde AnoE


0

sözdizimi: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

misal: git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1

sonuç: cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0

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.