3

我们有一个问题,几周前我们忘记将依赖于构建的文件的目录添加到版本控制中,现在我们想要添加它们,以便我们在检查旧版本时可以构建。

我知道我们可以用它git rebase -i来编辑一系列提交,但是这不应该对已经推送的历史进行,因为这会给团队的其他成员带来合并问题。

我也知道 usingfilter-branch将允许我们从已经推送的旧提交中删除文件,并且强行推送这些更改不会给其他人带来问题(我已经成功地做到了)。

我的观点是,有时编辑推送的历史似乎还可以,有时又不行,所以我希望我们的问题可以解决。

是否可以将这些文件添加到已共享的历史记录中?

4

1 回答 1

2

是的,但它会改变那段历史。任何提取了这些数据的人都必须处理它。请参阅Recovering from Upstream Rebase部分的rebase 手册页中的部分,了解需要完成的操作。在继续之前让受影响的任何人知道是个好主意,这样他们就可以提交任何更改

如果您对此感到满意,请检查应该丢失文件的第一个提交,创建一个分支,添加文件并修改提交。

git checkout <commit hash>
git branch new_branch
<add the missing files>
git add .
git commit --amend               <-- a text editor will open, just keep the message and continue

此时,树将如下所示,B为修改前的提交和B'修改后的提交。 C - D - E是从那时起的提交。

- A - B - C - D - E
   \
    - B'

现在重新定位C - D - EB'“修复”历史。

<`B` should still be checked out>
git rebase -i E

编辑器将打开列出要移动的提交,B可能是列表中的第一个——如果是删除它,只留下C,DE文件。关闭并保存文件以开始变基。

如果文件从未在以后的提交中添加,则不应该有任何冲突——但如果有,则需要解决它们。

树现在看起来像这样

- A - B - C - D - E
   \
    - B' - C' - D' - E'          <-- E' will be checked out. 

如果提交B - C - D - E不再被分支引用,它们将不会出现,git log并将在稍后被垃圾收集器删除。这给你留下了A - B' - C' - D' - E'.

于 2013-03-01T15:19:46.173 回答