壁球几个Git修订成一个单一的提交
本文演示了如何使用多个脏WIP合并一个丑陋的特性分支提交回主作为一个漂亮的承诺。
简易模式:重置您的特性分支到主状态
把多次提交的特性分支最简单的方式为单一提交被重置在主功能分支修改并再次提交一切。
# Switch to the master branch and make sure you are up to date.
git checkout master
git fetch # this may be necessary (depending on your git config) to receive updates on origin/master
git pull
# Merge the feature branch into the master branch.
git merge feature_branch
# Reset the master branch to origin's state.
git reset origin/master
Git现在将所有更改视为未分离的更改。
# We can add these changes as one commit.
# Adding . will also add untracked files.
git add --all
git commit
请注意,这根本不触及特征分支。如果要在稍后阶段再次将功能分支合并到主设备中,则其所有提交将会重新出现在日志中。
你也可以这样做(将主体合并到分支并重置为主状态),但这会破坏您在功能分支中的提交,这意味着您无法将其推送到原点。
硬模式:壁球提交
这种方法比使用上述的get复位方法更难。如果您以前将主控合并到了功能分支中,它也不能正常工作(您需要再次解决所有冲突)。
我们在这里描述的将会破坏提交历史并可能出错。出于这个原因,做挤压在一个单独的分支:
git checkout -b squashed_feature
这样,如果你搞砸了,你可以回到你原来的分支,让另一个分支的挤压,然后再试一次。
壁球,因为你支主客场的所有承诺,做
git rebase -i master
注意基础重建到主如果合并主到您的特性分支,而你对新功能的工作不起作用。如果你这样做了,你将需要找到原始的分支点,并用SHA1修订版调用git rebase。
你的编辑器将文件打开像
pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
每一行代表一个承诺(按时间顺序排列,最新的提交将在底部)。
转换所有这些提交到一个单一的一个,该文件改成这样:
pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
这意味着,你把第一次提交和壁球以下到它。如果你删除一行,相应的提交实际上真的丢失了。不要打扰更改提交消息,因为它们被忽略。保存压缩设置后,编辑器会再次打开,要求提交压缩提交的提交消息。
现在,您可以合并您的功能作为一个单一的提交到主:
git checkout master
git merge squashed_feature
转到头〜2,创建一个分支,樱桃挑4,重订HEAD〜3? –
为了避免出现这样的问题,您应该在master上重新设置分支,而不是将master分支到该分支。 (如果您知道分支机构中的这些提交需要稍后进行合并,并且只针对您的非公共/共享分支) –