GIT从分叉存储库中提取,但两者都已提升

时间:2017-10-06 09:00:20

标签: git

我有一个git知识库,有一个分支说V1 我已经提交了它的提交说c1.1-> c1.2-> c1.3,但后来我从名称V2的c1.2分叉,因为我需要从c1.2维护单独的分支。
我添加了几个/多个提交说c2.1-> c2.2-> c2.3。
平均时间V1进入c1.3-> c1.4-> c1.5 现在,我想在V1分支中添加在V2分支中完成的更改,但不影响在V1中完成的更改。

我想我可以通过从c1.2提交创建V2分支来做到这一点 git pull origin V2 --rebase

我的问题如下。

  1. 上述命令是否成功运行而不会篡改V1和V2的任何提交。
  2. 如果我在两个版本中更改了相同的文件但代码的不同部分会怎样?
  3. 如果我在两个版本中更改了相同的文件和相同的代码怎么办?
  4. 如果上面两个事件同时发生在同一个文件上怎么办?
  5. 以上3点会有冲突吗?如果是的话怎么解决呢?如果没有那么为什么?
  6. 提交消息会怎样?
  7. 我不想深入了解git。简单的外行答案得到了预期,但技术细节也受到欢迎。

    当我尝试从V1分支执行git diff V2时,我可以看到V1和V2之间的差异很少添加和删除很少。
    然后从V1我做了git pull原点V2并再次做了git diff V2,我可以再次看到相同的差异,只有更多的差异。
    这是正确的行为,因为我怀疑它不是因为没有差别或只有额外的差异。?

2 个答案:

答案 0 :(得分:1)

在git中执行此操作的两种基本方法是:

  • 将V2合并到V1:

    git checkout V1
    git merge V2
    
  • 在V1之上重新定位V2:

    git checkout V2
    git rebase V1
    

如果git检测到双方都修改了任何文件,两边的diff不完全相同,它会在提交之前停止,并让你检查所述文件的内容。

这就是所谓的冲突,您可以找到一些指南,帮助您选择要保留的每个修改块的版本。

一个起点是:如果出现这种情况,请运行命令git mergetool git将以3窗格模式打开您的默认差异工具,您可以在其中比较文件的两个版本(左侧和右侧),并构建您希望保留在中间的版本。

关于git mergetool中显示内容的一些解释:

让我们说你的历史是这样的:

*--*--X--*--*--*--A <- branch V1
       \
        Y--Z--B <- branch V2
  • 如果合并 V2V1

    git checkout V1
    git merge V2
    

    并发生冲突,
    当你打开git mergetool时:

    • 左侧窗格(LOCAL)将是V1的文件版本
    • 右侧窗格(REMOTE)将是V2的文件版本
    • 中间窗格(BASE)将是:X的文件版本 X是最新提交,是V1V2
    • 的祖先
  • 如果 V2重新加入V1

    git checkout V2
    git rebase V1
    

    快速提醒git rebase:

    git查找V2上尚未V1上的提交(在我们的图表中,这些提交将为YZ和{{1} })和&#34;重播&#34; B位于Y之上,然后V1位于最后一次提交之上,然后Z位于最后一次提交之上。

    git rebase中的

    冲突:

    重播B,重播Y或重播Z时可能会发生冲突。

    在每一步,&#34;基础提交&#34;将是重播提交的父母:

    • 如果在重播B时发生冲突,则基本提交将为Y
    • 如果在重播X时发生冲突,则基本提交将为Z
    • 如果在重播Y时发生冲突,则基本提交将为B

    git mergetool中显示的内容:

    当您打开Z时:

    • 左侧窗格(git mergetool)将是LOCAL的文件版本
    • 右侧窗格(V1)将REMOTE的文件版本,具体取决于触发冲突的步骤
    • 中间窗格(replayed commit)将是BASE的文件版本,具体取决于触发冲突的步骤

答案 1 :(得分:0)

你的qsns集的响应,

  1. 提交永远不会被篡改。每次提交都存储在合并时携带的版本中。
  2. 如果发生相同的线路冲突,文件将自动合并,不会发生冲突
  3. 然后会出现冲突,您必须手动解决此冲突并提交这些文件。
  4. 对于下面的其他问题,解释应该有所帮助。

    git Rebase是正确的行为,它通过为原始分支中的每个提交创建全新的提交来重写项目历史记录。 如果您在相同的文件中有类似的提交,这有助于清理混乱的历史记录。有一点是你无法跟踪何时将更改纳入功能。

    Git checkout v2
    Git rebase -i V1
    

    这有助于交互式变基,您可以相应地更改提交。