我仍在尝试为我们的项目决定Git工作流程。它非常混乱,有点难以掌握。我可能遗漏了一些显而易见的事情,或者做错了。这里有一个经常发生的场景
目标是让主人拥有漂亮而整洁的历史,而无需提交无用的评论,例如"修复"或" wip"。这些发生在那些正在沿着多台计算机移动的人身上,或者只是想从其他团队成员那里得到帮助。
我们过去一直在做git rebase origin/master
。然而,必须遵循git pull --rebase
,因此可以在没有--force
的情况下将其推送到远程。这导致了一些破坏,特别是当该分支与其他人共享时。
现在我们正在尝试不同的方法并执行常规git merge origin/master
,这会在功能分支上创建丑陋的合并提交,但它是最快且通常无痛的路径。然而,当功能分支完成后,梦魇再次开始。我们希望使用 rebase 将这些功能提交压缩到大约1-3次提交,具体取决于复杂性,特别是我们希望摆脱那些在中间发生的合并提交。
事情是,通常有很多冲突有时候很难解决,特别是当文件的更改被分成多个提交时。在历史中的某一点解决冲突通常会为下一次提交创建另一个冲突。很难记住该文件是如何查看该特定提交的。
所以我正在做git rebase -i --onto <feature-branch> -p origin/master
。我不确定-p
( - preserve-merges )。使用它时,只会跳过最新合并提交之前的提交。我很难理解那里发生的事情和原因。没有-p
它从分支的最开始就进行所有提交,甚至会发生更多冲突。
基本上我想要实现的是对功能分支中所有这些提交的文件进行snapshop,然后从中进行一次新的提交。这可能是可以使用diff来制作补丁,然后在主服务器上应用该补丁。然而,所有的历史都在那里消失,如果我想看看谁和何时添加了这个改变,那么实际上是不可能找到的。
答案 0 :(得分:2)
基本上我想要实现的是从功能分支中的所有提交中获取文件的快照,然后从中创建一个新提交
你可以这样做:
$ git checkout master
$ git merge --squash feature
$ git commit -m'squashed merge of feature'
但请注意,您丢失了功能分支和合并提交之间的父子关系。这意味着稍后在功能分支上做更多工作并重新合并是有问题的(因为git无法正确找到共同的祖先)。