如何将文件目录添加到已经推送的一组提交中?

时间:2013-03-01 13:26:10

标签: git

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

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

我也知道使用filter-branch将允许我们从已经被推送的旧提交中删除文件,强行推送这些更改不会给其他人带来问题(我已经成功完成了这个)。

我的观点是,似乎有时编辑推动历史似乎没问题,而时间不是,所以我希望我们的问题可以解决。

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

1 个答案:

答案 0 :(得分:2)

是的,但它会改变那段历史。任何已提取此数据的人都必须处理它。有关需要完成的操作,请参阅从上游Rebase恢复部分的rebase man-page部分。在继续之前让任何受影响的人知道这是一个好主意,这样他们就可以进行任何更改

如果你没有这样做,请检查第一次应该有丢失文件的提交,创建一个分支,添加文件并修改提交。

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 - E重新加入B'以“修复”历史记录。

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

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

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

树现在看起来像这样

E

如果分支不再引用提交- A - B - C - D - E \ - B' - C' - D' - E' <-- E' will be checked out. ,则它们将不会显示在B - C - D - E中,并且稍后将被垃圾回收删除。这将为您留下git log