Gitで2つの日付の間に発生したすべてのコミット間の差分を取得するにはどうすればよいですか?


116

または、2つの日付の間に発生したすべてのコミットですか?SVNでは、次のようなことができます

svn diff -r{date}:{date}

それをするために!これに相当するGitが見つからないようです。

具体的には、その日すべてのコードを誰がコミットしたかを毎日メールで送信するスクリプトを書くことを考えています。

回答:


159

あなたは使うことができます git whatchanged --since="1 day ago" -p

また、--until引数を取ります。

文書


ありがとう!これは私が欲しかったものでした、それは--committerパラメータさえ受け取りますが、それはそのドキュメントにはリストされていません!また、「git whatchanged」は「git help」に表示されませんでした!なぜだかわからない...もう一度ありがとう。
クリス

5
あなたはこれをあなたの選んだ答えにして、セスがカルマを得るようにすべきです。
スコット

18
@brbob私はこれがずっと前に答え​​られたことを知っていますが、これにつまずいた人のために(私がしたように)Gitヘルプはこう言います:The command is kept primarily for historical reasons; fingers of many people who learned Git long before git log was invented by reading Linux kernel mailing list are trained to type it. したがって、ドキュメントはのgit log代わりにを使用することを推奨していgit whatchangedます。この最後のコマンドはgit logの--no-mergeオプションも使用しているため、同じ結果が出力されます。
ラムセス14


2
git whatchanged現在の最新バージョン2.21.0で非推奨になりました。すべてのgit whatchanged達成はによって達成することができgit log、それは歴史的な理由でのみ保存されます。詳細を見るgit-scm.com/docs/git-whatchanged/2.21.0
Devy

60

以前の提案にはいくつかの欠点があります。基本的に、私はと同等のものを探していましたcvs diff -D"1 day ago" -D"2010-02-29 11:11"。どんどん情報を集めているうちに解決策を見つけました。

私が試したこと:

  • git whatchanged --since="1 day ago" -pここから

    ただし、これにより、1つのファイルに複数のコミットがある場合でも、コミットごとに差分が得られます。「日付」はgit少し緩い概念であることを知っています。これを行うにはいくつかの方法があるはずだと思いました。

  • git diff 'master@{1 day ago}..master警告warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100.を表示し、すべての差分を表示しません。

  • git format-patch --since=yesterday --stdout 私には何も与えません。

  • revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1) どういうわけか動作しますが、複雑に見え、現在のブランチに限定されません。

最後に:

おかしなことに、git-cvsserverは "cvs diff -D"をサポートしていません(それがどこかに記載されていない場合)。


4
+1 forはgit rev-list、私が目にしていた非常によく似た問題を解決するのに大いに役立ちました。
me_and 2011

これは受け入れるべき答えではありません。セスの方がより簡潔で正しいです。
ctford 2014年

6
@ctford、私の見解では、それは正しくありません。svn / cvs diffとしてファイルごとに1つの差分ではなく、1つのファイルに対して複数の差分を報告する場合があります。
ヴァイデンリンデ2014

1
@Weidenrinde +1、これははるかに賢い
rostamn739

1
git diff 'master@{1 day ago}..master構文手段は、「チェックREFLOG分岐がどこから出て、姿をmasterポイントに使用し、あなたのローカルリポジトリに 1 day ago」。具体的には、現在のブランチの実際のコミット履歴を使用しませんmaster。これが本当に望んでいることはめったにありません。
ミッコランタライネン2018年

22

「日付」はgitの緩い概念です。コミットには、誰かが実際にコミットをリポジトリーにプル/コミットする前のかなり前の作成者日付が含まれます。また、コミットがリベースされ、明らかに新しいコミットの上に更新される場合もあります。

コミットにはコミット日付もあり、コミットがリベースまたは何らかの方法で修正された場合に更新されます。これらのコミットは、時系列のようなものになる可能性が高くなりますが、コミッターが自分のコンピューターに正しい時刻を設定していることに翻弄されています。中央リポジトリのマスターブランチにマージされます。

おそらくあなたの目的に最も役立つのは、問題の特定のリポジトリーのreflog日付です。ブランチごとのreflogを有効にしている場合(を参照git config core.logAllRefUpdates)、ref@{date}構文を使用して、ブランチが特定の時間にあった場所を参照できます。

例えば

git log -p master@{2009-07-01}..master@{now}

次のような「あいまい」な説明を使用することもできます。

git log -p "master@{1 month ago}..master@{yesterday}"

これらのコマンドは、作成者とコミット日付に基づいて実際に「古い」かどうかに関係なく、リポジトリの特定のブランチに「出現」したすべてのコミットを表示します。

ブランチごとのreflogはリポジトリに固有であるため、クローンでlogコマンドを実行していて、(たとえば)1か月プルしない場合は、先月のすべての変更を一度にプルします。その後、先月のすべての変更が@{1 hour ago}..@{now}範囲内に表示されます。人々がプッシュする「中央」リポジトリでlogコマンドを実行できる場合、それはあなたが望むことをするかもしれません。


