Git分支管理-拉取恢复的提交

wkyowqbh  于 2023-08-01  发布在  Git
关注(0)|答案(2)|浏览(125)

我有一个分支branch-1,它包含了36个文件中的更改
branch-1合并到master
有个bug所以我们恢复了
我们意识到这个bug是一个错别字,所以我想创建一个新的分支,branch-2提取所有现有的工作,修复错别字,然后推到这个新分支,这样我就可以在github中创建PR了。
我尝试过的:
我在本地有branch-1,所以我检查了一下,然后尝试git checkout -b branch-2,但那只复制了master。我想我应该从旧的分支创建一个新的分支,修复错字,拉入master以获取自那时以来的所有更改,然后推送,这样我就可以创建一个PR,但这不起作用。

gt0wga4j

gt0wga4j1#

以免假设历史:

X--X---X---X--M---RM---X   <--- master
 \           /
  \         /
   F---F---F    <--- feature

字符串
在哪里

  • M-合并特征
  • RM-该合并的reveres
  • F-功能分支提交
  • X-其他提交

现在,如果你喜欢继续功能分支:

X--X---X---X--M---RM---X---M2   <--- master
 \           /            /
  \         /            /
   F---F---F -----TypoFix   <--- feature


第二次合并M2的尝试将失败,因为RM不仅反作用于M提交,还反作用于F提交。
在这种情况下,如果你想避免重写历史(比如rebate of feature分支),我更喜欢创建包含revert of revert的helper branch。导致了这样的历史:

X----X----X----X----M---RM---X---   <--- master
 \                 /     \
  \               /       \
   \             /        RRM <-- helper branch
    \           /           \
     \         /             \
      F---F---F---TypoFix---MRRM   <--- feature


这个RRM提交恢复了RM,并让旧的历史保持原样,不会与master分支中的RM提交交互。
之后,将feature分支合并到主分支将不会有问题。
另一种方法是在最新的master上选择F提交(这在另一个答案中有所介绍)。

vc6uscn9

vc6uscn92#

没那么简单。你需要处理从旧分支构建的 new commits,这样git * 会认为 * 这些commits从未被合并过....可以这样做假设branch-1在合并到master中时有2次直接提交。所以...这么做

git checkout -b branch-2 branch-1~2
git cherry-pick HEAD..branch-1 # reapply the same commits from branch-1
# they will be _new_ commits, not related to the ones that are already merged
# fix the typo and create a new commit (or rebase and fix the typo, whatever you think is the right way to handle)

字符串
当你的分支已经提交了修复,这个分支可以被合并到master中,git不会抱怨之前的提交已经被合并。

相关问题