我有一个主分支。我从master创建了一个feature1分支。我从feature1创建了一个feature2分支。我知道在某个时候feature1将被合并到master中并被删除。假设在那之前我不会推或拉,当那发生时我应该采取什么行动?_编辑我假设feature1在被合并之前会从master重定基础。
knsnq2tg1#
如果你假设feature1在合并之前被重基到master上,那么要用最新的master更新feature2,高级重基将起作用:
feature1
master
feature2
git fetch git rebase feature1 feature2 --onto origin/master
用一句话来说:将feature2上所有不能被feature1访问的(非合并)提交,按顺序一个接一个地重放到origin/master上。备注:1.“无法到达”是Git表示“不在分支上”的方式。如果你列出了feature1和feature2历史中的每一个提交,那么除了feature2上的那些新提交之外,大多数提交都会出现在这两个分支中。这些提交是唯一会被重新定基的。1.请注意,在本例中,feature1表示feature1的 local 副本所指向的feature2上的提交。如果你没有本地副本,那么检查你的分支以获取提交ID,它是feature2上第一个新提交的 * 父代 *。(这也代表了origin/feature1在被重定基础之前 * 使用 * 指向的内容,并且可能随后被删除。
origin/master
origin/feature1
2uluyalo2#
我同意@TTT的回答 * 一般 *,但**我想提出的情况下,feature1已被删除或重新定位。由于它是一个独立的分支,您不能假设当您想要运行命令时,该分支将在那里。假设你从这里开始:
* III (feature2, origin/feature2) * HHH * GGG * FFF (feature1, origin/feature1) * EEE * DDD * CCC (main, origin/main) * BBB * AAA
让我们假设每个本地分支都在跟踪其远程分支。那么..如果feature1的开发人员决定在main的新版本之上 rebasefeature1,会发生什么?所以你去找,你发现这个:
main
* FFF' (origin/feature1) * EEE' * DDD' * KKK (origin/main) * JJJ | * III (feature2, origin/feature2) | * HHH | * GGG | * FFF (feature1) | * EEE | * DDD |/ * CCC (main) * BBB * AAA
如果你足够幸运有一个feature1的本地副本,那么运行这个就可以了,正如TTT所建议的那样:
git rebase --onto origin/feature1 feature1 feature2
你会得到这样的结果:
* III' (feature2) * HHH' * GGG' * FFF' (origin/feature1) * EEE' * DDD' * KKK (origin/main) * JJJ | * III (origin/feature2) | * HHH | * GGG | * FFF (feature1) | * EEE | * DDD |/ * CCC (main) * BBB * AAA
然而,一般来说,保留一个分支的本地副本是不明智的,特别是如果它不是你的。例如,注意2个分支feature1分支(本地和远程分支)是如何指向不同的地方的。不好。你可能会想这样做来修复它:
git checkout feature1 git pull
这是一个大的禁忌,因为现在你想把你在本地feature1和远程中的提交合并或变基,而 * origin/feature1是分支,你在本地分支中的提交无关紧要**,应该被丢弃.所以你应该这样做,而不是调整指针:
git branch -f feature1 origin/feature1
但这是徒劳的,如果你问我...你不应该有一个本地的feature1分支摆在首位除非你 * 真的 * 需要它.然后,你应该运行什么来做你的分支的变基将是:
git rebase --onto origin/feature1 FFF feature2
或
git rebase --onto origin/main FFF feature2
2条答案
按热度按时间knsnq2tg1#
如果你假设
feature1
在合并之前被重基到master
上,那么要用最新的master
更新feature2
,高级重基将起作用:用一句话来说:
将
feature2
上所有不能被feature1
访问的(非合并)提交,按顺序一个接一个地重放到origin/master
上。备注:
1.“无法到达”是Git表示“不在分支上”的方式。如果你列出了
feature1
和feature2
历史中的每一个提交,那么除了feature2
上的那些新提交之外,大多数提交都会出现在这两个分支中。这些提交是唯一会被重新定基的。1.请注意,在本例中,
feature1
表示feature1
的 local 副本所指向的feature2
上的提交。如果你没有本地副本,那么检查你的分支以获取提交ID,它是feature2
上第一个新提交的 * 父代 *。(这也代表了origin/feature1
在被重定基础之前 * 使用 * 指向的内容,并且可能随后被删除。2uluyalo2#
我同意@TTT的回答 * 一般 *,但**我想提出的情况下,
feature1
已被删除或重新定位。由于它是一个独立的分支,您不能假设当您想要运行命令时,该分支将在那里。假设你从这里开始:让我们假设每个本地分支都在跟踪其远程分支。
那么..如果
feature1
的开发人员决定在main
的新版本之上 rebasefeature1
,会发生什么?所以你去找,你发现这个:如果你足够幸运有一个
feature1
的本地副本,那么运行这个就可以了,正如TTT所建议的那样:你会得到这样的结果:
然而,一般来说,保留一个分支的本地副本是不明智的,特别是如果它不是你的。例如,注意2个分支
feature1
分支(本地和远程分支)是如何指向不同的地方的。不好。你可能会想这样做来修复它:这是一个大的禁忌,因为现在你想把你在本地
feature1
和远程中的提交合并或变基,而 *origin/feature1
是分支,你在本地分支中的提交无关紧要**,应该被丢弃.所以你应该这样做,而不是调整指针:但这是徒劳的,如果你问我...你不应该有一个本地的
feature1
分支摆在首位除非你 * 真的 * 需要它.然后,你应该运行什么来做你的分支的变基将是:或