![](/img/trans.png)
[英]How to make a Git merge operation ignore identical changes made to both branches?
[英]How to merge changes to both branches
现在,我有一个develop
分支,并使用git checkout -b feature-keyboard develop
作为新版本git checkout -b feature-keyboard develop
了一个新的分支feature-keyboard
。 现在,我需要对两个分支进行更改。 我现在正在做的是: git checkout -b feature-ui-changes develop
然后添加一些更改来提交它们。 然后git checkout develop
和git merge --no-ff feature-ui-changes
。 但是,如果我先执行相同的结帐feature-keyboard
,然后将更改合并到feature-ui-changes
。 它说冲突。 而且应该如此。 但是,在对应用程序进行一些更改之后,如何更新对develop
和feature-keyboard
分支的更改?
您可以在一个分支上进行更改,然后将其提交。 然后切换到另一个分支并选择您的更改:
git cherry-pick <commit-hash>
如果您发现自己需要“两次提交”两个分支之间的众多更改,则表明您的过程可能存在问题。 也许代码过早地分支了。
Git有一个不错的工作流,可以在您开发某些东西的同时创建一个“主题”分支,同时跟上该主题上游的更改。 即,您可以使用git rebase
重写分支历史记录,并将更改迁移到上游的较新版本。
这为您减轻了两次提交的麻烦,也避免了您为每个上游提交分叉两个副本。
$ git checkout -b topic
# ... hack, commit, hack, commit, ...
$ git checkout master
# ... pull, hack, commit, pull, ...
现在, master
上出现了各种各样的新东西,它们没有反映在topic
:您所做的更改,以及可能从另一个存储库引入的上游更改。 您想回到topic
上的工作,但可以根据新的master
。 这就是重新定级的意义:
$ git checkout topic
$ git rebase master
Git会找出当前分支, topic
和master
之间的祖先点。 从那时起,将进行topic
更改,并从当前的master
挑选它们。 然后,将产生的选择安装为topic
分支。 因此, topic
分支被重写:被该分支的全新版本替换。 (当然,一路上,您可能必须解决冲突。)
如果您有两个或两个以上这样的主题,则可以独立对待它们:在返回主题时将它们中的每个主题重新设置基础,并与主要更改保持最新。
变基后的好处是, topic
重新设置后,它包含后缀(例如master
)作为后缀:它具有master
所有提交,以及一些新的提交。 此时,您可以执行以下操作:
git checkout master
git reset --hard topic # fast-forward master to the topic
现在master
拥有所有topic
更改:实际上, master
和topic
指向同一个提交对象:它们是相同的。 我们可以安全地进行此操作,因为由于最近的重新部署, master
没有任何不在topic
提交。 因此,我们没有抛弃任何master
东西:它只是向前跳。
如果master
确实有一些新的提交,您还可以进行“其他方式的变基”:
# on master
git rebase topic # same as git reset --hard topic if master has no new commits!
放回master
上的新更改,然后引入topic
更改,然后在顶部重新播放(选择樱桃)新更改。 这是重新master
topic
的镜像: rebase
不在乎哪个分支是主干,哪个主题。
但是,如果这些新的master
提交是公开的,那么您将通过基于topic
更改重新定义公共历史来编写公开历史。 你可以摆脱这一点,如果所有的新master
承诺不会在topic
是你自己的和未发表的(你让他们在本地并没有git push
他们-ed到另一个回购),或者你有一些其他的理由重写master
的历史甚至如果已发布。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.