web-dev-qa-db-ja.com

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

Gitブランチが作成されたときにを決定する方法はありますか?私は自分のレポにブランチを持っています、そして私はそれを作成することを覚えていません、そしておそらく作成タイムスタンプを見ることは私の記憶をジョギングするだろうと思いました。

267
paxos1977

つかいます

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

Gitkを使って文脈で見たければ、

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

(fooはあなたが探しているブランチの名前です。)

Screenshot

127
Greg Bacon

あなたのブランチが設定gc.reflogexpireで設定された日数よりも若い限り、 コメントに書かれている そして Jackub's answer になっています(デフォルトは90日です)その後、あなたのreflogを利用してブランチ参照が最初に作成された時を見つけることができます。

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

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

--date=relativeを使うことも時々役に立つかもしれません:

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

最後の注意:--allフラグ(これは実際にはgit-reflogによって理解されるgit-logフラグです)は、分岐イベントを明確に示す(HEADname__ではなく)refs/内のすべての既知のrefに対するreflogを表示します。

git reflog --date = local --all 
 860e4e4 refs/heads/master @ {Sun Sep 19 23:00:30 2010}:commit:2番目。
 17695bc refs/heads/example_branch @ {Mon Sep 20 00:31:06 2010}:branch:HEAD 
から作成されました
114
Aaron

Pro Git§3.1 Gitの分岐 - 分岐とは は、Gitの分岐が実際に何であるかについての良い説明を持っています

Gitのブランチは単に[a] commitへの軽量の移動可能なポインタです。

ブランチは単なる軽量のポインタなので、gitにはその履歴や作成日についての明確な概念はありません。 「しかし、待ってください。もちろん、gitは私のブランチの歴史を知っています」と言うのです。そうですね。

次のいずれかを実行したとします。

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

「ブランチの履歴」のように見えますが、実際にはmasterからは到達できない 'branch'から到達可能なコミットのリストです。これはあなたが欲しい情報をあなたに与えます、しかしあなたが 'branch'をmasterにマージしたことがなくそしてそれを作って以来masterを 'branch'に決してマージしたことがない場合に限り。あなたをマージした場合、この違いの歴史は崩壊するでしょう。

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

git reflog --date=local <branch>

枝の歴史を示すために。このリストの最後のエントリは、(おそらく)ブランチを作成した場所です。

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

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

またはWindowsのcmdシェルの場合:

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

Reflogはリモートブランチでは効果的に機能しないことに注意してください。ローカルで作業したものだけです。

44
yoyo

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

Reflog: <branch>@{<nn>} (C R Eator <[email protected]>)
Reflog message: branch: Created from <some other branch>

誰がブランチを作成し、何回前に操作を行い、どのブランチから作成したかを取得します(まあ、それは単に "Created from HEAD"かもしれませんが、あまり役に立ちません)。

それが MikeSepが答えで言った です。


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

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

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

別の方法として、git show-branch <branch> masterを試すこともできます。

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

38
Jakub Narębski

Gitコマンドについてはまだよくわかりませんが、それらをreflogで見つけることができると思います。

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

私のファイルはそれらにunixタイムスタンプを持っているようです。

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

git log -g

このログをたどって、ブランチを作成したときに戻ることもできます。ただし、git logはコミットの日付を示していますが、reflogにエントリを作成したアクションを実行した日付ではありません。上記のパスで実際のreflogを調べる以外に、私はまだそれを見つけていません。

16
Mike Seplowitz

これを試して

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

つかいます:

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)

7
De Nguyen

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

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
Andrew Sohn

このコマンドは、devからのブランチmainの作成日を表示します。

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

Andrew Sohnからの回答と組み合わせて( https://stackoverflow.com/a/14265207/1929406

branchcreated=$(git reflog show --date=format:'%Y-%m-%d %H:%M:%S' --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1| cut -d'{' -f 2| cut -d'}' -f 1 | xargs)
echo $branchcreated
0
kivagant