簡體   English   中英

合並后文件的git commit中的更改消失

[英]Change in a git commit of a file disappears after merge

我在功能分支中進行開發。 那時,我做了一些其他更改,這些更改已通過github中的PR合並到developer分支中,而我需要在我的功能分支中進行這些更改。 因此,我決定將開發分支合並到功能分支中。 我已刪除文件中的一些代碼並提交到功能分支中。 將development合並到feature分支后,我發現文件提交中刪除代碼的更改消失了,並且由於合並操作而將被刪除的部分重新添加回去。 我想問:在什么情況下會發生這種情況? 謝謝!

更新:

我使用github查看歷史記錄。 這里是例子:這是歷史agent.go在提交80d82ee在特征分支OWL-1697 這是功能分支OWL-1697中此文件的全部歷史記錄 合並操作后,此文件的80d82ee更改消失。

我不建議使用GitHub查看提交和文件歷史記錄。 (GitHub可能有一些不錯的和/或理想的方式來查看它們,但是作為GitHub的因果用戶,我不知道一個。命令行工具具有廣泛的標志,盡管您必須是Git專家才能知道以及何時使用。)

TL; DR合並失敗原因的摘要

在閱讀完以下文本之后,請特別注意git log輸出的最后幾行:

* | | | | | 80d82eef [OWL-1730][common][nqm-mng] Code refactoring
* | | | | | 2438360a [OWL-1667][common][nqm-mng] From `hbs` to `nqm-mng`
| |_|/ / /  
|/| | | |   
* | | | | b598349a Merge pull request #295 from masato25/OWL-1724

在提交2438360a ,添加了一些行,然后在提交80d82eef ,再次將它們取出。

但是,您通過提交d04492d9相同的添加行d04492d9

| | * | d04492d9 [OWL-1667][common][nqm-mng] From `hbs` to `nqm-mng`

高一點。 您與2438360a添加的行在同一天進行了此2438360a 您后來在80d82eef中將線路拔出了……但是在另一個分支中 按照拓撲順序 ,將更改放入后幾乎立即將其取出...,同時還將更改留在單獨的分支中。 然后,您通過e1d369d0將它們帶入另一個分支, e1d369d0其帶入另一個分支,依此類推,直到將它們帶回到您認為已將它們取出的分支中。

查看提交圖

如果我克隆您的存儲庫並使用git log --all --decorate --oneline --graph進行查看,我會部分地看到這一點,其中包括commit 80d82eef (在底部):

* aeecad13 (origin/OWL-1697) [OWL-1730][nqm-mng] Update debug message
* f0797f8e [OWL-1730][nqm-mng] Fix the proble from merge
* 5aaba93b [OWL-1730][nqm-mng] Drop gin's "gopkg.in" paths

[mass snip]

* | | | d2d4debd [OWL-1730][nqm-mng] Tests
* | | | e1037c28 [OWL-1730][nqm-mng] Queue service
* | | |   a847d783 Merge branch 'OWL-1677' into OWL-1697
|\ \ \ \  
| * \ \ \   ea916618 Merge branch 'develop' into OWL-1677
| |\ \ \ \  
| | |/ / /  
| * | | | 056a7442 [OWL-1677] Refactoring testing to usage of Ginkgo
| * | | | 800c3f09 [OWL-1677] Add utilities for testing by Ginkgo framework
| * | | |   85deb914 Merge branch 'develop' into OWL-1677
| |\ \ \ \  
| * | | | | c830da0f [OWL-1677] Fix tests
| * | | | | 14d8571c [OWL-1677] Refactoring test to Ginkgo
| * | | | | 8538306f [OWL-1677] Re-write testing to Ginkgo framework
* | | | | | 906741cd [OWL-1730][nqm-mng] Rename types and methods
* | | | | | 80d82eef [OWL-1730][common][nqm-mng] Code refactoring

我們可以看到提交實際上仍然存在,未被合並刪除。

查找影響文件的提交:-- --full-history

現在,您在此處關心的文件在commit 80d82eef被命名為modules/nqm-mng/restful/agent.go 80d82eef --decorate otuput中可以看到,在--decorate領先的分支名稱是origin/OWL-1697 但是,修改此特定文件的提交很難找到。

