如何通过将master合并为一次提交来修改3次提交?

时间:2017-06-21 04:39:06

标签: git

当我遇到这种情况时,我似乎总是绊倒并完全弄乱git提交。我希望这次能避开它。这是我的情景。我的公关中有以下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?我真的希望得到一些帮助,因为当涉及到这样棘手的合并时,我似乎总是陷入巨大的混乱。

4 个答案:

答案 0 :(得分:3)

您可以尝试对分支执行交互式rebase,只需删除包含合并提交的行。运行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

完成rebase,你应该留下你想要的东西。请注意,像这样的重新定位意味着重写分支的历史记录。因此,如果该分支由其他人公开分享,您应该采取预防措施。

答案 1 :(得分:2)

如果您还没有推送到远程而只是简化: String[] name = {"tom", "dick", "harry"}; for(int i = 0; i<=name.length; i++) { System.out.print(name[i] +'\n'); } 然后git rebase -i HEAD~4首先提交,pick第三个提交,drop其他。

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

Example

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

但是,如果你推送到远程我建议你只是恢复第三次提交并离开其他提交,因为rebase会重写历史记录,对于已经撤回提交的人来说可能是毁灭性的,所以我宁愿不要玩git的历史。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

将几个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状态)但这会破坏你在功能分支中的提交,这意味着你不能将它推送到原点。

硬模式:壁球提交

这种方法比使用上面的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