Gitブランチがいつ作成されたかを判断する方法は?


327

Gitブランチがいつ作成されたかを判断する方法はありますか?私は自分のリポジトリにブランチを持っており、それを作成したことを覚えていません。作成のタイムスタンプを確認すると、私の記憶が揺さぶられる可能性があると思いました。



1
この質問をしたとき、あなたは本当にブランチの作成日時を取得することに本当に興味がありましたか、またはブランチが最初に作成されたコミット履歴のどこにあるのか、つまりブランチが最初にブランチされたコミットを知りたいですか?から?

3
@カップケーキ、質問はかなり明確です。ブランチを作成したときに興味がありました。とはいえ、コミットを知ることは一般的なケースでは便利な情報になるでしょう。
paxos1977 14

回答:


151

使用する

git show --summary `git merge-base foo master`

gitkを使用してコンテキストで表示したい場合は、

gitk --all --select-commit = `git merge-base foo master`

(ここで、fooは探しているブランチの名前です。)

Screenshot


24
答えを明確にするために、プロセスには2つのステップがあります。(1) "git merge-base <branch> master"を使用してtreeshを取得します。ここで、branchは対象のブランチです。(2)treeshをgit showへの入力として使用して日付を取得します: "git show --summary <treesh>"
paxos1977

11
この答えは、ブランチがマスターから作成されたことを除いて思われます。しかし、そうでない場合はどうなりますか?複数の子を持つブランチの最初のコミットを見つける方法はありますか?
Manitra Andriamitondra

20
これはブランチが作成された日付ではありません-これは「ブランチ」コミットです。
Marco

44
このソリューションは、「ブランチ」が「マスター」にマージされなかった場合にのみ機能します。2つのブランチの最初のマージベースを普遍的に見つける方法はありますか?
Ilya Ivanov

22
これは、ブランチの作成ではなく、マージベースを示しています。
ヘドリー2014

139

以下のようなコメントで指摘し、中Jackubの答え、限り、あなたのブランチがコンフィグ設定で設定した日数よりも若いとgc.reflogexpire分岐リファレンスだったとき(デフォルトは90日です)、あなたは見つけるためにあなたのREFLOGを利用することができます最初に作成されました。

git reflogほとんどのgit logフラグを取ることができることに注意してください。さらに、HEAD@{0}スタイルセレクターは事実上時間の概念であり、実際には(ハッキングされた方法で)日付文字列として処理されます。つまり、フラグ--date=localを使用して次のような出力を取得できます。

$ git reflog --date = local
763008c HEAD @ {2010年8月20日10:09:18}:プル:早送り
f6cec0a HEAD @ {Tue Aug 10 09:37:55 2010}:プル:早送り
e9e70bc HEAD @ {2010年2月4日02:51:10}:プル:早送り
836f48c HEAD @ {2010年1月21日14:08:14}:チェックアウト:マスターからマスターへの移行
836f48c HEAD @ {2010年1月21日14:08:10}:プル:早送り
24bc734 HEAD @ {2010年1月20日12:05:45}:チェックアウト:74fca6a42863ffacaf7ba6f1936a9f228950f657からの移行 
74fca6a HEAD @ {Wed Jan 20 11:55:43 2010}:チェックアウト:マスターからv2.6.31に移行
24bc734 HEAD @ {2010年1月20日水曜日11:44:42}:プル:早送り
964fe08 HEAD @ {2009年10月26日15:29:29}}:チェックアウト:4a6908a3a050aacc9c3a2f36b276b46c0629ad91からの移行 
4a6908a HEAD @ {Mon Oct 26 14:52:12 2009}:チェックアウト:マスターからv2.6.28に移行

時々それを使用することも役に立つかもしれません--date=relative

$ git reflog --date = relative
763008c HEAD @ {4週間前}:プル:早送り
f6cec0a HEAD @ {6週間前}:プル:早送り
e9e70bc HEAD @ {8か月前}:プル:早送り
836f48c HEAD @ {8か月前}:チェックアウト:マスターからマスターへの移行
836f48c HEAD @ {8か月前}:プル:早送り
24bc734 HEAD @ {8か月前}:チェックアウト:74fca6a42863ffacaf7ba6f1936a9f228950f657からマスターに移行
74fca6a HEAD @ {8か月前}:チェックアウト:マスターからv2.6.31に移行
24bc734 HEAD @ {8か月前}:プル:早送り
964fe08 HEAD @ {11か月前}:チェックアウト:4a6908a3a050aacc9c3a2f36b276b46c0629ad91からマスターに移行
4a6908a HEAD @ {11か月前}:チェックアウト:マスターからv2.6.28に移行

