如何在git中压缩已推送的提交?

840
这里有一个很好的解释,可以帮你理解如何压缩多个提交记录:

http://git-scm.com/book/en/Git-Branching-Rebasing

但对于已经被推送的提交记录无效。我该如何压缩最近的几个提交记录,包括本地和远程仓库?当我运行 git rebase -i origin/master~4 master 命令时,在编辑器中将第一个设置为 pick,将其它三个设置为 squash,然后退出(在emacs中通过c-x c-c),我得到了:
$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)

Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started

这里的2f40是pick提交。现在4个提交记录都没有出现在git log中。我原本期望编辑器会被重新启动以便我能输入提交信息。我做错了什么?


1
不是那么全面,但很容易阅读:https://www.internalpointers.com/post/squash-commits-into-one-git - Janos Vinceller
12个回答

1

我的情况是需要将所有功能分支提交压缩成一个,以获得整洁的提交历史记录。使用GitHub UI完成此操作。

问题:

  • 从主分支(master)创建了特性分支(例如:featureBranch)(一个月前)。
  • 将所有更改提交到特性分支(~12次提交,一个月的工作时间)。并定期推送到远程仓库。

需求:

  • 获取最新的主分支(master)代码合并到特性分支(featureBranch),并将特性分支(featureBranch)中的所有提交压缩为单个提交。

所执行的步骤:

  • 在GitHub UI中从主分支(master)创建一个新的分支(例如:featureBranchLatest)。
  • 从特性分支(featureBranch)向featureBranchLatest创建Pull Request(PR)。
  • 解决任何冲突。在GitHub UI中使用合并 PR 时使用 squash 提交选项。(更改提交消息以获得更干净的消息)。

现在,特性分支(featureBranchLatest)将具有单个提交包括所有所需更改和最新的主分支(master)更改。如果不需要参考旧分支,则删除旧分支(featureBranch)。


0
合并(变基)特定分支中的提交
列出所有特定分支的提交 模型
git cherry -v <ORIGINAL_BRANCH> <YOUR_BRANCH>

例子

git cherry -v main some_branch_name

[Ref(s).: https://dev59.com/lGUq5IYBdhLWcg3wC79Q#24668421 ]
如果在创建的分支中有多个提交,执行rebase操作将所有内容集中到一个提交中。
提示:这个过程对于组织和确保在一个分支中进行的所有更改可以通过cherry pick过程带到另一个分支中是很重要的。
合并(rebase)提交
rebase基本上是提交的“合并”。
模型
git rebase -i origin/<YOUR_BRANCH>~<NUMBER_COMMITS_TO_REBASE> <YOUR_BRANCH>

例子

git rebase -i origin/some_branch_name~2 some_branch_name

注意:<NUMBER_COMMITS_TO_REBASE>表示您要合并(rebase)的提交数量 - 也就是“列出所有特定分支提交”命令显示的提交数量 - 而-i表示交互模式。

一个文本编辑器将会打开。只保留由“列出所有分支提交…”命令显示的提交(哈希)。将最旧的提交(它将首先出现)保留为“pick”,其他的按顺序改为“squash”。保存后的这个配置文件将作为批处理文件被git执行。

模型

git push origin +<YOUR_BRANCH>

例子

git push origin +some_branch_name

重要提示:如果要将推送强制限制在一个分支(<YOUR_BRANCH>),请在其前面加上+进行推送。

[参考文献:https://dev59.com/_W035IYBdhLWcg3wBLTb#5668050]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接