![](/img/trans.png)
[英]How can I find all the commits that have more than one parent in a Git repository?
[英]How can 2 commits have the same file information in a git repository?
具體來說, https://github.com/kodekwality/mean/commit/e6f85531279a9ce8624df180603a94837b87cd64和https://github.com/kodekwality/mean/commit/fda7c3dc29b35e4781964e35fee6878c6827c22c看起來具有相同的父集,並且文件的更改與ALMOST相同。 也許我缺少了一些東西,但它們也位於同一分支中。 那么同一文件怎么可能被多次added
呢? 不會第二次modified
嗎?
這確實是兩個不同的提交。 一個獨立於另一個而存在。
makoto@LATLON-Epimetheus:~/mean$ git log --graph --decorate fda7c3d e6f8553
* commit fda7c3dc29b35e4781964e35fee6878c6827c22c
| Author: Amos Haviv <mail@amoshaviv.com>
| Date: Wed May 22 17:03:50 2013 +0300
|
| First Commit
|
| * commit e6f85531279a9ce8624df180603a94837b87cd64
|/ Author: Amos Haviv <mail@amoshaviv.com>
| Date: Wed May 22 17:03:50 2013 +0300
|
| First Commit
|
* commit 58a7ebe92d0196ef96d20f16a0376c6c44777442
Author: Amos Haviv <mail@amoshaviv.com>
Date: Wed May 22 17:01:43 2013 +0300
first commit
從祖先的角度來看,e6f8553提交在fda73cd提交之前。 這種情況的可能解釋是由於選擇了櫻桃(可以保留時間戳)或補丁(確實在日志的歷史記錄中發生了):
makoto@LATLON-Epimetheus:~/mean$ git log --decorate --graph 58a7ebe..c46e52c86b34ff5d746feb883c703dd1a18e34ac
* commit c46e52c86b34ff5d746feb883c703dd1a18e34ac
|\ Merge: 6ef0d73 e99faff
| | Author: Lior Kesos <lior@linnovate.net>
| | Date: Tue Jun 18 08:13:13 2013 -0700
| |
| | Merge pull request #3 from shacharz/patch-1
| |
| | Update README.md
| |
| * commit e99fafff2c9d4ef7544f8fffa921ce8ceab26629
|/ Author: Shachar Zohar <shacharz@gmail.com>
| Date: Tue Jun 18 17:25:19 2013 +0300
|
| Update README.md
|
* commit 6ef0d73d6491bd0d4c1c45a0280f81304ee2b6b5
| Author: Amos Haviv <mail@amoshaviv.com>
| Date: Sun Jun 9 15:35:39 2013 +0300
|
| Clearing Config File
|
* commit b0058919f7fe7cf6aa718f09a1474b4d96c7c877
| Author: Amos Haviv <mail@amoshaviv.com>
| Date: Sun May 26 21:18:16 2013 +0300
|
| Adding Angular-Strap + Datepicker
|
* commit 39fc1dfd68d98f2dff78434e091ee66b355dca51
| Author: Amos Haviv <mail@amoshaviv.com>
| Date: Wed May 22 17:17:09 2013 +0300
|
| Removing .DS_Store
|
* commit a3daa3baf6d2d5753bba96b792c6657096beea40
| Author: Amos Haviv <mail@amoshaviv.com>
| Date: Wed May 22 17:16:13 2013 +0300
|
| Removing DSSTORES
|
* commit 4c029d093bd8503fa31206962f98208eeef04d47
| Author: Amos Haviv <mail@amoshaviv.com>
| Date: Wed May 22 17:08:27 2013 +0300
|
| .DS_Store banished!
|
* commit e6f85531279a9ce8624df180603a94837b87cd64
Author: Amos Haviv <mail@amoshaviv.com>
Date: Wed May 22 17:03:50 2013 +0300
First Commit
在git中,您看到的“更改” 始終是比較兩個提交的結果。 (當然,有時兩個以上 ,但大多只是每次兩個)。這是關鍵,這是怎么回事的。
提交本身並不實際上“添加”文件或“刪除”文件,或者實際上根本沒有對文件進行任何更改。 在您意識到git實際上是一個文件系統並添加了很多版本支持之前,這似乎很奇怪(git是一個版本控制系統,不是嗎?)。 每個提交僅存儲一堆文件,其中1個加上git 可以從以前的版本獲得更改的項目: 2個父提交ID。 (此外,還包括作者,提交者,一些時間戳和提交消息。)
因此,當git表示某些提交(我們將其稱為“提交C1”)“添加文件”時,它是通過將 C1與它的父級進行比較來實現的。 如果父提交缺少文件a.txt
而C1有a.txt
,則git聲稱C1“添加a.txt
”。
如果其他一些提交C2具有a.txt
,並且提交C2的父級缺少a.txt
,則git clais C2也“添加了a.txt
”。
如果C1的父代與C2的父代是同一提交,則很明顯單親兩次都缺少相同的文件。
可能有助於繪制提交圖的一部分:
C1 - ...
/
... - o - o - P
\
C2 - ...
C1和C2都與同一個父P進行比較,因此,如果C1“添加a.txt
”,則P必須缺少a.txt
; 因此,如果C2 具有 a.txt
,則C2 還必須添加a.txt
。
即使以后合並歷史記錄也是如此,因此只有一個分支同時包含C1
和C2
:
C1
/ \
... - o - o - P M - o - ...
\ /
C2
(在這里,合並提交M
有兩個父提交;如果您檢查提交M
並詢問“更改”,則git會為您給每個父提交一個diff,或者稱為“組合” diff,它看起來是C1-vs- M和C2-vs-M成對,然后將兩個差異混在一起。)
1更准確地說,提交具有“樹”。 該樹包含其他樹(子樹)和/或各種文件(在git-internals-speak中為“ blob”)。
2更確切地說,一個提交具有零個或多個父提交。 大多數提交只有一個。 合並提交有兩個或多個,而根提交(通常只是初始提交)沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.