我们有一个问题,几周前忘记将依赖于生成的文件的目录添加到版本控制中,现在我们希望添加它们,以便在签出旧版本时可以生成。
我知道我们可以使用git rebase -i来编辑一系列提交,但这不应该对已经推送的历史记录执行,因为这将导致团队其他成员的合并问题。
我还知道使用filter-branch将允许我们从已推送的旧提交中删除文件,强制推送这些更改不会给其他人带来问题(我已经成功地完成了这项工作)。
我的观点是,有时候编辑推送的历史似乎是可以的,有时候则不是,所以我希望我们的问题是可以解决的。
是否可以将这些文件添加到已共享的历史记录中?

最佳答案

是的,但它将改变这段历史。任何获取这些数据的人都必须处理它。有关需要做的操作,请参见从上游钢筋基中恢复部分中的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可能是列表中的第一个提交—如果删除它,则只在文件中留下CDE。关闭并保存文件以开始重新定位。
如果在以后的提交中从未添加文件,则不应存在任何冲突,但如果存在冲突,则需要解决这些冲突。
这棵树现在会像这样
- 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'

09-04 07:15
查看更多