将分支折叠为一个提交

时间:2012-07-17 18:56:13

标签: git github

基本上我一直在研究一个功能但是当我将该功能推回到主仓库以进行代码检查时,他们喜欢整个功能被推送为一次提交。我通常使用git rebase -i来设置除第一次提交之外的所有内容以及第一次提交以进行编辑。然后,每次发生冲突时,我都会粘贴最新的文件。

我宁愿在冲突期间不必粘贴各种文件。我希望能够保留最新的文件,并基本上删除它们如何变得更简单的命令的历史。

编辑:

我正在寻找与此bash脚本等效的Git命令:

for file in `git diff --name-only master foo`
git checkout foo $file

2 个答案:

答案 0 :(得分:11)

使用Squashed Merges

你想要的是一个被压扁的合并。这会将您的所有更改合并到工作树中,但您可以自己进行实际提交。例如:

git checkout foo
git rebase -i master
git checkout master
git merge --squash foo
git commit -m 'Squashed commit.'

来自rebased分支的所有更改都将作为单个提交进行,并带有一条提交消息。只要您在 foo 分支中解决了与rebase的任何冲突,合并就会在合并到master时产生冲突。

答案 1 :(得分:0)

如果您git rebase -i '@{upstream}'(如上所述压扁),您可能会遇到需要真正解决方案的真正冲突。如果您只是复制粘贴更改,那么您可能正在撤消自您开始功能开发回归功能以来发生的对远程的更改。

如果您知道这对单个文件是安全的,那么在rebase期间,您始终可以执行git checkout --theirs $file以避免复制粘贴,但这将替换整个文件,该文件可以替换自动合并的区域;在这种情况下,'他们'是应用的更改集,即您的更改。

如果您确定总是如此,那么您可以设置合并策略,例如git rebase -m -s merge-recursive -X theirs -i '@{upstream}'

注意:这仅适用于最近版本的Git中的交互式rebase。

在我看来,一个更简单的方法是git rebase -i \ {{}}(如所描述的那样压扁)有效地将分支重新定位到自身。结果将不会在此步骤中解决合并冲突,因为更改的应用顺序与它们在相同代码上创建的顺序相同。然后,这将跟随git merge-base HEAD '@{upstream}'\,此时您将以正常方式解决与上游的冲突。

更简单,假设您可以很好地管理文件,那就是git rebase '@{upstream}' \ git reset。此时,您只需将您更改的文件添加到舞台中,然后进行新的提交,如前一段所述,可以对其进行重新设置。