Git Rebase vs;“反向合并”;
在git中,如果我有一个旧功能,我们就称之为,Git Rebase vs;“反向合并”;,git,Git,在git中,如果我有一个旧功能,我们就称之为,feature/improvement从mastermaster分支的feature/improvement得到大约500次提交,并且feature/improvement需要更新,我看到了3个选项 将主控形状合并到功能/改进上 将功能/改进合并到master指向的提交上,并将功能/改进的属性更改为指向新的合并提交 重基 2对我来说似乎是最直接的选项,它显示了一个合并提交,它显示了旧的更改,并重新应用于最新的主更改 但是工具和历史会变得非常混乱,因为
feature/improvement
从master
master分支的feature/improvement
得到大约500次提交,并且feature/improvement
需要更新,我看到了3个选项
306 touch demo.txt
307 echo "1" > demo.txt
308 git add demo.txt
309 git commit "Master 1"
310 git status
311 git commit -m "Master 1"
312 echo "2" > demo.txt
313 git commit "Master 2"
314 git add .
315 git commit -m "Master 2"
316 git status
317 git log
318 git branch feature
319 git checkout feature
320 echo "a" > demo.txt
321 echo "b" > demo.txt
322 echo "c" > demo.txt
323 git commit -m "feature c"
324 git add .
325 git commit -m "feature c"
326 echo "d" > demo.txt
327 git commit -m "feature d"
328 git add .
329 git commit -m "feature d"
330 git checkout master
331 echo "3" > demo.txt
332 git add .
333 git commit -m "master 3"
334 echo "4" > demo.txt
335 git add .
336 git commit -m "master 4"
337 echo "5" > demo.txt
338 git add .
339 git commit -m "master 5"
340 git branch feature2
341 git checkout feature2
342 git merge help
343 git help merge
344 git merge feature
345 git add .
// This is where I gave up, and Used Source Tree to use a GUI to reset feature to feature2's ref
346 git status
347 git commit
348 git status
349 echo "e" > demo.txt
350 git add .
351 git commit -m "feature e"
352 checkout -b "master"
353 git checkout master
354 git commit -m "master 6"
355 echo "6" > demo.txt
356 git add .
357 git commit -m "master 6"
导致
合并将获取
主控
中的所有更改,并尝试将它们与功能/改进
的更改合并。请原谅这些可怜的ascii图表
master -------------
feature \----\--
^ ^
Branch Merge
rebase将获取功能/改进
中的所有更改,并实际移动这些更改,就好像它们是在提交主控
更改后提交的一样
重设基准前:
master -------------
feature \------
^
Branch
重设基准后:
master -------------
feature \------
^
Branch
换言之:
- 合并:“合并这两个提交”
- Rebase:“重写历史记录,以便我的提交中的所有更改仅在master之后应用”
主控
中的所有更改,并尝试将它们与功能/改进
的更改合并。请原谅这些可怜的ascii图表
master -------------
feature \----\--
^ ^
Branch Merge
rebase将获取功能/改进
中的所有更改,并实际移动这些更改,就好像它们是在提交主控
更改后提交的一样
重设基准前:
master -------------
feature \------
^
Branch
重设基准后:
master -------------
feature \------
^
Branch
换言之:
- 合并:“合并这两个提交”
- Rebase:“重写历史记录,以便我的提交中的所有更改仅在master之后应用”
- 我不知道反向合并。但在这种情况下,我们有两种选择。首先,
git-rebase
。让我们看看rebase做了什么。
考虑下面的历史:
船长:c1、c2、c3、c4
改进:c1、c2、c5、c6、c7
获得了结帐改进
git重新基址主机
现在,首先将删除您在yot分支上所做的所有提交,然后将应用来自主节点的新提交,以使您的历史记录与主节点相同。在此之后,rebase将把您的工作应用到它上面
您的历史变成:
c1,c2,c3,c4,c5,c6,c7
根据我的说法,这使得事情变得非常复杂,但如果您已经将更改从改进
推送到远程,则不建议执行重基,因为它可能会创建重复提交
第二,git合并
它将在改进分支上应用来自主分支的提交以及合并提交。如果您已经远程推送了tour分支,建议使用此选项
希望有帮助。我不知道反向合并。但在这种情况下,我们有两种选择。首先,
git-rebase
。让我们看看rebase做了什么。
考虑下面的历史:
船长:c1、c2、c3、c4
改进:c1、c2、c5、c6、c7
获得了结帐改进
git重新基址主机
现在,首先将删除您在yot分支上所做的所有提交,然后将应用来自主节点的新提交,以使您的历史记录与主节点相同。在此之后,rebase将把您的工作应用到它上面
您的历史变成:
c1,c2,c3,c4,c5,c6,c7
根据我的说法,这使得事情变得非常复杂,但如果您已经将更改从改进
推送到远程,则不建议执行重基,因为它可能会创建重复提交
第二,git合并
它将在改进分支上应用来自主分支的提交以及合并提交。如果您已经远程推送了tour分支,建议使用此选项
希望有帮助。@吉姆·赖特的答案很好。关于
$git-rebase
的一些其他想法:
就生成的源代码而言,合并和重基有什么区别?
没有。两个操作完成后将生成相同的源代码
为什么要重新设定基准?
Git的rebase操作将使项目的历史记录更加线性,因此更易于阅读
像git-rebase
这样的“重写”提交历史的命令不是很糟糕吗?
我不认为rebase不好。这是保持历史可读性的非常有用的技术。
清晰易读的VCS历史有助于理解项目的发展。我建议保持它整洁,即使有一点额外的努力
另一方面,如果您使用的是已发布的主题分支,则应避免重新编写历史记录的操作,因为这可能会影响到其他拉入该分支的团队成员。也就是说,一些团队(比如我的团队)有关于在主题分支上重写历史记录的许可规则。我的队伍很小。如果我确信没有其他人撤销我的分支,我很可能会重新设定基准。在合并拉取请求时,我还将定期重新设置过时主题分支的基础
“重写”提交是怎么回事?我以为Git的历史是加密的?
Git从不覆盖任何提交。它复制或重放诸如rebase之类的操作的提交。事实上,在一段时间内,从中复制的提交Git仍然可以通过reflog使用。它们不会通过重基操作自动销毁,必要时可以恢复。@Jim Wright的答案很好。关于
$git-rebase
的一些其他想法:
就生成的源代码而言,d是什么