Git rebase,改变添加功能的顺序,解决冲突,理解合并

问题描述 投票:1回答:1

我在一个单独的分支(genericatt-wip),我想清理一个提交列表。即我重新加入当前的masterrebase-screen这些提交中的许多(所有这些test_...提交)都添加了一个新函数(一个新的测试用例)。这是原始列​​表:rebase-initial-screen当改变这些的顺序时,我得到了冲突,虽然原则上没有冲突(所有这些提交只是添加东西,并且所有这些都添加了单独的单独函数)。我想知道一点,虽然我猜Git只是感到困惑,因为这些函数如何被添加到文件的顺序不明确(对吧?)。虽然这对Python来说无关紧要,但我猜Git对此并不够聪明(也许这里有一个主题:是否有某种方法可以通过更智能的合并来自动解决这些问题?)。

具体来说,我现在改变单个提交的顺序:rebase-change-screen I.e.我把这个test_..._extra_spatial提交了一点。现在我收到这条冲突消息:conflict-msg-screen在终端,git status现在告诉我这个:

interactive rebase in progress; onto d5530561
Last commands done (4 commands done):
   pick 863c746d GenericAttentionLayer wip
   pick e9443620 test_GenericAttentionLayer_weights_auto_squeeze_time_end
  (see more in file .git/rebase-merge/done)
