Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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_Merge_Git Svn_Squash - Fatal编程技术网

Git 将合并提交重写为挤压合并提交

Git 将合并提交重写为挤压合并提交,git,merge,git-svn,squash,Git,Merge,Git Svn,Squash,我对一个长期存在的分支进行了合并,由于冲突的解决,我花了很多时间才完成合并 我发现我无法使用git svn发布我的工作:git svn rebase将重新设置合并分支的所有提交的基础,而不是提交一个合并提交。我发现git merge--squash有点太晚了 是否可以将合并提交更改为“挤压合并”提交,而不丢失已完成的所有冲突解决工作(即,不触发新的合并,因为我没有启用rere工具)?可能git-rebase--preserve merges对您有效 下面是对执行此操作时发生的情况的详细回答:

我对一个长期存在的分支进行了合并,由于冲突的解决,我花了很多时间才完成合并

我发现我无法使用
git svn
发布我的工作:
git svn rebase
将重新设置合并分支的所有提交的基础,而不是提交一个合并提交。我发现
git merge--squash
有点太晚了

是否可以将合并提交更改为“挤压合并”提交,而不丢失已完成的所有冲突解决工作(即,不触发新的合并,因为我没有启用
rere
工具)?

可能
git-rebase--preserve merges
对您有效

下面是对执行此操作时发生的情况的详细回答:


很抱歉,我不喜欢从那里复制和粘贴。

我遇到了类似的问题,可以通过简单地重置和重新提交更改来创建压缩提交

起始布局:

*   06074985 (HEAD -> test1) Merge branch 'test2' into test1
|\
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit
* 5e229615 (HEAD -> test1) squash commit
| *   06074985 (temp) Merge branch 'test2' into test1
| |\
|/ /
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit
git命令: git branch temp(因此我不会丢失合并提交) git复位头~1 git添加。 git提交-m“挤压提交” git diff temp(只是为了确保没有任何更改)

结尾布局:

*   06074985 (HEAD -> test1) Merge branch 'test2' into test1
|\
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit
* 5e229615 (HEAD -> test1) squash commit
| *   06074985 (temp) Merge branch 'test2' into test1
| |\
|/ /
| * eb2aa088 (test2) test2 commit
* | c83180c8 test1 commit
|/
* b6628265 (master) base commit

如果您已合并并使用
git merge
--no ff
)并希望将其转换为与
git merge--squash
等效的,则可以使用以下过程(假设合并提交是分支上最近的提交):

  • 确保已签出受影响的分支
  • git reset——硬头~1
    (在合并之前将分支重置为提交。别担心,它不会丢失!)
  • git cherry pick-m1 HEAD@{1}
    (cherry根据您刚刚删除的合并提交与此分支之间的差异,将其作为普通提交进行选择)
除了保留合并期间完成的任何冲突解决之外,它还将保留原始合并提交信息(消息、作者、日期等),这对于修复来自生成一致提交消息的工具(如BitBucket)的错误合并非常有用


我们有一个只提交压缩文件的策略,所以每当有人无意中从BitBucket PR中选择了正常的合并选项,或者单击了令人沮丧的诱人的“合并”时,我偶尔会使用这个策略Slack BitBucket bot上的按钮,该按钮不提供合并策略的选择…

我会尝试从合并提交的第一个父级分支出一个临时分支,然后
git cherry pick-m 1
将合并提交到它上。如果一切正常,只需将原始分支重置为结果。有关建议的
git cherry pick
调用中
-m1
的更多信息,请参阅。可能重复的@kostix建议的
git cherry pick-m1
解决方案是最可靠的解决方案,因为它还保留了提交信息。我在下面添加了它作为答案。神奇!一个救生员,谢谢你!惊人的解决方案,工作出色这是不推荐的<代码>--现在首选重新基础合并。