Git:Squash提交早于冲突合并

Git:Squash提交早于冲突合并,git,git-rebase,squash,git-squash,Git,Git Rebase,Squash,Git Squash,我想挤压一些比“冲突”合并旧的提交。例如: main branch: A--B--C--D--G--H dev branch: \-E--F----/ H是我当前的头,G是冲突合并(所以我手动解决冲突的合并),我想挤压C和D-但如果我尝试这样做,我会得到重新设置基础的冲突,这是由于G是冲突合并 我可以挤压C和D吗?如果可以,怎么挤压?我会对一个解决方案感兴趣,在这个解决方案中,我不必再次手动合并某些内容 附加信息:git-rebase-ib甚至在将所有提交保留在“pick”上时都不起作

我想挤压一些比“冲突”合并旧的提交。例如:

main branch:  A--B--C--D--G--H
dev branch:    \-E--F----/
H是我当前的头,G是冲突合并(所以我手动解决冲突的合并),我想挤压C和D-但如果我尝试这样做,我会得到重新设置基础的冲突,这是由于G是冲突合并

我可以挤压C和D吗?如果可以,怎么挤压?我会对一个解决方案感兴趣,在这个解决方案中,我不必再次手动合并某些内容


附加信息:
git-rebase-ib甚至在将所有提交保留在“pick”上时都不起作用,而“pick”应该什么都不做,对吗?

首先:默认情况下,
git-rebase
完全忽略合并提交。您必须指定使git rebase“意识到”合并操作

-i
结合使用:您将看到sequencer脚本更为复杂,允许您描述重播合并所需的操作


第二:在您描述的场景中,要合并的提交的内容将与原始提交的内容相同,因此“解决冲突”相当于:“重复使用与
G
完全相同的内容”

如果合并时遇到冲突:请尝试运行

git restore --staged --source G -- .
# or using shorthands :
git restore -S -s G -- .
如果需要清除索引中文件中的“冲突”标志,则可能需要事先运行git reset。

如果您的本地git没有
git restore
(这个命令是最近在git 2.27-2020年6月中添加的):试试看


它应该将
G
的内容放在索引中。

首先:默认情况下,
git-rebase
完全忽略合并提交。您必须指定使git rebase“意识到”合并操作

-i
结合使用:您将看到sequencer脚本更为复杂,允许您描述重播合并所需的操作


第二:在您描述的场景中,要合并的提交的内容将与原始提交的内容相同,因此“解决冲突”相当于:“重复使用与
G
完全相同的内容”

如果合并时遇到冲突:请尝试运行

git restore --staged --source G -- .
# or using shorthands :
git restore -S -s G -- .
如果需要清除索引中文件中的“冲突”标志,则可能需要事先运行git reset。

如果您的本地git没有
git restore
(这个命令是最近在git 2.27-2020年6月中添加的):试试看


这应该将
G
的内容放在索引中。

不要使用rebase,rebase可以为您挤压,但它的构建要比仅使用“祖先”这样的重写更为繁重,它做了大量(缓慢)的准备工作,以实现您喜欢的任何更改

git replace --graft G B F   # (put usable references to those commits here of course)
git filter-branch

而且你已经完成了重基所能完成的一切,速度要快得多。

不要为此使用重基,重基可以为你挤压,但它的构建要比像这样的只为祖先而重写的重得多,它做了大量(缓慢的)准备工作,以实现你喜欢的任何更改

git replace --graft G B F   # (put usable references to those commits here of course)
git filter-branch

而且您已经实现了rebase所能实现的一切,速度要快得多。

第一步:将
-r
(缩写为
-rebase merges
)选项添加到
git rebase
命令中。如果没有它,
git-rebase
将从重播的提交列表中删除合并提交。谢谢,你是对的,这是第一步,它至少解决了在git编辑器中不更改任何内容(不更改任何“选择”)时它甚至不工作的问题-但这并不能解决我挤压C和D时的冲突问题。第二:由于没有内容更改,如果您再次尝试合并
F
时遇到合并冲突,您只需使用与
G
相同的内容:尝试类似于
git restore--staged--source G--.
第一步:将
-r
(缩写为
--rebase merges
)选项添加到
git-rebase
命令中。如果没有它,
git-rebase
将从重播的提交列表中删除合并提交。谢谢,你是对的,这是第一步,它至少解决了在git编辑器中不更改任何内容(不更改任何“选择”)时它甚至不工作的问题-但这并不能解决我挤压C和D时的冲突问题。第二:由于没有内容更改,如果您在尝试合并
F
时再次遇到合并冲突,您只需使用与
G
相同的内容:尝试类似于
git restore--staged--source G--.