Next commands to do (15 remaining commands):
   pick 2c6b3bfa test_GenericAttentionLayer_weights_heads_auto_squeeze_time_end
   pick 269eb63e test_GenericAttentionLayer_weights_heads_time_end
  (use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'genericatt-wip' on 'd5530561'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

        both modified:   tests/test_TFNetworkRecLayer.py

no changes added to commit (use "git add" and/or "git commit -a")

.git/rebase-merge/done的内容是:

pick 2260330b4253c94ef662c641c61204ce14ba1e29 test_GenericAttentionLayer_basic
pick 85c0f36048b451911820aa44dff316970d644609 test_rec_layer_move_out_of_loop_ref_att_generic_att
pick 863c746d56ae96f24bbada41fd4d0973ec5d1579 GenericAttentionLayer wip
pick e9443620401e2d50a2dede65101e98f567ca724d test_GenericAttentionLayer_weights_auto_squeeze_time_end

所以,它说这些命令已经完成,但我想这意味着最后一个命令(pick e9443... test_...weights_auto_squeeze_time_end)还没有完成,但这实际上是它当前尝试应用的命令,它随提交失败,对吧?当我做git show e94436...时,我看到这个提交添加了函数test_..._weights_auto_squeeze_time_end(并没有别的),即它显示:

commit e9443620401e2d50a2dede65101e98f567ca724d
...

    test_GenericAttentionLayer_weights_auto_squeeze_time_end

diff --git a/tests/test_TFNetworkRecLayer.py b/tests/test_TFNetworkRecLayer.py
index 7d39d604..efc80499 100644
--- a/tests/test_TFNetworkRecLayer.py
+++ b/tests/test_TFNetworkRecLayer.py
@@ -2682,6 +2682,26 @@ def test_GenericAttentionLayer_basic():
   ...


+def test_GenericAttentionLayer_weights_auto_squeeze_time_end():
+  ...
+
+
 def test_GenericAttentionLayer_extra_spatial():
   ...

直接在这种状态下查看该代码文件,我看到:

<<<<<<< HEAD
=======
def test_GenericAttentionLayer_weights_auto_squeeze_time_end():
  ...


def test_GenericAttentionLayer_extra_spatial():
  ...


>>>>>>> e9443620... test_GenericAttentionLayer_weights_auto_squeeze_time_end

点击'Merge'给我这个界面:merge-screen这个带我到这里的主要问题:

我不太了解界面。我究竟在左侧,中间和右侧看到了什么? “你的版本,分支genericatt-wip”,“结果”和“分支.../master,rev 85 ......的变化”是什么意思?

这是将单个提交应用(挑选)到master +之前已经应用的其他提交的中间状态,对吗?但是我在哪里可以看到它之前已经应用了哪些其他提交?我在哪里可以看到它正在尝试应用哪个提交?

似乎在左侧添加了两个函数,在中间添加了一个函数,而在右侧,没有添加任何函数。但这个差异显示在什么?为什么左边增加了两个功能?每个提交只添加一个函数,那么怎么会发生呢?

在哪里/如何查看当前应用的提交将发生什么变化?那么我在哪里可以看到它之前是什么,它将会是什么,以及它的变化是什么?所以,基本上,我知道每次提交的更改应该是添加一个函数,但我不确定我怎么看到这种情况正在发生。

(界面来自PyCharm,但我不确定这是多么相关。这些问题可能是Git的通用。)

git pycharm
1个回答
1
投票

我可以在这里回答你问题的三分之二 - 为什么会发生冲突,以及如何弄清楚发生了什么。我不知道PyCharm接口所以我只能猜测它向你展示的是什么。

为何冲突

在您显示的屏幕截图中,冲突的原因是您有一个提交,它会添加一个与尚不存在的块相邻的块,因为您已选择在序列中稍后重新绑定它:我认为您'在test...spatial()之后加入test...end(),但后者尚不存在。我假设它会在稍后考虑添加它的提交时添加。

当Git看到连续的变化时,它不会进一步发展,因为这需要猜测而且并不总是安全的。您必须检查这些并解决冲突以说出正确的结果。

如何知道发生了什么

我通过在提交中在文件a的末尾添加“line1”,然后在第二次提交中添加“line2”来重现您的方案:

$ git log --format=oneline master
0a3b254 (master) line2
ef7e059 line1

现在,当我在0a3b254之前选择ef7e059并且命令行命令告诉我哪个提交有冲突并且在那里停止时,我重新调整以反转这两个提交并发生冲突:

$ git rebase -i HEAD^^
Auto-merging a
CONFLICT (content): Merge conflict in a
error: could not apply 0a3b254... line2

现在,您正在使用不同的接口,因此我不知道它是否显示问题提交,但git status将执行此操作,如果您在命令行上运行它:

$ git status
interactive rebase in progress; onto bf27dcb
Last command done (1 command done):
   pick 0a3b254 line2
Next command to do (1 remaining command):
   pick ef7e059 line1

现在我可以检查我正在尝试使用git show 0a3b254进行变换的提交,它显示我在“line1”之后添加“line2”。

我也可以看看a看看冲突是什么:

$ cat a
asdf
<<<<<<< HEAD
=======
line1
line2
>>>>>>> 0a3b254... line2

这告诉我,在master,这里没有线(在<<<<<<< HEAD=======之间),而在0a3b254,我有两条线。我知道要保留哪些方法是通过做git show 0a3b254,因为在这一点上a什么都没有告诉我要保留什么。

所以我通过保留我的版本中的“line2”并继续rebase来解决冲突:

# edit a to keep just line2
git add a
git rebase --continue
...
CONFLICT (content): Merge conflict in a
error: could not apply ef7e059... line1

再次,我再次与ef7e059发生冲突,因为在同一个地方添加了两个块,Git当然不知道以什么顺序放置它们。

$ cat a
asdf
<<<<<<< HEAD
line2
=======
line1
>>>>>>> ef7e059... line1

在这里Git告诉我,我在HEAD的先前提交中添加了line2,在我正在进行的提交中添加了line1,ef7e059。这对于找出正确的顺序没有帮助,git show ef7e059也没有用,但是git show mybranch:a向我展示了原始分支中a的内容(因为在rebase完成之前分支不会更新)并帮助我弄清楚我需要插入第1行后的第2行。

# edit a to place its contents in the right order
git add a
git rebase --continue

关于PyCharm GUI的猜测

在你的界面中,我期待结果(中心窗格)是你必须放置冲突解决结果的地方,左窗格可能是提取的代码中的代码状态,右窗格可能是樱桃挑选发生的代码的状态。

根据对此答案的评论以及您在问题中显示的添加信息,我猜测Result包含错误的函数,您可能必须将此函数替换为实际尝试添加的函数。

尝试是没有害处的:你可以随时尝试查看它是否有效,如果最终结果与rebase之前的代码不一致(根据git diff),则可以稍后恢复rebase。

© www.soinside.com 2019 - 2024. All rights reserved.