首先要知道的魔術是在將git log限制為路徑名時使用--full-history (我懷疑沒有辦法讓GitHub做到這一點)。 原因是,如果合並撤消了您想完成的工作,則Git的“歷史簡化”功能將刪除對最終版本 沒有貢獻的提交,從而無法找出哪個合並刪除了該貢獻。

要知道的第二點魔術是,當查看合並提交時,我們可能希望-m使Git將合並“拆分”成兩半。

我還使用--topo-order強制Git以拓撲上合理的順序顯示提交(通常不是必需的,但是這里通常是個好主意)。

誰做了什么

現在,我們可能會准確地看一下80d82eef對感興趣的文件執行的操作:

$ git show 80d82eef -- modules/nqm-mng/restful/agent.go
commit 80d82eef9606800c094858ac0d60f27ef9ad1307
Author: chyeh <chyeh@cepave.com>
Date:   Fri May 19 11:34:09 2017 +0800

    [OWL-1730][common][nqm-mng] Code refactoring

    Move some code from `common/` to `modules/nqm-mng/` as the preparation
    of the following development.

diff --git a/modules/nqm-mng/restful/agent.go b/modules/nqm-mng/restful/agent.go
index 3ba34901..f21afd05 100644
--- a/modules/nqm-mng/restful/agent.go
+++ b/modules/nqm-mng/restful/agent.go
@@ -124,10 +124,3 @@ func clearCachedTargetsOfAgentById(
        r := commonNqmDb.DeleteCachedTargetsOfAgentById(q.AgentID)
        return mvc.JsonOutputOrNotFound(r)
 }
-
-func nqmAgentHeartbeat(
-       req *commonNqmModel.AgentHeartbeatRequest,
-) mvc.OutputBody {
-       r := commonNqmDb.AgentHeartbeat(req)
-       return mvc.JsonOutputBody(r)
-}

現在我們可以運行這個相當長的命令(出於顯示目的,我將其分為兩行):

$ git log --full-history -m -p --topo-order \
    origin/OWL-1697 -- modules/nqm-mng/restful/agent.go

請注意三個額外的選項(完整歷史記錄,合並拆分和拓撲順序)。

輸出很長,所以我不會全部引用,但是顯示的提交是:

  • f0797f8e1e2e5a41db30225f4e72dc987b055ac8 ,在其中您重新刪除由於合並失敗而返回的行;
  • 7e00e309f0ed5750f6b7b052e77431ec4797d601 (相對於其第一個父項d2d4debd ),它重新添加了您不需要的行。
  • 648a324e1333814968a09e4b0277fc0774b4fce6 (相對於其第一個父項447ac685 ),這僅影響import行;
  • ccbad82029c50040250a48180caeacfcc57044bd (相對於其第二個父級da0dcde6 ),它還會重新添加您不想要的行;
  • dfa34ab98170d62e1bb6d624c2d09f9e4e7e0b57 (與其第二個父代5571dc2c );
  • 219347a6f1649ccfee8e69b481e3166d8d310fe0 (與其第二個父級1a60e4aa );
  • b11d41be75700c450280a4a5e0edb12381045303 (與其第二個父級28176808 );
  • 8f5a0e242fd7c7ded6cdcc4517c33c793b96f8ea (與其第二個父級5178acdb );
  • e1d369d06a49846f39661642bdfb7c0c81a86b8e (與其第一個父級8b1d4f0f );
  • d04492d986fdf1257cb93a5524f2501e767bd564 :這是您在5月2日所做的普通提交,在其中添加了不需要的行;
  • 80d82eef9606800c094858ac0d60f27ef9ad1307 :這是您在5月19日所做的普通提交,在其中刪除了不需要的行;
  • 2438360a653e5c158b366f313bf771db4f294147 :這是您在5月2日所做的普通提交,在其中添加了不需要的行;
  • 然后許多不相關的提交都不會影響您關心的行,而這些提交都早於這些更改。

將這些放在上下文中

根據您的合並方式,“最有趣”的合並往往是第一個父合並。 上面就是這種情況。

