Git rebase,更改添加函数的顺序,解决冲突,理解合并

Git rebase,更改添加函数的顺序,解决冲突,理解合并,git,pycharm,Git,Pycharm,我在一个单独的分支(generictwip)中,我想清理提交列表。也就是说,我重新设置到当前主控。 许多提交(所有这些test\uu…commits)都添加了一个新函数(一个新的测试用例)。这是原始列表: 当更改这些操作的顺序时,我得到了一个冲突,尽管原则上没有冲突(所有这些提交都只是添加了一些东西,并且都添加了单独的函数)。我对此有点好奇,尽管我猜Git会感到困惑,因为这些函数添加到文件中的顺序并不清楚(对吧?)。虽然这对Python来说并不重要,但我想Git在这方面还不够聪明(也许在这里是离

我在一个单独的分支(
generictwip
)中,我想清理提交列表。也就是说,我重新设置到当前
主控
。 许多提交(所有这些
test\uu…
commits)都添加了一个新函数(一个新的测试用例)。这是原始列表: 当更改这些操作的顺序时,我得到了一个冲突,尽管原则上没有冲突(所有这些提交都只是添加了一些东西,并且都添加了单独的函数)。我对此有点好奇,尽管我猜Git会感到困惑,因为这些函数添加到文件中的顺序并不清楚(对吧?)。虽然这对Python来说并不重要,但我想Git在这方面还不够聪明(也许在这里是离题的:是否有某种方法可以通过更智能的合并自动解决此类问题?)

具体来说,我现在更改单个提交的顺序: 也就是说,我把这个
test\u…\u extra\u spatical
commit向下移动了一点。 现在我得到了这个冲突信息: 在终端中,
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")
所以,它说这些命令已经完成了,但我想这意味着最后一个命令(
pick e9443…test\uu…weights\u auto\u square\u time\u end
)还没有完成,但这实际上是它当前尝试应用的命令,提交失败了,对吗?当我执行git show e94436…时,我看到此提交添加了函数
test\uu…\u weights\u auto\u squence\u time\u 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
>e9443620。。。测试\u生成拉伸层\u重量\u自动\u挤压\u时间\u结束
单击“合并”可提供以下界面: 这就引出了我的主要问题:

我不太懂界面。我在左边、中间和右边到底看到了什么?“您的版本,分支机构
generictt wip
”、“结果”和“分支机构
../master
,版本85的更改”是什么意思

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

在左侧,添加了两个函数,中间添加了一个函数,右边添加了一个函数。但是这个差异是关于什么的呢?为什么左边增加了两个功能?每次提交只添加一个函数,那么这怎么可能发生呢

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


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

我可以在这里回答您三分之二的问题-为什么会有冲突,以及如何找出发生了什么。我不知道PyCharm界面,所以我只能猜测它显示了什么

冲突的原因

在您显示的屏幕截图中,冲突的原因是您有一个提交,该提交将一个与尚未存在的块相邻的块添加到另一个块,因为您选择了在序列的后面重新设置它的基础:我认为您在
test…spatial()
之后添加
test…end()
,但后者还不存在。我假设它将在稍后考虑添加它的提交时被添加

当Git看到连续的变化时,它不会前进,因为这需要猜测,而且这并不总是安全的。你必须回顾这些并解决冲突,才能说出正确的结果

如何知道发生了什么

我通过在提交中的文件
a
末尾添加“line1”,然后在第二次提交中添加“line2”,再现了您的场景:

$ git log --format=oneline master
0a3b254 (master) line2
ef7e059 line1
现在,当我在
ef7e059
之前选择
0a3b254
,命令行命令告诉我哪个提交有冲突并在那里停止时,我重新设置了基础以反转这两个提交并获得冲突:

$ 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
我再次与ef7e059发生冲突,因为在同一个位置添加了两个块,Git肯定不知道以什么顺序保存它们

$ cat a
asdf
<<<<<<< HEAD
line2
=======
line1
>>>>>>> ef7e059... line1
关于PyCharm GUI的猜测

在您的界面中,我期望的结果(中间窗格)是您必须放置冲突解决结果的地方,左侧窗格可能是正在进行cherry pick的提交中的代码状态,右侧窗格可能是正在进行cherry pick的代码状态

根据对此答案的评论和您在问题中显示的添加信息,我猜结果包含错误的函数,您可能必须将其替换为此提交实际尝试添加的函数


尝试并没有坏处:您可以随时尝试看看它是否有效,如果最终结果与重新基址之前的代码不一致(根据
git diff
),则可以稍后恢复重新基址。

我编辑了我的问题,以同时显示
git status
。关于
git状态
输出:例如,输出中的
Last command done(1 command done)
有点误导,因为这最后一个命令实际上还没有完成,对吗?这是exa
# edit a to keep just line2
git add a
git rebase --continue
...
CONFLICT (content): Merge conflict in a
error: could not apply ef7e059... line1
$ cat a
asdf
<<<<<<< HEAD
line2
=======
line1
>>>>>>> ef7e059... line1
# edit a to place its contents in the right order
git add a
git rebase --continue