最後の注意:--allフラグ(実際にはgit-reflogが理解するgit-logフラグ)は、すべての既知の参照の参照ログをrefs/(単にではなくHEAD)表示し、ブランチイベントを明確に示します。

git reflog --date = local --all
860e4e4 refs / heads / master @ {Sun Sep 19 23:00:30 2010}:コミット:2番目。
17695bc refs / heads / example_branch @ {Mon Sep 20 00:31:06 2010}:ブランチ:HEADから作成

3
とても興味深い。+1。もちろん、これはgc.reflogexpire数日以内に行われます。
VonC、

2
@VonC —そうです。gc.reflogexpireのデフォルト値は90日です。
アーロン

1
最後に!git自体が言う唯一の答え:「branch:Created from HEAD」。そのため、gitのとらえどころのない「ブランチ」のものをその作成日時まで追跡することができます...おかげで、+ 1を受賞しました。しかし、そのgc.reflogexpireについてはどうですか?リモートブランチでこれを行う方法は?
Motti Shneor 2017

60

Pro Git§3.1 Gitブランチ-ブランチとは、Gitブランチが実際に何であるかをよく説明しています

Gitのブランチは、[a]コミットへの軽量で移動可能なポインタです。

ブランチは単なる軽量なポインタであるため、gitにはその履歴や作成日を明示的に示すものはありません。「しかし、ちょっと待ってください」とあなたが言うのを聞きます、「もちろんgitは私のブランチ履歴を知っています!」まあ、ちょっと。

次のいずれかを実行した場合:

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

「ブランチの履歴」のように見えますが、実際にはマスターから到達できない「ブランチ」から到達可能なコミットのリストです。これにより必要な情報が得られますが、「ブランチ」をマスターにマージしたことがなく、作成後にマスターを「ブランチ」にマージしたことがない場合に限ります。あなたがいる場合しているマージされ、その後、差異のこの歴史は崩壊します。

幸い、reflogには、他のさまざまな回答で説明されているように、必要な情報が含まれていることがよくあります。これを使って:

git reflog --date=local <branch>

ブランチの履歴を表示します。このリストの最後のエントリは、(おそらく)ブランチを作成したポイントです。

ブランチが削除されている場合、 'branch'はもはや有効なgit識別子ではありませんが、代わりにこれを使用できます。

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

または、Windows cmdシェルで:

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

reflogはリモートブランチでは効果的に機能せず、ローカルで作業したブランチのみが機能することに注意してください。


うーん、この回答がどれほど役立つかはわかりません。後でさらに検討する必要があります。しかし、それだけの価値があるとしたら、簡潔で面倒な部分的な答えだけでなく、包括的なものを書く努力を確実に行ったので、それは間違いなく良いことです。また、この回答この回答gc.reflogexpireで指摘されているように、ブランチが数日以上経過していない限り、reflogを使用できることに注意することが重要です。

4
他の回答からのreflogに関するすべての良い情報を複製したくありませんでしたが、それが便利だと思われる場合は、gc.reflogexpireを追加してください。私の回答は、(1)gitブランチとは何か、およびその「履歴」がやや曖昧である理由をより明確にすることを目的としていました。(2)有用なコマンドを前面および中央に配置します。(3)マスターではなくブランチでのコミットの表示(4)削除されたブランチの参照ログにgrepを実行します。フィードバックを歓迎します。
ヨーヨー2014

@Cupcakeに感謝します。おかしなことに、私はもともと 'branch'の前後に山かっこがありましたが、それが私の回答プレビューから単語全体を取り除いていたため、誤って(無効な)インラインhtmlとして扱われたと思いました。
ヨーヨー2014

この方法では、IntelliJのとのBitbucket経由でうまく機能git reflog --date=local <branch>
アイザックは風化

41