非常に良い記述と述べられた質問への良い答え...しかし、それはbrbobが意図したことをすることにはあまり役に立たないと思います。
JakubNarębski、2009

それは、特定の中央リポジトリーの特定のブランチにプッシュされたものを実際に解析する必要があり、logコマンドがそのリポジトリーで実行された場合に役立つ可能性があります。私は編集が適切だと思います...
CBベイリー

「コミットがリベースまたは何らかの方法で修正された場合に更新されるコミット日付」、実際には日付は変更されません。コミット全体が別のコミットに置き換えられます(ただし、ツリーは同じである可能性があります)。
Hasen

2
@hasen j:技術的には、あなたは正しいです。コミットは不変です。コミットをリベースまたは修正して新しいコミットを作成すると、既存のコミットメッセージ、作成者の詳細、作成者の日付が古いコミットからコピーされることが多いため、新しいコミットIDとコミット日付でコミットを更新しているようになります。
CBベイリー

@{time spec}構文は常にローカルreflogを参照することに注意してください。実際のコミット履歴(DAG)は参照しません。違いを理解しない場合は、この構文を使用しないでください。
ミッコランタライネン2018年

14
git diff --stat @{2013-11-01}..@{2013-11-30}

または

git diff --stat @{2.weeks.ago}..@{last.week}

これはreflogに依存しますか?含まれている場合、このコマンドを実行しているリポジトリが、含まれているコミット履歴よりも新しい(つまり、新たに複製された)場合、実際にはこれを使用できません。

2
はい、これはreflogに完全に依存しています。はい、これはローカルコピー履歴でのみ機能しますが、少し便利なコマンドです。
AA。

1
はい、それをサポートするのに十分古いreflogエントリがある限り、それが便利であることは間違いありません。

よろしくお願いします。あなたの答えを使用して、私は行うことができました:git annotate --stat .. @ {2017-08-8} filename | less; git annotate --stat .. @ {5.days.ago}ファイル名; 状況の変化を見ることができます。
Chris

@{time spec}構文は常にローカルreflogを参照することに注意してください。実際のコミット履歴(DAG)は参照しません。違いを理解しない場合は、この構文を使用しないでください。
ミッコランタライネン

4

たぶん

$ git format-patch --committer=<who> --since=yesterday --stdout

あなたが欲しいものはありますか(「--stdout」の有無にかかわらず)?


1
簡単な質問ですが、-コミット日付を使用しているためですか?
CBベイリー

3

一般的な解決策は次のものを使用することだと思います:

git rev-list -n1 --first-parent --until=<a date string> <a ref>

--first-parentがないと、後でマージされたa refが現時点ではマージされていないブランチからコミットを取得する可能性がありa date stringます。

ここでは--childrengrep代わりにandの代わりに使用します-n1

mlm_git_ref_as_of() {
    # # Examples #
    #
    # Show all commits between two dates:
    #
    #     git log $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    #
    # Show diffs of all commits between two dates:
    #
    #     git diff $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    local as_of="$1"
    local ref="${2:-HEAD}"
    # Get the most recent commit (--children, grep -v ' ') that was on
    # the given branch ($ref, --first-parent) as of a given date
    # ($as_of)
    git rev-list --children --first-parent --until="$as_of" "$ref" | grep -v ' '
}

私は精通していないしgit whatchanged、このQ&Aを読む前に、それは私にとって非常に異なる結果を与えるので、私はそれがやっているかわからないんだけど。


3

特定の日付以降のすべての変更の差分を取得できる別の簡単な方法はX、その日付以降に発生した最初のコミットを単純に見つけてから、

git diff X

これには、新しいクローンのreflogエントリに依存しないという利点があります。

git diff <reference>@{n}..
git log <reference>@{n}..

のソリューション


2

おそらくもっと良い方法があるので、これはおかしな答えです。これにより、今日のすべてのコミットハッシュが表示されます。

git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`

;・)



2

ブランチで日付から日付へのGitファイルの変化を監視するには、次の式を使用します。

  1. ブランチをチェックアウトします。
  2. リモートリポジトリから変更をプルして更新する
  3. 日付から日付範囲の差分ファイルを見る

git checkout <branch>
git pull
git diff --stat @{fromDate}..@a{toDate}

日付はYYYY-MM-DD形式であることに注意してください。

git diff --stat @{2019-08-20}..@a{2019-08-21}

特定の時間範囲で特定のファイルの変更を確認したい場合(コードでdiffを見る)、現在のファイルをナビゲートするだけです。

git diff @{2019-01-01}..@{2019-01-02} ~/dev/myApp/package.json

0

私はそれを行う方法で投げます: git log日付のためにあなたは現在のブランチのコミットハッシュを与えます。次にgit diff 8fgdfg8..565k4l5、ファイルごとに集計された適切な違いが得られるようなものを使用します。これが役立つことを願っていますが、あまりテストされていません

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