如何壁球提交在git后,他们已经被推?

这很好地解释了压缩多个提交:

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 masterInteractive rebase already started

其中2f40是pick提交。现在4个提交都没有出现在git log中。我希望我的编辑器重新启动,以便我可以输入提交消息。我做错了什么?

529036 次浏览

Squash在本地提交

git rebase -i origin/master~4 master

然后用力推动

git push origin +master

--force+的区别

git push的留档:

请注意,--force适用于所有推送的引用,因此使用push.default设置为matching或多个推送使用remote.*.push配置的目的地可能会覆盖其他引用比当前分支(包括严格落后的本地裁判)他们的远程对应物)。要强制推送到一个分支,请使用+在refSpec前面推(例如git push origin +master强制master分支的推送)。

在一个分支上,我可以这样做(对于最后4次提交)

git checkout my_branchgit reset --soft HEAD~4git commitgit push --force origin my_branch

很多问题可以通过创建一个branch来处理和没有来处理master来避免:

git checkout -b mybranch

以下代码适用于已推送的remote提交�推送提交/local仅提交的混合:

# example merging 4 commits
git checkout mybranchgit rebase -i mybranch~4 mybranch
# at the interactive screen# choose fixup for commit: 2 / 3 / 4
git push -u origin +mybranch

我也有一些拉取请求备注可能会有帮助。

git rebase -i master

你会得到编辑器vm打开和msgs类似这样的东西

Pick 2994283490 commit msg1f 7994283490 commit msg2f 4654283490 commit msg3f 5694283490 commit msg4#Some message##some more

在这里,我将所有其他提交的选择更改为“f”(代表修复)。

git push -f origin feature/feature-branch-name-xyz

这将修复所有提交到一个提交并删除所有其他提交。我做到了这一点,它帮助了我。

与接受的答案略有不同,但我有很多困难,终于得到了它。

$ git rebase -i HEAD~4
  • 在打开的交互式屏幕上,将挑选替换为Squash在顶部的所有提交,你想压扁。
  • 保存并关闭编辑器

使用以下方式推送到远程:

$ git push origin branch-name --force

对于在单个分支上压缩两个提交,其中一个已经推送,以下工作:

git rebase -i HEAD~2[ pick     older-commit  ][ squash   newest-commit ]git push --force

默认情况下,这将包括最新提交的提交消息作为对旧提交的注释。

1)git rebase -i HEAD~4

详细说明:它适用于当前分支;HEAD~4意味着压缩最新的四次提交;交互模式(-i)

2)此时,编辑器打开了提交列表,以更改第二次和随后的提交,用壁球替换选择然后保存它。

输出:成功重新定位和更新refs/头/分支名称。

3)git push origin refs/heads/branch-name --force

输出:

remote:remote: To create a merge request for branch-name, visit:remote: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sssremote:To ip:sc/server.git+ 84b4b60...5045693 branch-name -> branch-name (forced update)

当您使用Gitlab或Github时,您可能会以这种方式遇到麻烦。您可以使用上述方法之一压缩您的提交。我更喜欢的是:

git rebase -i HEAD~4orgit rebase -i origin/master

为您的提交选择squash或修复。此时您将检查git状态。消息可能是:

    On branch ABC-1916-remoteYour branch and 'origin/ABC-1916' have diverged,and have 1 and 7 different commits each, respectively.(use "git pull" to merge the remote branch into yours)

你可能会被诱惑去拉它。不要这样做或者你会和以前一样。

相反,使用以下内容推送到您的原点:

git push origin +ABC-1916-remote:ABC-1916

+允许只强制推送到一个分支。

Sqush远程更改

  • 首先确保您的本地主机与远程主机相当
  • 然后将您的本地功能分支重置为与master相同:git reset --soft master
  • 然后添加所有修改和更改(您在您刚刚重置为master的本地功能分支)到暂存区:git add .
  • 然后提交这些更改:git commit -m "this is the final commit message"
  • 然后强制推送到远程分支:git push RemoteBranch --force

在我的案例中,要求将所有功能分支提交压缩为一个,以拥有干净的提交历史记录。利用GitHub UI来做到这一点。

问题:

  • 功能分支(例如:功能分支)已从master(一个月前)创建。
  • 将我所有的更改提交到功能分支(~12次提交,一个月的工作)。并定期推送到远程。

业务需求

  • 获取与master一起更新的功能分支,并在功能分支中进行单个提交

采取的步骤:

  • 从GitHub UI中的master创建一个新分支(例如:功能分支最新)。
  • 创建一个PR,将其从特征分支转移到特征分支。
  • 解决冲突(如果有)。将PR与GitHub UI中的squash提交选项合并。(更改提交消息以获得更干净的消息)。

现在功能分支最新将有一个提交,包含单个提交中所需的所有更改,以及主服务器的最新更改。如果不需要引用,请删除旧的分支功能分支。

对于可能感兴趣的人来说,这就是你在GitHub PR中压扁提交时的样子。

之前:输入图片描述

之后:

输入图片描述