まず、ブランチがgc.reflogexpire数日(デフォルトでは90日、つまり約3か月)以内に作成された場合、git log -g <branch>またはgit reflog show <branch>を使用してreflogの最初のエントリを見つけることができます。これは作成イベントであり、以下のようになります(の場合git log -g):

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

誰がブランチを作成したか、何日前にどのブランチから作成したかがわかります(まあ、それは単に「HEADから作成された」ので、あまり役に立ちません)。

それはマイクセップが彼の答えで言ったことです。


次に、ブランチが長くgc.reflogexpire実行された場合git gc(または自動的に実行された場合)、作成元のブランチを持つ共通の祖先を見つける必要があります。構成ファイルを見てください。おそらくbranch.<branchname>.merge、このブランチが基づいているブランチを示すエントリがあります。

たとえば、問題のブランチがマスターブランチ(マスターブランチから分岐)から作成されたことがわかっている場合は、次のコマンドを使用して共通の祖先を表示できます。

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

git show-branch <branch> master代わりにを試すこともできます。

これはgbaconが彼の応答で言ったことです。


3
「git reflog show <branch>」はうまく機能し、ブランチが作成された時期を非常に明示的に示します。Treeshは「git show --summary <treesh>」にフィードします
paxos1977

1
'git log -g <branch>'は私にとって有効なものでした-非常に詳細です。これらのいずれかを使用するには、ブランチにいる必要があります。
Lidia、2015年

18

gitコマンドについてはまだわかりませんが、reflogsで見つけることができると思います。

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

ファイルにUNIXタイムスタンプが含まれているようです。

更新:ログを印刷するときに、コミット履歴の代わりにreflog履歴を使用するオプションがあるようです。

git log -g

このログをたどって、ブランチを作成した時点に戻ることもできます。git logただし、reflogにエントリを作成したアクションを実行した日付ではなく、コミットの日付を表示しています。上記のパスの実際のreflogを調べた場合を除いて、まだそのことはわかりません。


12

これを試して

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

3
あなたはおそらく%以前に必要かもしれません(refname)
Vor

1
@Vor私は変更を加えました
biniam

私はこれを| cut -c 5- | sort -r |パイプで通してから、その月のgrepをパイプで通して、多かれ少なかれ日付順のリストを逆にしてくれました。
Noumenon

2
@Noumenon:for-each-refは、egを追加することでソートできます(逆順のコミッタデート--sort='-committerdate'の前に「-」があることに注意してください)。
ピート

9

使用する:

git reflog

現在のフォルダにあるリポジトリのすべてのライフサイクルを表示します。最初に表示されるブランチ名(下から上)が作成されたソースです。

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

つまり:

  • ブランチ開発がマスターから作成されます(チェックアウト-b)

  • ブランチfeature-jira35が開発から作成されます(チェックアウト-b)

  • ブランチfeature-jira-sut-46が開発から作成されます(チェックアウト-b)


2
しかし、日付はどこですか?そして、すべての支店に何度もチェックアウトするのを目にします。これは、各ブランチの最初の発生のみがその作成であることを意味しますか?
Motti Shneor 2017

4

これは、このスレッドを見つける前に思いついたものです。

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

このコマンドショーブランチの作成日devからmain

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

「ブランチの作成日」... 90日未満の場合。90日以上作成された場合、その情報は消去されます。上記のstackoverflow.com/a/3748722/6309で述べたように。
VonC

@Sazzad Hissain Khanこれは、Gitの複雑さで少し迷子になっていた技術者以外の人々に「フレンドリーなチートシートのヒント」を提供したかったため、うまくいきました。
Chris22

2

すべてのブランチの詳細を取得したい場合

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

私は最善の方法を見つけました:この方法で作成された最新のブランチを常にチェックします

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


1

これでうまくいきました:(10年後)

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

ブランチの作成時間に関する情報が保存されていないため--no-walk、これは、各ブランチの最初のコミット()を表示することであり、コミットの日付が含まれます。--remotesリモートブランチの場合は使用し、ローカルブランチの場合は省略します。

別のブランチを作成する前にブランチで少なくとも1つのコミットを行うため、これにより、ドキュメント作成のためにブランチの作成(および機能dev-start)の数か月を遡ることができました。

出典:stackexchangeの AnoE


0

構文: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.