[英]git - how to show list of changed files relative to creation of current branch
[英]How to show the list of of files changed in a branch
git中有沒有辦法顯示整個分支中正在更改的文件列表?
我找到了關於展示如何列出提交中的所有文件的帖子:
有沒有辦法為分支中的所有提交做到這一點? 以及如何列出分支中的所有提交?
謝謝你。
正如Mitchel Paulin 所指出的,提交持有快照,而不是更改。 您必須選擇兩個快照並讓 Git 對它們進行比較,然后才能找到任何差異。 把這看作是一個差異難題:每個提交快照都是您源的完整圖片,您必須先放兩張圖片才能看到不同之處。
您鏈接的問題,如何列出提交中的所有文件? , 有很多答案,但沒有一個人注意到每個提交實際上包含兩件事:快照加上一些元數據。 那是:
每個提交都有編號。 這些數字是大而難看的哈希 ID——它們看起來像隨機的字母和數字字符串——但它們實際上是數字。 每個提交都有自己的唯一編號。 (它們實際上是加密校驗和。)
每個提交存儲每個文件的完整快照——不是更改,是快照。 每個提交中的文件一直被凍結,為了節省空間,在所有提交中都進行了重復數據刪除(因為許多提交與許多其他提交共享大部分文件),但每個提交都有一個完整的副本。
每個提交都會存儲一些元數據,例如提交人的姓名和電子郵件地址。 但是,這些元數據項之一是前一次提交的提交編號。 Git 將此稱為提交的父級。
這些父鏈接意味着 Git 實際上是反向工作的。 也就是說,一個分支只是一個以特定提交結束的提交鏈:
... <-F <-G <-H
這里H
代表鏈中最后一次提交的丑陋的大哈希 ID。 在提交H
,Git 存儲了先前提交G
的哈希 ID。 我們說G
是H
的父級,或者說H
指向G
。
當您讓 Git 向您展示某些提交(例如提交H
發生的更改時,Git 實際上是同時提取G
的快照和H
的快照,然后比較它們。 有什么不同,那就是改變了。 如果您只想要更改文件的名稱,這對 Git 來說特別容易,因為它使用了重復數據刪除技巧。
但這也導致了您問題另一部分的答案:
有沒有辦法為分支中的所有提交做到這一點? 以及如何列出分支中的所有提交?
如果H
是提交鏈中的最后一次提交,並且H
指向G
,則G
是向后的下一次提交。 Git 因此可以使用H
找到G
。
同時,提交G
持有其父F
丑陋大哈希 ID,因此 Git 可以使用G
找到F
。 這讓 Git 又后退了一步。
F
也持有其母公司的哈希ID,所以從F
,Git的可退一步到下一個井,以前-commit。
這正是git log
所做的:它從最后開始,然后向后工作。 幾乎所有的 Git 都做同樣的事情,反向工作。
像master
或branch1
這樣的分支名稱只包含最后一次提交的哈希 ID。 當您向分支添加新提交時,Git 會立即將新提交的哈希 ID 存儲到分支名稱中,現在新提交是最后一次提交。
不過還有一個棘手的問題:
I--J <-- branch1
/
...--F--G--H
\
K--L <-- branch2
兩個分支中的哪一個是通過H
向上提交的?
Git 的回答是:它們在兩個分支上。 事實上,在真正的存儲庫中,大多數提交都在大多數分支上。 例如,從branch2
運行git log
將從L
開始,移回K
,移回H
,移回G
,依此類推,一直回到存儲庫中時間的最開始。
當有人詢問某個分支上的所有提交時,他們幾乎總是不是真正的意思。 它們幾乎總是指在某個分支上,向后,直到我認為 Git 應該提前停止的某個點。 Git 讓你明確地告訴它在哪里停止。 這就是git log branch1..branch2
語法的git log branch1..branch2
:它表示通過從branch2
向后工作找到的提交,但排除通過從branch1
向后工作找到的提交。 在這里,這將僅提交K
和L
,從L
開始並返回到K
。 下一次提交branch1
- H
- 在branch2
,但它也在branch1
,我們告訴 Git 忽略所有branch1
提交,這樣就branch1
了H
和G
,以及它們之前的所有內容。
改變只有在相對於其他事物時才有意義。 例如,您可以使用以下git log branch1..branch2
對某個分支(比如 master)進行git log branch1..branch2
。
或者git diff --name-status branch1..branch2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.