查看合並帶來了不需要的更改的合並基礎也是一個好主意。 為此,我們需要在該git merge-base的兩個父級的兩個哈希ID上運行git merge-base 提醒一下,合並的哈希ID為7e00e309 (或完整的7e00e309f0ed5750f6b7b052e77431ec4797d601 )。 因此,讓我們在兩個父對象上運行git merge-base

$ git merge-base --all 7e00e309^1 7e00e309^2
b598349a0ba6d6901ef812440746e2dc633c4cdc

承諾“低於”這一點往往不會引起人們的興趣。

我們現在可以使用:

git log --decorate --oneline --graph origin/OWL-1697

要在完整的上下文中查看所有這些,盡管匹配哈希ID十分困難且痛苦。 或者,我們可以運行:

git log --decorate --oneline --graph origin/OWL-1697 \
    --full-history -- modules/nqm-mng/restful/agent.go

與任何父提交相比,將顯示內容簡化為僅觸摸該文件的提交。 結果仍然很長,但是現在是可以追蹤的。 讓我們將其跟蹤到合並基礎,即以b598349a開頭的提交:

* f0797f8e [OWL-1730][nqm-mng] Fix the proble from merge
*   7e00e309 Merge branch 'develop' into OWL-1697
|\  
| *   648a324e Merge pull request #306 from Cepave/OWL-1771
| |\  
| | * 4d722f8d [OWL-1771] Change `gin`'s import paths
| * |   447ac685 Merge branch 'roby-testing' into develop
| |\ \  
| * | | ee1daba9 Merge pull request #305 from masato25/OWL-1674_ma
| | |/  
| |/|   
| * |   ccbad820 Merge pull request #303 from masato25/OWL-1740
| |\ \  
| * \ \   69a9ee6e Merge pull request #302 from masato25/OWL-1765
| |\ \ \  
| | * \ \   9e9d1a55 Merge branch 'develop' into OWL-1765
| | |\ \ \  
| | |/ / /  
| |/| / /   
| | |/ /    
| * | |   dfa34ab9 Merge pull request #300 from masato25/OWL-1740
| |\ \ \  
| | |/ /  
| * | |   219347a6 Merge pull request #301 from masato25/OWL-1755
| |\ \ \  
| | |/ /  
| * | |   b11d41be Merge pull request #299 from masato25/OWL-1755
| |\ \ \  
| | |/ /  
| | | /   
| | |/    
| |/|     
| * |   8f5a0e24 Merge pull request #298 from humorless/OWL-1644-c
| |\ \  
| * \ \   e1d369d0 Merge pull request #286 from Cepave/OWL-1667
| |\ \ \  
| | |/ /  
| |/| |   
| | * | d04492d9 [OWL-1667][common][nqm-mng] From `hbs` to `nqm-mng`
| * | |   8b1d4f0f Merge pull request #297 from hitripod/develop
| |\ \ \  
| * | | | 05e45dc8 Merge pull request #296 from masato25/OWL-1765
| | |_|/  
| |/| |   
* | | |   a847d783 Merge branch 'OWL-1677' into OWL-1697
|\ \ \ \  
| * \ \ \   ea916618 Merge branch 'develop' into OWL-1677
| |\ \ \ \  
| | |/ / /  
| |\ \ \ \  
| | |/ / /  
| * | | |   85deb914 Merge branch 'develop' into OWL-1677
| |\ \ \ \  
* | | | | | 80d82eef [OWL-1730][common][nqm-mng] Code refactoring
* | | | | | 2438360a [OWL-1667][common][nqm-mng] From `hbs` to `nqm-mng`
| |_|/ / /  
|/| | | |   
* | | | | b598349a Merge pull request #295 from masato25/OWL-1724
| |_|/ /  
[snip]

此輸出包含合並錯誤的所有原因。 就Git而言,在commit 2438360a80d82eef添加然后立即刪除這些行是完全無關的。 重要的是在d04492d9對這些相同的行進行了獨立且從未取消的添加。 這就是由一系列合並帶來的更改的源頭,並最終由合並7e00e309帶來了。 Git只能說這些行應該在那兒,因為它們是在合並的“一側”添加的,而另一側對文件沒有任何作用!

由於您尚未在功能分支中進行的文件更改尚未提交,因此合並時可能將其保存了。 因此,在合並操作時,這些更改會重新添加。

暫無
暫無

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

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