簡體   English   中英

2個提交如何在git倉庫中具有相同的文件信息?

[英]How can 2 commits have the same file information in a git repository?

具體來說, https://github.com/kodekwality/mean/commit/e6f85531279a9ce8624df180603a94837b87cd64https://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

即使以后合並歷史記錄也是如此,因此只有一個分支同時包含C1C2

                  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.

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