繁体   English   中英

git merge 恢复但需要更改

[英]git merge reverted but the changes needed

我有一个功能分支,我们称之为 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

让我们从想象你的情况开始:

                            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时位于工作目录中。 您可以使用git-revert--no-commit选项来做到这一点:

git switch B
git revert --no-commit W

这会将分支A中的更改带回您的工作目录。

如果你有兴趣首先了解为什么会出现这种情况,我认为Linus 自己的解释最好:

恢复常规提交只是有效地撤消了该提交所做的事情,而且相当简单。 但是还原合并提交也会撤消提交更改的数据,但它对合并对历史的影响绝对没有任何作用。

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

因此,“还原”会撤消数据更改,但在它不会撤消提交对存储库历史记录的影响的意义上,它并不是“撤消”。

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

你可以通过重写它的历史来欺骗 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

如果你尝试合并分支,git 应该没问题。

但是我不想逐个文件调查内容中可能有错误的地方,我只想删除 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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM