web-dev-qa-db-ja.com

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

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

svn diff -r{date}:{date}

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

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

109
Chris

git whatchanged --since="1 day ago" -pを使用できます

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

ドキュメント

155
seth

前の提案にはいくつかの欠点があります。基本的に、私は_cvs diff -D"1 day ago" -D"2010-02-29 11:11"_と同等のものを探していました。より多くの情報を収集しながら、解決策を見つけました。

私が試したもの:

  • _git whatchanged --since="1 day ago" -p_ from here

    ただし、これにより、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」をサポートしていません(それがなければどこかに文書化されています)。

58
Weidenrinde

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

コミットには、コミットが何らかの方法でリベースまたは修正された場合に更新されるコミット日もあります。これらのコミットは時系列の順序である可能性が高くなりますが、コンピューターに正しい時刻が設定されているコミッターに依拠しているため、未修正のコミットはリモートリポジトリの機能ブランチに無期限に置かれます中央リポジトリのmasterブランチにマージされます。

おそらくあなたの目的に最も役立つのは、問題の特定のリポジトリの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コマンドを実行できる場合、それはあなたが望むことをするかもしれません。

21
CB Bailey
git diff --stat @{2013-11-01}..@{2013-11-30}

または

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

たぶん

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

( '--stdout'の有無にかかわらず)あなたが望むものは何ですか?

4
Jakub Narębski

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

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

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

--childrenの代わりに-n1grepを使用する代替手段を次に示します。

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 ' '
}

このQ&Aを読む前はgit whatchangedに慣れていませんでしたが、結果はまったく異なりますので、何をしているのかわかりません。

3
Matt McClure

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

git diff X

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

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

のソリューション

3
user456814

git-format-patch を使用してパッチ(diff)を準備し、電子メールで送信することもできます。

オプション[since]または[revision range]を使用して、コミット範囲を指定します。

2

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

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

;・)

2
gahooa

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

  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}

特定の時間範囲内の特定のファイルの変更(コードの差分を見る)を観察したい場合は、現在のファイルをナビゲートするだけです:

例:

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

git log日付を指定すると、現在のブランチのハッシュをコミットできます。次に、git diff 8fgdfg8..565k4l5のようなものを使用します。これにより、ファイルごとに適切な差が集計されます。これが役立つことを願っていますが、あまりテストされていません

0
rostamn739