如何从 git 存储库获取最新信息并应用我在分支上重新排序的更改

How to get latest from git repository and apply my changes reordered on branch

一些背景:

  1. 我从上游存储库 fork。
  2. 几周前从这个分支结帐开发分支
  3. 执行了一些更改并签入(尚未推送)
  4. 与此同时,一些其他更改被推送到开发上游分支。

现状。

优先级改变了,我在同一个开发分支上开发了另一个功能。我应该创建一个不同的分支,但我继续在当前更改的顶部添加新功能并签入。这意味着我的开发分支有我所有 2 周的更改 + 这个新功能。

我想做什么?

  1. 我想得到 upstream/develop 的精确副本到我的 current (我不想创建另一个分支)开发分支并应用只有我对它的最新更改并推送它。

  2. 在同一分支上应用我过去两周的工作在此更改之上。这个我会在几天后推送。

有人可以用 git 命令帮助我并解释后台发生的事情吗?

我尝试过的东西。 git 重置 --hard 这告诉我我的脑袋是分离的。

git 变基 -i upstream/branch。 我认为这将应用我的所有更改,但我只想要我所做的最后更改。

我想象对应于你的情况的提交图看起来像这样:

        A--B--C--X [develop]
       /
o--o--o  <-- develop from couple of weeks ago
       \
        O--O [upstream/develop]

A--B--C 是您两周的工作,X 是您的最新功能。

现在您执行以下操作:

1。标记两周工作的结束

$ git branch twoweeks C

您需要找出提交 C 的散列并在命令中使用它,或者使用图形存储库浏览器在该提交上创建分支。

该分支只是临时的,最后会再次删除,但我们现在需要它来保留下一步完成后的两周工作。

结果:

                X [develop]
               /
        A--B--C [twoweeks]
       /
o--o--o--O--O [upstream/develop]

2。将新功能移至

$ git rebase --onto upstream/develop twoweeks develop

结果:

        A--B--C [twoweeks]
       /
o--o--o--O--O [upstream/develop]
             \
              X [develop]

3。把两周的工作移过去

$ git rebase develop twoweeks

结果:

o--o--o--O--O [upstream/develop]
             \
              X [develop]
               \
                A--B--C [twoweeks]

4。清理

  1. 推送新功能

    $ git checkout develop
    $ git push
    

    结果:

    o--o--o--O--O--X [upstream/develop] [develop]
                    \
                     A--B--C [twoweeks]
    
  2. 快进本地开发分支并删除临时分支

    $ git checkout develop
    $ git merge --ff-only twoweeks
    

    (使用 --ff-only 作为完整性检查,如果失败则表明您做错了什么)

    $ git branch -d twoweeks
    

    结果:

    o--o--o--O--O--X [upstream/develop]
                    \
                     A--B--C [develop]
    

参考资料