![](/img/trans.png)
[英]How to merge only one commit to master and not all commits of a branch?
[英]How can I rebase 3 commits with one merge of master into one commit?
当我遇到这种情况时,我似乎总是迷迷糊糊,完全弄乱了git commits。 我希望这次能避免这种情况。 这是我的情况。 我的PR中有以下4个提交:
Commit 1: Remove unused routes for the projects controller
Commit 2: Add PR request changes and modify similar_by_tags_route
Commit 3: Merge Master and resolve git merge conflicts
Commit 4: Reinsert rubocop disablement for project.rb
我需要将这些提交重新构建为一个提交。 现在,由于主控器的讨厌合并,我不能只是重新设置rebase -i HEAD~4
。 有没有一种方法我可以简单地删除提交3并仅合并提交1、2和4? 我真的希望对此有所帮助,因为在进行此类棘手的合并时,我似乎总是一团糟。
您可以尝试对分支进行交互式的变基,而只需删除包含合并提交的行即可。 运行git rebase -i HEAD~4
应该会显示一系列提交,如下所示:
pick Commit 1: Remove unused routes for the projects controller
pick Commit 2: Add PR request changes and modify similar_by_tags_route
pick Commit 3: Merge Master and resolve git merge conflicts
pick Commit 4: Reinsert rubocop disablement for project.rb
删除包含合并提交的行,剩下的就是:
pick Commit 1: Remove unused routes for the projects controller
pick Commit 2: Add PR request changes and modify similar_by_tags_route
pick Commit 4: Reinsert rubocop disablement for project.rb
现在将第2次和第4次提交更改为squash
,以告诉Git将这些提交合并为单个第一次提交:
pick Commit 1: Remove unused routes for the projects controller
squash Commit 2: Add PR request changes and modify similar_by_tags_route
squash Commit 4: Reinsert rubocop disablement for project.rb
完成变基,您应该随心所欲。 请注意,像这样重新定基础意味着重写分支的历史记录。 因此,如果此分支由其他人公开共享,则应采取预防措施。
假设您的4个提交位于分支B1上,这就是用于创建PR的分支的名称。
将多个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
# We can add these changes as one commit.
# Adding . will also add untracked files.
git add --all
git commit
请注意,这根本不涉及功能分支。 如果稍后将功能分支再次合并到母版中,则其所有提交将重新出现在日志中。
您也可以反过来进行操作(将master合并到分支中并重置为master状态),但这会破坏您在feature分支中的提交,这意味着您无法将其推送到原始位置。
硬模式:壁球提交
此方法比使用上面的get reset方法更难。 另外,如果您先前将母版合并到功能分支中,则效果也不佳(您需要再次解决所有冲突)。
我们在这里描述的内容将破坏提交历史,并且可能出错。 因此,请在单独的分支上进行压缩:
git checkout -b squashed_feature
这样,如果您搞砸了,则可以返回到原始分支,再创建另一个分支以进行压缩,然后重试。
要压缩自从master分支以来的所有提交,请执行
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.