2017-06-21 63 views
2

当我遇到这种情况时,我似乎总是绊倒并且搞砸了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?我真的很想在这方面得到一些帮助,因为在涉及到这样的棘手问题时,我似乎总是弄得一团糟。

+0

转到头〜2,创建一个分支,樱桃挑4,重订HEAD〜3? –

+0

为了避免出现这样的问题,您应该在master上重新设置分支,而不是将master分支到该分支。 (如果您知道分支机构中的这些提交需要稍后进行合并,并且只针对您的非公共/共享分支) –

回答

1

你可以尝试做你的分支的互动底垫,只是删除包含合并提交行。运行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 

现在改变第二和第四个承诺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 

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

+0

到目前为止最好的方法。这真的有窍门。谢谢! –

0

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

  1. 创建本地分支B2(等同于B1)
  2. 删除本地分支B1
  3. 创建从原点/主本地分支B1
  4. 樱桃拾取提交1,2,4(按顺序)通过在B2中查看它们的散列到分支B1上。
  5. 壁球他们(交互式衍合)
  6. 力推B1原产
  7. 删除本地分支B2
+0

为什么要创建新分支? – kuskmen

+0

因此,git引用了提交散列,你将樱桃采摘到新的分支从原籍/主 – Manan

0

如果您还没有被推到远程但只是变基:git rebase -i HEAD~4然后pick第一次提交,drop第三个和squash其他人。

下面是一些例子我在控制台那样:

Example

注意,可用同样的命令,也许你现在可以比你看到所有的人都选择更合适的东西。

然而,如果你推到远程我建议你刚刚恢复第三犯,离开别人是因为底垫改写历史,可以是毁灭性对于已经退出你的提交,所以我宁愿不玩历史的人的混帐。

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 

请注意,这根本不触及特征分支。如果要在稍后阶段再次将功能分支合并到主设备中,则其所有提交将会重新出现在日志中。

你也可以这样做(将主体合并到分支并重置为主状态),但这会破坏您在功能分支中的提交,这意味着您无法将其推送到原点。

硬模式:壁球提交

这种方法比使用上述的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 
相关问题