簡體   English   中英

如何使用 Git 獲取兩個日期之間發生的所有提交之間的差異?

[英]How can I get the diff between all the commits that occurred between two dates with Git?

或者只是兩個日期之間發生的所有提交? 在 SVN 中,你可以做類似的事情

svn diff -r{date}:{date}

去做吧。 我似乎找不到與此等效的 Git。

具體來說,我正在考慮編寫一個腳本來發送每日電子郵件,其中包含當天提交的所有代碼以及由誰提交的代碼。

你可以使用git whatchanged --since="1 day ago" -p

它還需要一個--until參數。

文檔

以前的建議有一些缺點。 基本上,我一直在尋找等同於cvs diff -D"1 day ago" -D"2010-02-29 11:11"的東西。 在搜集越來越多的資料的同時,我找到了解決辦法。

我嘗試過的事情:

  • git whatchanged --since="1 day ago" -p來自這里

    但這會為每次提交提供差異,即使一個文件中有多個提交也是如此。 我知道“日期”在 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”(沒有它在某處記錄)。

“日期”在 git 中是一個松散的概念。 提交將有一個作者日期,該日期可能是過去某個時間,在某人實際將提交拉入/提交到他們的存儲庫之前,提交也可能會重新設置和更新為在明顯較新的提交之上。

提交也有一個提交日期,如果提交以任何方式變基或修改,該日期會更新。 這些提交更有可能按某種時間順序排列,但您仍然受提交者的擺布,在他的計算機上設置了正確的時間,即使如此,未修改的提交可以無限期地位於遠程存儲庫的功能分支上被合並到中央存儲庫的主分支中。

對您的目的最有用的可能是所討論的特定存儲庫的刷新日期。 如果您啟用了每個分支的引用日志(請參閱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 是特定於存儲庫的,因此如果您在克隆上運行日志命令,並且您沒有拉取(比如說)一個月,那么請立即拉取上個月的所有更改,那么上個月的所有更改將出現在@{1 hour ago}..@{now}范圍內。 如果您能夠在人們推送的“中央”存儲庫上運行日志命令,那么它可能會執行您想要的操作。

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

要么

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

也許

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

是你想要的(帶或不帶'--stdout')?

我相信一般的解決方案是使用:

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

如果沒有 --first-parent,您可能會從一個分支獲得一個提交,該提交后來被合並到a ref但在a date string之前還沒有被合並。

這是使用--childrengrep而不是-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 ,但它為我提供了非常不同的結果,所以我不確定它在做什么。

另一種獲取自某個日期以來所有更改的差異的簡單方法是簡單地找到在該日期或之后發生的第一個提交X ,然后使用

git diff X

這樣做的好處是它不依賴於新克隆中的引用日志條目,這與

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

中的解決方案

為了在您的分支上查看Git 文件從日期到日期的更改,請使用以下公式:

  1. 檢查你的分支。
  2. 從遠程存儲庫拉取和更新更改
  3. 從日期到日期范圍觀看差異文件

公式

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

請注意日期采用YYYY-MM-DD格式:

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

如果您想在特定時間范圍內觀察特定文件的變化(在代碼中觀察差異),只需導航當前文件:

示例

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

這是一個更有趣的答案,因為可能有更好的方法。 這將顯示今天的所有提交哈希。

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

;·)

您還可以使用git-format-patch准備補丁(差異)並通過電子郵件發送它們。

使用選項 [since] 或 [revision range] 指定提交范圍。

我將采用我的方式:日期的git log為您提供當前分支的提交哈希。 然后我只使用像git diff 8fgdfg8..565k4l5這樣的東西,它給了我按文件聚合的適當差異。 希望這會有所幫助,雖然沒有經過太多測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM