压缩远程分支中的任意提交

Squash arbitrary commits in a remote branch

我对 Git 有点菜鸟,任务是清理我最近开发的功能的历史记录。我和这个家伙 here 有类似的设置。我也有点想完成同样的事情,但我想压缩到特定的提交。例如,如果我的提交是 commit1, commit2, ..., commitN,我想做到 commit1, commit2, ... 被压缩为 commitXcommitX+1、commitX+2、... 被压缩为 commitY ;等等

我知道这可以通过命令

git rebase -i origin/*branch_name*

但问题是当我运行那个命令时,我得到这个:

noop

# Rebase a112005..a112005 onto a112005 (1 command(s))
...

据我了解,最后一次和第一次提交应该显示在这里,但它只看到最后一次提交。当我尝试 运行 选择或压缩任何其他提交时,它说:

error: could not apply *commit hash*... *commit message*

这显然意味着它找到了提交,因为它知道它的消息,但由于某种原因,它甚至不认为它是可编辑的。有人知道我该如何解决这个问题吗?此外,如果有人为我的设置推荐更好的基于终端的同步系统或更好的组织方式,我将不胜感激。

您不能在远程跟踪分支上执行任何操作。事实上,您一开始就不能成为 "on" 远程跟踪分支。 (git checkout 命令是将您置于 "on a branch" 的命令,如 git status 所示;但它不会将您置于远程跟踪分支上,只会将您置于本地分支上。)

一般来说,要在 Git 存储库中实现某些功能,您必须在 您的 Git 存储库中使用 你的 分支名称。

当您希望在某人 else 的 Git 存储库(例如 origin 上的存储库)中发生某些事情时,您可以这样做首先,在 你的 存储库中设置所有内容,然后使用 git push 询问 他们将你的工作纳入 他们的存储库并设置他们的分支名称之一以匹配。

如果你要求他们——控制另一个存储库的另一个 Git——将他们的 branch-name 设置为指向某个特定的提交,1 他们同意,然后,到那时,你的 Git 会将你的 origin/<em>branch-name</em> 设置为指向相同的提交,因为 他们的 Git 已经告诉你,是的,它现在正在为那个特定的分支使用那个特定的提交。


1他们需要提交,但如果他们不提交,您的git push会先给他们已经有了。这就是 git push 的工作原理。首先,它会移交您拥有但他们不需要的一组对象,以便接受您的请求;然后,它会递交一系列请求:"Please set branch B1 to commit 1234567..., and/or branch B2 to commit 89abcde..., and/or set tag T to ..."。他们的 Git 服从 none、部分或所有这些请求,为每个请求发送 "ok" 或 "no, and here's why" 响应。