我有一个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
我的问题如下。
我不想深入了解git。简单的外行答案得到了预期,但技术细节也受到欢迎。
当我尝试从V1分支执行git diff V2时,我可以看到V1和V2之间的差异很少添加和删除很少。
然后从V1我做了git pull原点V2并再次做了git diff V2,我可以再次看到相同的差异,只有更多的差异。
这是正确的行为,因为我怀疑它不是因为没有差别或只有额外的差异。?
答案 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
如果合并 V2
到V1
:
git checkout V1
git merge V2
并发生冲突,
当你打开git mergetool
时:
LOCAL
)将是V1
的文件版本REMOTE
)将是V2
的文件版本BASE
)将是:X
的文件版本
X
是最新提交,是V1
和V2
如果将 V2
重新加入V1
:
git checkout V2
git rebase V1
快速提醒git rebase:
git查找V2
上尚未V1
上的提交(在我们的图表中,这些提交将为Y
,Z
和{{1} })和&#34;重播&#34; B
位于Y
之上,然后V1
位于最后一次提交之上,然后Z
位于最后一次提交之上。
冲突:
重播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集的响应,
对于下面的其他问题,解释应该有所帮助。
git Rebase
是正确的行为,它通过为原始分支中的每个提交创建全新的提交来重写项目历史记录。
如果您在相同的文件中有类似的提交,这有助于清理混乱的历史记录。有一点是你无法跟踪何时将更改纳入功能。
Git checkout v2
Git rebase -i V1
这有助于交互式变基,您可以相应地更改提交。