繁体   English   中英

如何将3次提交与主服务器的一次合并重新定为一次提交?

[英]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

完成变基,您应该随心所欲。 请注意,像这样重新定基础意味着重写分支的历史记录。 因此,如果此分支由其他人公开共享,则应采取预防措施。

如果您还没有推送到远程,只是简单地重新设置了基准: git rebase -i HEAD~4然后pick第一个提交, drop第三个提交,然后squash其他提交。

这是我在控制台中所做的一些示例:

例

请注意也可用的命令,也许您现在可以选择比看到的所有命令更合适的命令。

但是,如果您推送到远程位置,我建议您只还原第三个提交,然后再离开其他提交,因为重新编写基础会重写历史记录,并且对于已经撤消提交的人来说可能是毁灭性的,因此我宁愿不要使用git的历史记录。

假设您的4个提交位于分支B1上,这就是用于创建PR的分支的名称。

  1. 创建本地分支B2(与B1相同)
  2. 删除本地分支B1
  3. 从来源/母版创建本地分支B1
  4. Cherry-pick通过查看分支B1中的哈希将1,2,4,(按顺序)提交到分支B1上。
  5. 压扁它们(交互式变基)
  6. 强制将B1推到原点
  7. 删除本地分支B2

将多个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

请注意,这根本不涉及功能分支。 如果稍后将功能分支再次合并到母版中,则其所有提交将重新出现在日志中。

您也可以反过来进行操作(将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM