当我从另一个分支中樱桃挑战时,然后尝试将其合并。如果应用了更多更改,我有合并冲突。
一个很好的例子是,如果我遵循" gitflow"陈词滥调的方式(主,开发,功能/bugfix,hotfix(。这是步骤:
- 我将
bugfix
合并到develop
- 我将更多功能合并到
develop
- 我将旧的
bugfix
挑选出来,然后将其作为hotfix
将其应用于master
- 如果我将
master
合并回develop
,我会得到合并冲突。 - 如果我结帐我的
bugfix
合并提交,则合并master
(因此创建此事"中间"合并(,然后合并此"之间"合并为develop
一切都在没有任何冲突的情况下起作用。
如果没有发生任何变化,git如何弄清楚樱桃挑选。但是如果还有更多添加了变化,这是git的世界末日。
这是我问题C'的ASCII架构C'是樱桃采摘的C:
(键:✔=无冲突,✘=冲突(
+-------------------->✘ <--+
| |
| |
| ✔<--------+ |
| ^ | |
| | +-+--+
| | | M2 +<-----+
| | +-+--+ |
| + ^ +-+-+
| +----------->✔<--------+ | | D |
| | | | +-+-+
+-+-++ +-+--+ ^
| Ma +<----+ +---->+ M1 +------+
+-+--+ | | +-^--+
^ +-+--+ +-+-+ |
| | C' | | C | |
| +-+--+ +-+-+ |
| ^ ^ |
| | | |
| +-+--+ +-+-+ |
| | B' | | B | |
| +-+--+ +-+-+ |
| ^ ^ |
+-+--+ | | |
| A +-----+---------+-------+
+-+--+ | | |
| | | |
| | | |
+ + + +
Master Cherry- Bugfix Develop
Picked
Hotfix
这是我的脚本创造这种情况:
git init
echo -e "foonbarnbaznquxnquux" > file
git add file
git commit -m "Initial commit"
git checkout -b develop
git branch second-feature
git checkout -b first-feature
echo -e "foo1nbarnbaznquxnquux" > file
git commit -m "First feature" file
git checkout develop
git merge --no-ff -m "Merge first feature" first-feature
git checkout second-feature
echo -e "foonbarnbaz2nquxnquux" > file
git commit -m "Second feature" file
git checkout develop
git merge --no-ff -m "Merge second feature" second-feature
git tag before-bugfix
git checkout -b bugfix
echo -e "foo1nbarnbaz2nquxnquux1" > file
git commit -m "Bugfix (part I)" file
echo -e "foo1nbarnbaz2nquxnquux2" > file
git commit -m "Bugfix (part II)" file
git checkout develop
git merge --no-ff -m "Merge bugfix" bugfix
git checkout -b third-feature
echo -e "foo1nbarbaz2nquxnquux3" > file
git commit -m "Third feature" file
git checkout develop
git merge --no-ff -m "Third feature" third-feature
git checkout master
git cherry-pick -x before-bugfix..bugfix
如果这样做,我会得到:
$ git checkout develop
$ git merge --no-ff master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.
如果这样做,我会得到:
$ git checkout -b new-master bugfix
$ git merge --no-ff -m "In-between Merge" master
Merge made by the 'recursive' strategy.
$ git merge --no-ff -m "Merge master" new-master
Already up-to-date!
Merge made by the 'recursive' strategy.
有没有办法在没有任何冲突的情况下合并解决这个问题?
我尝试了不同的合并启动,但没有起作用。我试图合并大师bugfix同时开发,我仍然会发生冲突。
要完成您的期望,git必须跟踪合并分支的整个历史,以识别同等的提交并跳过它。它没有这样做,它仅使用历史上的3个提交:父母和"合并基础" - 父母的共同祖先。
如果您愿意,可以指导它:
- 创建一个临时的"合并"分支:
git checkout -b master_with_develop master
- 在樱桃挑选提交之前合并
develop
- 单独合并了樱桃挑选的提案。希望这将认识到这些变化是相同的,不会冲突。在最坏的情况下,冲突将更小,更容易理解
- 合并
develop
的其余部分 - 重置为
develop
并合并master_with_develop
-它将是快进的(您也可以将其标记为--no-ff
,以创建显式合并提交(
您可以检查试图自动执行该过程的Git-Imerge工具