Git合并冲突:找不到问题
Git merge conflict: Cannot find the problem
一些背景故事!
我一直在与 git 一起为一个开源包做贡献,我在这方面有点新手。我知道一些基本的东西。此外,我还读到如果发生合并冲突,我们可以通过文件,标记可以帮助我们找到同一文件的两个版本中相互冲突的代码块。
最近第一次遇到合并冲突,而且是在Jupyter笔记本文件(.ipynb)上。但是,合并冲突的标记使 Jupyter 无法读取笔记本。所以,我尝试了 JSON 编辑器和 VS CODE 和 Notepad++。虽然我现在可以看到这个文件,但它真的很乱,因为它不仅有 Jupyter notebook 的所有元数据,而且甚至执行次数也显示冲突。另外,如果notebook中有一个单元格输出的图形,转换成很多字符,向下滚动浏览它们很头疼。
在搜索google和Whosebug并与项目所有者讨论问题后,我们决定采取另一种方法。但是,它不起作用。 (我在下面解释了,但首先我需要提供更多信息。请耐心等待)
根据提交的历史,我应该是在本地创建此类冲突的人,可能是因为在上游(在 originAL 回购中)没有人更改 PARENT 分支上的同一文件)
因此,请让我先简要介绍一下分支和我对文件所做的一些更改。
- 分叉和克隆后,我创建了一个分支
branch-A
- 我更改了笔记本的“notebook-file”
- 我做了 Pull Request (PR)
- 我创建了A的一个子分支,我们称之为
sub-branch-of-A
- 切换到支行后,我改了两个.py文件,然后也改了那个
notebook-file
- 合并
sub-branch-of-A
到 branch-A
在我的 branch-A
中,我做了:git push origin branch-A
但我得到了 non-fast-forward
错误。这意味着发生了分歧。正确的?所以,我做了 git pull origin branch-A
来解决它,但是我得到了 notebook-file
.
的合并冲突
备选方案
所以,有人告诉我可以将文件复制到本地 git 存储库之外的某个地方,然后执行 git checkout notebook-file
以在发生分歧的父节点中获取文件。正确的?然后,如果我这样做 git pull ...
应该没有问题(然后我可以包括那个复制文件的更改)
但是...
我又遇到了合并冲突错误。我发疯了,尝试了很多东西,但仍然一无所获。
我在下面附上了 git 日志。
我说的支行是Snippets_Tutorial
,支行是Snippets_Regime
。如果我没记错的话,我使用 git checkout -b Snippets_Regime Snippets_Tutorial
创建了那个子分支。正如我之前提到的,我切换到子分支 Snippets_Regime
并对 somefile.py
文件和 notebook-file
做了一些更改。然后,我将它合并到 Snippets_Tutorial
.
$ git log --all --graph --decorate --oneline
* 8d62ec9 (MERLIN_Tutorial) modify the code for comparing MERLIN3 (MATLAB) and MERLIN (Python) implementation
* 4952e92 (origin/MERLIN_Tutorial) Use MERLIN (of Table3) on Mars Science Labratory data to reproduce Fig. 17 of paper (top and botthm)
* 8d04aaa plot discords of NYC TAXI data that discovered by ONLY python or ONLT matlab
* 2bbb569 Revise DRAG, Implement MERLIN, and Try MERLIN on data
* 361824f correct the implementation of the algorithm to return correct NN index of the discords
* dd6eb87 Revise the implementation of DRAG algorithm provided in Table 1 and 2.
* 1adb0f6 Allow merge from main to my local branch
|\
* | 62e6b29 Add Tutorial for Matrix Profile XXI: MERLIN algorithm #Issue 417
| | * 81798ab (HEAD -> Snippets_Tutorial) copy back Snippet Tutorial notebook
| | * e680e0f allow git to track the file (?)
| | * eef7018 Copy back Snippet Tutorial notebook to the Snipperts_Tutorial branch
| | * 15ebf32 remove snippet tutorial local file from its developing branch tto allow merge from the main
| | * 06c05e3 merge updated files from origin to my branch (?)
| | |\
| | |/
| |/|
| * | 4c05d54 (upstream/main, origin/main, origin/HEAD, main) Fixed #414 Added fork syncing, checkbox fix to Contribute.ipynb
|/ /
| * be9169c resolve issues raised by flake8
| * c7a2654 (Snippets_Regime) update the notebook according to the updated version of snippet module
| * e4c0696 Change snippet_regime from list to numpy array
| * c6ab996 correct the block of code for plotting the snippets regimes
| * ed1b1a6 add the plot of snippets regime to check out the functionality of snippets_regime added to snippets modules
| * 52da7b2 remove blank line after docstring of a function
| * 6d599df use stumpy.mplstyle to refactor the rcparams
| * e968427 add the slices of indices for each snippet in the output
| * 910746e [WIP]: save temp changes
| * 911abaf [WIP] Revise the intro section and legend of figures
| * b47e727 Add textual context and Improve the flow and figures
| * b9ad95e Add the introduction part
|/
* 589630e Saved widget state in notebook
* 21abb19 Added empty array _get_array_ranges unit test
* 9f6c2cf Fixed #413 Edge Case in core._get_array_ranges
* db1c694 Updated STUMPY_EXCL_ZONE_DENOM test
* 7383cb7 Added gpu_stimp
* 1f1f426 Added stimped feature
* e87f9ad Fixed #411 Bad import of config settings
* 50a9089 Replaced mpl params with style file
* f80e6ce Fixed typo
* 000a0e6 Replaced nan_to_num in unit test
* c67fd56 Fixed #409 Added IPython to docs/requirements.txt; #409 (#410)
* 248ce34 Fixed typo in docstrings of subspace & _subspace (#406)
* c178889 Replaced nan_to_num with np.isnan
* 05cfc52 Fixed #237 Added STIMP (aka SKIMP) feature
* a59d57f Added bonus section on interpreting mp columns
* 9bf1944 Updated conda installation and environment
* 856dc75 Moved additional excl_zone parameter to config.py
* 48864d2 Added motif_idx with include/discords subspace example
* ebb3559 Added include/discords tutorial example to subspace
* 03bbdca Fixed grammar in contributor guide
* 3832b21 Fixed #385Clarifying the "Make your Changes" Section of Contributor Guide (#386)
| * 5f004a2 (origin/Snippets_Tutorial) [WIP] Revise the intro section and legend of figures
| * 0afad01 Add textual context and Improve the flow and figures
| * 9d0095a Add the introduction part
|/
| * 7a36675 (origin/Geometric_Chain, Geometric_Chain) Add chain analysis for respiration data and reproduce Table 2 of the paper
| * 01dc5d3 Correct/Update the markdowns and the result (adding discussion and figures)
| * e27b6b9 Correst docstrings of several functions
:
我附上了同样的东西,但是是图像格式,因为我需要突出显示两个提交:
图像底部突出显示的提交是我在分叉中看到的提交。
另一个突出显示的提交是当我认为我可以通过 git merge main <branch>
解决它时,而我在 <branch>
。蓝色曲线包围的部分是东西合并的地方,不知道这里发生了什么(我的意思是,我不完全记得我发疯时使用的确切 git 命令)
如果我遗漏了什么,有人可以帮助我/指导我吗?
合并冲突解决中重要的是两个提示和基础,以及冲突。其他一切都是噪音。
git diff :1:that.file :2:that.file
git diff :1:that.file :3:that.file
将向您展示两组更改 git 的合并。在几乎所有与git diff MERGE_HEAD... that.file
和git diff ...MERGE_HEAD that.file
相同的情况下,只有当Git解决了之前交叉合并引入的异常差异时,即具有不同内容的多个等价合并基础,而不是你在大多数历史中看到的东西,基础内容不是来自单个现有的基础提交。
合并冲突在分布式版本控制系统中是不可避免的,因为分支总是不同的。你想要的不是避免合并冲突,而是解决它们的有效方法。
这个问题——正如您亲身经历的那样——Jupyter Notebooks 的文件格式不是很容易手动编辑,所以 git 提供的所有解决合并冲突的默认工具都不会对你帮助不大。
你需要的是 mergetool.
有很多不同的 mergetools 以更用户友好的方式呈现合并冲突,但它们不会解决 Jupyter Notebooks 格式的主要问题。
这就是 nbdime 的来源。 nbdime 为您配置 git,因此当发生冲突时,您可以使用它的 mergetool 直观地解决冲突,而无需查看文本文件,因此 JSON 文件的所有噪音都被回避了.
只需使用 Python 的 pip 安装 nbdime,然后配置 git 即可使用它:
nbdime config-git --enable --global
使用合并工具解释合并冲突应该没有问题。
一些背景故事!
我一直在与 git 一起为一个开源包做贡献,我在这方面有点新手。我知道一些基本的东西。此外,我还读到如果发生合并冲突,我们可以通过文件,标记可以帮助我们找到同一文件的两个版本中相互冲突的代码块。
最近第一次遇到合并冲突,而且是在Jupyter笔记本文件(.ipynb)上。但是,合并冲突的标记使 Jupyter 无法读取笔记本。所以,我尝试了 JSON 编辑器和 VS CODE 和 Notepad++。虽然我现在可以看到这个文件,但它真的很乱,因为它不仅有 Jupyter notebook 的所有元数据,而且甚至执行次数也显示冲突。另外,如果notebook中有一个单元格输出的图形,转换成很多字符,向下滚动浏览它们很头疼。
在搜索google和Whosebug并与项目所有者讨论问题后,我们决定采取另一种方法。但是,它不起作用。 (我在下面解释了,但首先我需要提供更多信息。请耐心等待)
根据提交的历史,我应该是在本地创建此类冲突的人,可能是因为在上游(在 originAL 回购中)没有人更改 PARENT 分支上的同一文件)
因此,请让我先简要介绍一下分支和我对文件所做的一些更改。
- 分叉和克隆后,我创建了一个分支
branch-A
- 我更改了笔记本的“notebook-file”
- 我做了 Pull Request (PR)
- 我创建了A的一个子分支,我们称之为
sub-branch-of-A
- 切换到支行后,我改了两个.py文件,然后也改了那个
notebook-file
- 合并
sub-branch-of-A
到branch-A
在我的 branch-A
中,我做了:git push origin branch-A
但我得到了 non-fast-forward
错误。这意味着发生了分歧。正确的?所以,我做了 git pull origin branch-A
来解决它,但是我得到了 notebook-file
.
备选方案
所以,有人告诉我可以将文件复制到本地 git 存储库之外的某个地方,然后执行 git checkout notebook-file
以在发生分歧的父节点中获取文件。正确的?然后,如果我这样做 git pull ...
应该没有问题(然后我可以包括那个复制文件的更改)
但是...
我又遇到了合并冲突错误。我发疯了,尝试了很多东西,但仍然一无所获。
我在下面附上了 git 日志。
我说的支行是Snippets_Tutorial
,支行是Snippets_Regime
。如果我没记错的话,我使用 git checkout -b Snippets_Regime Snippets_Tutorial
创建了那个子分支。正如我之前提到的,我切换到子分支 Snippets_Regime
并对 somefile.py
文件和 notebook-file
做了一些更改。然后,我将它合并到 Snippets_Tutorial
.
$ git log --all --graph --decorate --oneline
* 8d62ec9 (MERLIN_Tutorial) modify the code for comparing MERLIN3 (MATLAB) and MERLIN (Python) implementation
* 4952e92 (origin/MERLIN_Tutorial) Use MERLIN (of Table3) on Mars Science Labratory data to reproduce Fig. 17 of paper (top and botthm)
* 8d04aaa plot discords of NYC TAXI data that discovered by ONLY python or ONLT matlab
* 2bbb569 Revise DRAG, Implement MERLIN, and Try MERLIN on data
* 361824f correct the implementation of the algorithm to return correct NN index of the discords
* dd6eb87 Revise the implementation of DRAG algorithm provided in Table 1 and 2.
* 1adb0f6 Allow merge from main to my local branch
|\
* | 62e6b29 Add Tutorial for Matrix Profile XXI: MERLIN algorithm #Issue 417
| | * 81798ab (HEAD -> Snippets_Tutorial) copy back Snippet Tutorial notebook
| | * e680e0f allow git to track the file (?)
| | * eef7018 Copy back Snippet Tutorial notebook to the Snipperts_Tutorial branch
| | * 15ebf32 remove snippet tutorial local file from its developing branch tto allow merge from the main
| | * 06c05e3 merge updated files from origin to my branch (?)
| | |\
| | |/
| |/|
| * | 4c05d54 (upstream/main, origin/main, origin/HEAD, main) Fixed #414 Added fork syncing, checkbox fix to Contribute.ipynb
|/ /
| * be9169c resolve issues raised by flake8
| * c7a2654 (Snippets_Regime) update the notebook according to the updated version of snippet module
| * e4c0696 Change snippet_regime from list to numpy array
| * c6ab996 correct the block of code for plotting the snippets regimes
| * ed1b1a6 add the plot of snippets regime to check out the functionality of snippets_regime added to snippets modules
| * 52da7b2 remove blank line after docstring of a function
| * 6d599df use stumpy.mplstyle to refactor the rcparams
| * e968427 add the slices of indices for each snippet in the output
| * 910746e [WIP]: save temp changes
| * 911abaf [WIP] Revise the intro section and legend of figures
| * b47e727 Add textual context and Improve the flow and figures
| * b9ad95e Add the introduction part
|/
* 589630e Saved widget state in notebook
* 21abb19 Added empty array _get_array_ranges unit test
* 9f6c2cf Fixed #413 Edge Case in core._get_array_ranges
* db1c694 Updated STUMPY_EXCL_ZONE_DENOM test
* 7383cb7 Added gpu_stimp
* 1f1f426 Added stimped feature
* e87f9ad Fixed #411 Bad import of config settings
* 50a9089 Replaced mpl params with style file
* f80e6ce Fixed typo
* 000a0e6 Replaced nan_to_num in unit test
* c67fd56 Fixed #409 Added IPython to docs/requirements.txt; #409 (#410)
* 248ce34 Fixed typo in docstrings of subspace & _subspace (#406)
* c178889 Replaced nan_to_num with np.isnan
* 05cfc52 Fixed #237 Added STIMP (aka SKIMP) feature
* a59d57f Added bonus section on interpreting mp columns
* 9bf1944 Updated conda installation and environment
* 856dc75 Moved additional excl_zone parameter to config.py
* 48864d2 Added motif_idx with include/discords subspace example
* ebb3559 Added include/discords tutorial example to subspace
* 03bbdca Fixed grammar in contributor guide
* 3832b21 Fixed #385Clarifying the "Make your Changes" Section of Contributor Guide (#386)
| * 5f004a2 (origin/Snippets_Tutorial) [WIP] Revise the intro section and legend of figures
| * 0afad01 Add textual context and Improve the flow and figures
| * 9d0095a Add the introduction part
|/
| * 7a36675 (origin/Geometric_Chain, Geometric_Chain) Add chain analysis for respiration data and reproduce Table 2 of the paper
| * 01dc5d3 Correct/Update the markdowns and the result (adding discussion and figures)
| * e27b6b9 Correst docstrings of several functions
:
我附上了同样的东西,但是是图像格式,因为我需要突出显示两个提交:
图像底部突出显示的提交是我在分叉中看到的提交。
另一个突出显示的提交是当我认为我可以通过 git merge main <branch>
解决它时,而我在 <branch>
。蓝色曲线包围的部分是东西合并的地方,不知道这里发生了什么(我的意思是,我不完全记得我发疯时使用的确切 git 命令)
如果我遗漏了什么,有人可以帮助我/指导我吗?
合并冲突解决中重要的是两个提示和基础,以及冲突。其他一切都是噪音。
git diff :1:that.file :2:that.file
git diff :1:that.file :3:that.file
将向您展示两组更改 git 的合并。在几乎所有与git diff MERGE_HEAD... that.file
和git diff ...MERGE_HEAD that.file
相同的情况下,只有当Git解决了之前交叉合并引入的异常差异时,即具有不同内容的多个等价合并基础,而不是你在大多数历史中看到的东西,基础内容不是来自单个现有的基础提交。
合并冲突在分布式版本控制系统中是不可避免的,因为分支总是不同的。你想要的不是避免合并冲突,而是解决它们的有效方法。
这个问题——正如您亲身经历的那样——Jupyter Notebooks 的文件格式不是很容易手动编辑,所以 git 提供的所有解决合并冲突的默认工具都不会对你帮助不大。
你需要的是 mergetool.
有很多不同的 mergetools 以更用户友好的方式呈现合并冲突,但它们不会解决 Jupyter Notebooks 格式的主要问题。
这就是 nbdime 的来源。 nbdime 为您配置 git,因此当发生冲突时,您可以使用它的 mergetool 直观地解决冲突,而无需查看文本文件,因此 JSON 文件的所有噪音都被回避了.
只需使用 Python 的 pip 安装 nbdime,然后配置 git 即可使用它:
nbdime config-git --enable --global
使用合并工具解释合并冲突应该没有问题。