我已经从GitHub的存储库中分叉了一个分支,并提交了一些具体的东西给我。现在我发现原来的存储库有一个很好的功能,这是在HEAD。
我想合并它只是没有以前的提交。我该怎么办?我知道如何合并所有的提交:
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push
我已经从GitHub的存储库中分叉了一个分支,并提交了一些具体的东西给我。现在我发现原来的存储库有一个很好的功能,这是在HEAD。
我想合并它只是没有以前的提交。我该怎么办?我知道如何合并所有的提交:
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push
当前回答
我会提出一个答案。这就是通过Export手动更改并提交到目标分支,对于使用像tortoise这样的工具,导出可以真正有效地实现这一点。我知道这在SVN中工作得很好,到目前为止,在git的一些测试中也取得了同样的成功,只要它们是100%相同的,就不应该在未来合并特性分支时解决任何冲突。
Let me show an example: c:/git/MyProject_Master/ModuleA/ c:/git/MyProject_FeatureA/ModuleA/ Let's suppose we wanted all the files from ModuleA's FeatureA branch to be in the master branch. Assume for a moment this is a huge project and there are other modules, and we know from experience that ModuleA has no dependencies that would cause a compiler or functional issue from the new changes of the feature branch. Select the ModuleA folder and choose Export from tortoise. Then pick ModuleA of master to export it into. Finally, do a file difference check on each file to review the changes, using the diff tool, be sure that all calls out are still compatible. Make sure it compiles, thoroughly test. Commit, push. This solution is a time-tested and effective for svn.
其他回答
如果您已将更改提交给主分支。现在您想要将相同的提交移动到release分支。检查提交id(例如:xyzabc123)。
现在试试下面的命令
git checkout release-branch
git cherry-pick xyzabc123
git push origin release-branch
如果你是新手,尝试GitHub桌面版本,当你选择选择选项时,GitHub会要求你选择你想要提交的分支。
1)
2)
前面的答案描述了如何将特定提交的更改应用到当前分支。如果这就是你所说的“如何合并”,那么就按照他们的建议进行选择。
但是如果你真的想要合并,也就是说,你想要一个有两个父节点的新提交——当前分支上现有的提交,以及你想要应用更改的提交——那么选择是不能实现的。
拥有真实的合并历史可能是可取的,例如,如果您的构建过程利用git祖先来根据最新标记自动设置版本字符串(使用git describe)。
而不是选择,你可以做一个实际的git合并-不提交,然后手动调整索引,删除任何你不想要的变化。
假设你在分支A上,你想合并分支B顶端的提交:
git checkout A
git merge --no-commit B
现在,您已经准备好创建一个带有两个父类的提交,即a和B的当前提示提交。然而,您可能应用了比您想要的更多的更改,包括来自B分支早期提交的更改。您需要撤消这些不需要的更改,然后提交。
(可能有一种简单的方法可以将工作目录的状态和索引设置回合并之前的状态,这样您就可以在一个干净的石板上选择您想要的提交。但我不知道怎样才能重新开始。git checkout HEAD和git reset HEAD都将删除合并状态,违背了此方法的目的。)
因此,手动撤消不需要的更改。例如,你可以
git revert --no-commit 012ea56
对于每个不想要的提交012ea56。
当你完成调整时,创建你的commit:
git commit -m "Merge in commit 823749a from B which tweaked the timeout code"
现在您只有想要的更改,并且祖先树显示您从技术上合并了B。
我会提出一个答案。这就是通过Export手动更改并提交到目标分支,对于使用像tortoise这样的工具,导出可以真正有效地实现这一点。我知道这在SVN中工作得很好,到目前为止,在git的一些测试中也取得了同样的成功,只要它们是100%相同的,就不应该在未来合并特性分支时解决任何冲突。
Let me show an example: c:/git/MyProject_Master/ModuleA/ c:/git/MyProject_FeatureA/ModuleA/ Let's suppose we wanted all the files from ModuleA's FeatureA branch to be in the master branch. Assume for a moment this is a huge project and there are other modules, and we know from experience that ModuleA has no dependencies that would cause a compiler or functional issue from the new changes of the feature branch. Select the ModuleA folder and choose Export from tortoise. Then pick ModuleA of master to export it into. Finally, do a file difference check on each file to review the changes, using the diff tool, be sure that all calls out are still compatible. Make sure it compiles, thoroughly test. Commit, push. This solution is a time-tested and effective for svn.
我们将不得不使用git cherry-pick <commit-number>
场景:我在一个名为发布的分支上,我只想从主分支添加一些更改到发布分支。
步骤1:签出您想要添加更改的分支
Git签出版本
步骤2:获取你想要添加的变更的提交号
例如
git cherry-pick 634af7b56ec
第三步:git push
注意:每次合并都会创建一个单独的提交号。不要为不能工作的合并取提交号。相反,是你想添加的任何常规提交的提交号。