Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在git中压缩推送后的提交?_Git_Squash - Fatal编程技术网

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

如何在git中压缩推送后的提交?,git,squash,Git,Squash,这很好地解释了挤压多个提交: 但它不适用于已经推送的提交。如何挤压本地和远程回购中最近的几个提交 当我执行git rebase-I origin/master~4 master时,将第一个设置为pick,将其他三个设置为squash,然后退出(通过emacs中的c-x c-c),我得到: 其中2f40是pickcommit。现在这4个提交都没有出现在git日志中。我希望重新启动编辑器,以便输入提交消息。我做错了什么?用 git rebase -i origin/master~4 master

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

但它不适用于已经推送的提交。如何挤压本地和远程回购中最近的几个提交

当我执行
git rebase-I origin/master~4 master
时,将第一个设置为
pick
,将其他三个设置为
squash
,然后退出(通过emacs中的c-x c-c),我得到:


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

git rebase -i origin/master~4 master
然后用力推

git push origin +master

--force
+
根据以下文件:

请注意,
--force
适用于所有按下的参照,因此使用 使用
push进行编辑。默认设置为
matching
或多推 使用
remote.*配置的目标。推送
可能会覆盖其他引用
比当前分支(包括严格落后的本地引用)
他们遥远的对手)。要强制只推送一个分支,请使用
+
在refspec前面推动(例如
git推动原点+主控
强制 推送到
主机
分支)


在一个分支上,我可以这样做(过去4次提交)


通过只创建一个
分支
来处理&而不是
主分支
,可以避免很多问题:

git签出-b mybranch

以下内容适用于已推送的
remote
提交&混合了
remote
推送提交/
local
仅提交:

# example merging 4 commits

git checkout mybranch
git 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 msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message 
#
#some more
在这里,我将所有其他提交的pick改为“f”(表示fixup)

git push-f原始要素/要素分支名称xyz

这将修复对一个提交的所有提交,并删除所有其他提交。
我这样做了,这对我很有帮助。

与公认的答案略有不同,但我在压榨过程中遇到了很多困难,最终得到了答案

$ git rebase -i HEAD~4
  • 在打开的交互式屏幕上,将“拾取”替换为“挤压” 在顶部显示所有要挤压的提交
  • 通过
    esc-->:wq
使用以下命令推送到远程:

$ 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) 此时,编辑器打开了提交列表,以更改第二次和后续提交,将pick替换为squash,然后保存它

输出:已成功重新设置引用/标头/分支名称的基础并进行更新

3)
git推送原点引用/头/分支名称--force

输出:

远程:
远程:要为分支名称创建合并请求,请访问:
远程:http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
远程:到ip:sc/server.git
+84b4b60…5045693分支机构名称->分支机构名称(强制更新)

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

git rebase -i HEAD~4
or
git rebase -i origin/master
为您的提交选择挤压或修复。此时,您将检查git状态。信息可能是:

    On branch ABC-1916-remote
    Your 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

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

您也可以
git push--force origin master
:是的,但我总是喜欢这种语法,因为它比较短。当然,要知道,如果其他人可能已经从远程存储库中提取了,您可能不想这样做-在这种情况下,答案是“您不想”,我认为OP完全是在复制命令
git-rebase-I origin/master
,并且实际上想知道如何将提交重新设置到比这更久远的位置,例如
git-rebase-I origin/master~20 master
+
只强制使用以它为前缀的refspec<代码>--force
将强制推送所有参考规范。请查看更新后的答案。在一个已经推送的分支上使用软命令执行此操作,最终为我推送了大量其他人的提交。一吨?怎么可能超过4个呢?你能详细说明一下吗?我不确定,但它与试图压扁已推送的提交有关。看起来其他人也有类似的经历-我会接受这个预期的答案。这是4个步骤中最清晰、最被接受的答案。如果编辑器是vi或vim,那么这是一个简单、有效、详细的:esc-->:wq,特别是如果你有冲突,他们可以比你强迫更容易解决push@Ray_Poly-这不会把那些远程提交放回本地提交吗?这就是我发现的。是的,它将创建一个新的提交,但您可以从中看到差异,这比每次重新设置git历史记录都要好。这需要成为最佳答案并感谢您。我发现这个答案是一种更好的挤压方法,而不是根据提交的数量盲目地进行挤压。特别是使用VM编辑器,您可以一次完成很多事情,如更改提交、删除提交,当然还有挤压。虽然不全面,但易于阅读:
    On branch ABC-1916-remote
    Your 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