我正在开发一个功能分支。在那一刻,我做了一些其他的更改,这些更改已经通过github中的PR合并到了develop分支中,我需要在我的功能分支中进行这些更改。所以我决定将develop分支合并到我的功能分支中。我删除了文件中的一些代码并在功能分支中提交。将开发合并到功能分支后,我发现文件提交中删除代码的更改消失,并且由于合并操作而删除了已删除的部分。我想问一下:在什么情况下会发生这种情况?谢谢!
更新:
我使用github查看历史记录。这是一个例子:
这是功能分支agent.go
中提交80d82ee
的{{1}} history。这是功能分支OWL-1697
中此文件的整个history。合并操作后,此文件的OWL-1697
更改消失。
答案 0 :(得分:1)
我不建议使用GitHub来查看提交和文件历史记录。 (GitHub可能有一些很好的和/或花哨的方式来查看这些,但作为GitHub的一个非常因果用户,我不知道一个。命令行工具有广泛的标志,虽然你必须是一个Git专家知道的东西使用哪种,何时使用。)
完成下面的文字后,请特别注意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
中,您再次将它们删除。
但是,您将相同的添加行添加到via commit d04492d9
中:
| | * | d04492d9 [OWL-1667][common][nqm-mng] From `hbs` to `nqm-mng`
高一点。您在2438360a
中添加的行的同一天执行了此操作。您在80d82eef
中将这些行删除了很久以后......但在另一个分支中。在拓扑顺序中,您在将其放入...后几乎立即进行了更改,同时也将更改保留在单独的分支中。然后你通过e1d369d0
将它们带到另一个分支中,然后将它带到另一个分支中,依此类推,直到你把它们带回到你认为已经把它们带出的分支中。
如果我克隆你的存储库并使用git log --all --decorate --oneline --graph
来查看它,我会看到这部分,包括提交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
现在,您在此处关注的文件在提交modules/nqm-mng/restful/agent.go
中命名为80d82eef
。正如我们从--decorate
otuput中看到的那样,此处引出的分支名称为origin/OWL-1697
。但是,修改此特定文件的提交有点难以找到。
要知道的第一点魔法是在将--full-history
限制为路径名时使用git log
(我怀疑无法让GitHub执行此操作)。原因是,如果合并撤消了您想要完成的任务,Git"历史简化"会删除不贡献给源的最终版本,使得无法找出哪个合并已删除该贡献。
要知道的第二点魔术是,在查看合并提交时,我们可能希望-m
制作Git" split"合并成两半。
我还使用--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日提交的普通提交,其中添加了您不想要的行; 根据您的合并方式,&#34;最有趣的&#34;那些往往是第一个父母的。这是上面的情况。
查看合并的合并基础也是一个好主意,它会带回您不想要的更改。为此,我们需要对该合并的两个父项的两个哈希ID运行git merge-base
。提醒一下,该合并的哈希ID为7e00e309
(或7e00e309f0ed5750f6b7b052e77431ec4797d601
完整版)。所以,让我们对两个父母进行git merge-base
:
$ git merge-base --all 7e00e309^1 7e00e309^2
b598349a0ba6d6901ef812440746e2dc633c4cdc
提交&#34;以下&#34;这一点往往没有意义。
我们现在可以使用:
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而言,在提交2438360a
和80d82eef
中添加然后立即删除这些行是非常无关紧要的。重要的是d04492d9
中那些相同行的独立且永不撤消的添加。这是由一系列合并带来的变化的来源,最终由合并7e00e309
引入。所有Git都可以说这些线是假设在那里,因为它们是由一个&#34; side&#34;添加的。合并,而另一方对文件没有任何作用!
答案 1 :(得分:0)
由于您在功能分支中所做的文件更改尚未提交,因此在合并时您可能会隐藏它们。因此,在合并运营时,这些变化又回来了。