[英]git difference does not work properly after git clone
我有一個 bash 腳本,我必須在其中克隆並獲取一些存儲庫的差異。 我正在嘗試獲取日期范圍之間的差異
git clone $repository
cd $path
git diff master@{2019-10-1}..master@{2019-10-14} -- package.json
但它顯示錯誤:警告:'master' 的日志僅返回 2019 年 10 月 15 日星期二 09:51:16 +0000。
但是這個存儲庫很舊並且有很多提交。 當我在幾周前克隆相同存儲庫的機器上本地執行此操作時,我得到了適當的區別。
$ git diff master@{2019-10-1}..master@{2019-10-14} -- package.json
diff --git a/package.json b/package.json
index d29ffcb..8766fde 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "accountd",
- "version": "0.0.95",
+ "version": "0.0.102",
"main": "dist/src/index.js",
"private": true,
"scripts": {
@@ -8,7 +8,8 @@
"start-dev": "npm run build && nodemon . port=5000 stage",
"start-sand": "npm run build && nodemon . port=5000 stage",
- "test": "nyc --extension .ts --reporter=html --reporter=cobertura --reporter=text mocha -r ts-node/register src/**/*.spec.ts --exit",
+ "test": "mocha -r ts-node/register test/**/*.spec.ts test/**/**/*.spec.ts --exit",
我希望在一段時間內對此特定文件所做的更改。
您使用的符號( master@{<date>}
)表示您想根據本地 reflogs 引用<date>
上的master
版本。 也就是說,您是說您想知道該特定克隆的master
引用在該日期指向的內容 - 而不是在該日期提交的當前master
提交中的哪些內容。
git 告訴你“這個克隆在那個日期沒有master
參考”。
要做到你的意思,你首先必須找到“當時”日期之前的最后一次提交,然后對此進行diff
。有很多方法,但類似
git diff $(git rev-list -n1 --before="<date>" --first-parent master) master
可能是你想要的更多
@{date}
語法不會得到你想要的。 我會 go 變成你想要的,但我被打敗了; 請參閱Mark Adelsberger 的答案。 :-)
@{...}
語法的知識使用@{date}
語法,存儲庫源的年齡無關緊要。 你有多少次提交並不重要。 重要的是這個特定克隆的所謂reflogs中的內容。
每個 Git 存儲庫(每個克隆)都有自己的引用日志。 一般來說,沒有兩個不同的 Git 存儲庫會就 reflog 中的內容達成一致。 reflogs 不適合這種工作。 什么樣的工作? 這種:
我希望在一段時間內對此特定文件所做的更改。
隨着時間的推移,reflogs 絕對不會告訴您有關文件更改或文件未更改的任何信息。 它們會告訴您 Git引用隨時間的變化。
這可能會讓您對ref或reference究竟是什么感到困惑。 我們可能不應該在這里對 go 進行太多詳細說明,但是像master
這樣的每個分支名稱實際上都是一個參考,其完整拼寫是refs/heads/master
; 每個像v1.2
這樣的標簽名稱都是一個 ref,其完整拼寫是refs/tags/v1.2
; 並且像origin/master
這樣的每個遠程跟蹤名稱都是一個 ref,其完整拼寫以refs/remotes/
開頭。 所以它們只是人類傾向於使用的各種名稱的概括,用於談論提交。 談到提交, Git需要的是它們的原始 hash ID。 在某種程度上,這些名稱只是為了讓我們弱者不必記住任意、又大又丑的 hash ID。 1
理解這一點以及@{...}
語法的關鍵是要認識到這些名稱——例如, refs/heads/master
會隨着時間而改變。 現在,您的master
提交可能是a123456...
。 昨天,它可能是另一個提交,明天,它可能是另一個提交。 你的Git 的master
會隨着時間的推移而改變,每次它確實改變時,你的Git 都會記錄它是什么。 這條記錄只能追溯到到目前為止:提交是永久的,但 hash ID master
的記錄是什么時候,不是。 此外,它不會從一個克隆傳送到另一個克隆:每個克隆記錄的master
何時表示什么是該特定 Git 私有的。 在一個包含所有提交2的新克隆中,只有一個master
曾經擁有的值,這就是它現在擁有的值。
請注意,您也可以使用@{ number }
。 這將選擇 reflog 中的第 number 個條目。
要查看任何特定 ref 的實際 reflog,請運行git reflog ref
,例如git reflog master
。 git reflog
命令還有其他各種處理日志的子命令。 有關詳細信息,請參閱其文檔。
1名稱確實有其他功能。 有關這方面的更多信息,請參閱Think Like (a) Git 。
2假設它不是淺層克隆,也就是說,沒有使用一些尚未普遍使用的新“promisor pack”功能。 此外,如果您使用-b
或--single-branch
進行克隆,或者上游存儲庫以不常見的方式設置,您可能根本沒有名為master
的分支。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.