git merge 已恢复,但需要更改

问题描述 投票:0回答:3

我有一个功能分支,我们称之为 A,还有一个主线,我们称之为 B,我们在其中交付。问题如下:

  1. 分支 A 比分支 B 早很多提交,到目前为止没有什么特别的。所以我从分支 A 合并到分支 B。
  2. 然后我注意到,这不是我想要的,因为我怀疑自动合并不好。
  3. 我对合并进行了恢复,这没问题,合并的更改消失了。
  4. 我只想在分支B中有分支A的代码状态;因此,我在分支 B 中本地删除了目录和文件,并想再次从分支 A 进行合并,这不再起作用,因为 git 认为合并已经完成。我的第二个想法是在分支 B 中签出分支 A,但我不知道如何从远程存储库正常签出到相应的分支:A 在 A 中,B 在 B 中。

知道如何在分支 B 中查看分支 A 吗?备注:自从启动此功能分支 A 以来,主线没有发生任何变化,所以我需要的是分支 B 中的 A。感谢您提前提供任何解决方案。

git fetch <remote> <remoteBranch>:<localBranch>
会这样做吗?

git fetch origin A:B
git push origin B

解决方案: 请参阅 VonC 的答案以及我关于索引的问题。感谢大家的回复。

cd /path/to/repo
git switch B
git restore -s A -SW -- .
git commit -m "override B with A content"
git git-merge git-checkout
3个回答
3
投票

但是我不想逐个调查文件中可能存在错误的内容,我只想删除 B 中的状态并获取 B 中 A 的状态。我该怎么做?

保持您的历史记录不变,您可以 在当前 B 上恢复 A 内容

cd /path/to/repo
git switch B
git restore -s A -SW -- .
git commit -m "override B with A content"

pepe-botika69添加评论

如果在恢复后,

B
分支获得了新的更改,并且您在新提交中不需要它们(在这个
git commit -m "override B with A content"
中),您应该将B硬重置到您恢复A的位置,然后然后应用命令。


1
投票

让我们首先想象一下您的情况:

                            branch B
o---o---o---------------M---W
         \             /
          o---o---o---o
                      branch A

我假设您已经推送了合并提交

M
及其反向
W
,因此您无法再重写分支
B
的历史记录。

恢复错误的合并

如果您想将分支

A
中的更改引入
B
在第一个合并已还原之后,您必须通过还原提交 W还原还原
:

git switch B git revert W
但是,您说过您不想立即创建提交,而是希望当您位于 

A

 时,在分支 
B
 中所做的更改位于工作目录中。您可以使用 
--no-commit
git-revert
 选项来做到这一点:

git switch B git revert --no-commit W
这会将分支 

A

 的更改带回到您的工作目录中。

如果您有兴趣了解为什么会出现这种情况,我认为

Linus 本人 解释得最好:

恢复常规提交只是有效地撤消该提交所做的事情,而且相当简单。但是恢复合并提交也会撤消提交更改的

data,但它对合并所产生的history的影响绝对没有任何作用。

因此合并仍然存在,并且仍然会被视为将两个分支连接在一起,并且未来的合并会将合并视为最后的共享状态 - 并且恢复引入的合并的恢复根本不会影响这一点。

因此,“恢复”会撤消数据更改,但它

不是“撤消”,因为它不会撤消提交对存储库历史记录的影响。

因此,如果您将“恢复”视为“撤消”,那么您将永远错过这部分恢复。是的,它会撤消数据,但不会,它不会撤消历史记录。


1
投票
你可以通过重写历史记录来欺骗 git 认为合并的分支没有被合并

git checkout $( git-merge-base feature-branch upstream-branch-before-the-merge ) git cherry-pick HEAD..feature-branch # assuming it is a straight line # now you have a history just like the original branch but, to git, this is not merged # let's set the pointer over here git branch -f feature-branch
如果你尝试合并 

new 分支,git 应该没问题。

© www.soinside.com 2019 - 2024. All rights reserved.