我们有一个问题,几周前忘记将依赖于生成的文件的目录添加到版本控制中,现在我们希望添加它们,以便在签出旧版本时可以生成。
我知道我们可以使用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
可能是列表中的第一个提交—如果删除它,则只在文件中留下C
、D
和E
。关闭并保存文件以开始重新定位。如果在以后的提交中从未添加文件,则不应存在任何冲突,但如果存在冲突,则需要解决这些冲突。
这棵树现在会像这样
- 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'
。