在大规模手动更改后重新组织Git

时间:2017-03-07 13:50:39

标签: git github

我有一个远程git repo,我在一个团队工作,一个成员 - 不熟悉git - 添加了很多手动更改和新文件。长话短说,一团糟。如何重新排列git以从零开始再次跟踪所有文件。 我应该再次创建并初始化一个新的.git文件,还是有一个扫描新文件和新更改的命令? 我的意思是手动更改,直接对文件进行更改,而不是通过推送提交。所以未经修改的变化。 我不关心历史,我只需要从现在开始跟踪我的所有文件。

2 个答案:

答案 0 :(得分:2)

如果您想要创建一个没有历史记录的新分支,只需像git checkout --orphan new-master那样进行孤儿结账。然后按照您喜欢的方式排列文件并创建提交。此提交没有历史记录,但本身就是root提交。然后,您还可以将master分支指向此新提交并执行强制推送。

答案 1 :(得分:1)

更新 - 正如我所说,问题似乎并不明确;评论中的讨论表明问题与我理解的不同。所以我们会再试一次,但万一我会留下原来的答案:

那么,听起来您的团队成员直接写入已部署的环境?可能不应该是可能的,但是好的......你问如何恢复他的变化,或者如何将它们纳入git历史?

如果部署的环境本身就是一个git repo,那么它只有一堆本地未提交的更改。 git status应该显示它们是什么以及如何处理它们(无论是还原还是保留)。

如果部署的环境不是 git repo,您​​可以将其内容复制到repo的工作树上并提交或从那里恢复。

原始回答

老实说,问题不是100%明确,但我认为我明白你想做什么。你有

A --- B --- C --- X <--(master)

其中X是“错误”提交。你要求跟踪所有“从零开始”;根据定义,这是一个新的回购,但因为你要求我必须假设你正在寻找更好的东西;大概是因为X之前的历史是有价值的。

你有几个选择。请注意,如果X是HEAD,那么任何修复都是最简单的,这就是我将如何显示它们。如果没有,请在评论中跟进,我们可以根据您喜欢的技术进行调整。

您可以恢复提交(创建一个撤消它所做的一切的新提交)。

git revert HEAD

在共享存储库中,这是最安全的解决方案,但它确实将X保留在最终历史记录中。

A --- B --- C --- X --- ~X <-- (master)

~X处的树将与C处的树匹配。

如果您真的必须从历史记录中删除X,那么您可以这样做,但访问存储库的每个人都必须“从恢复将以意外方式移动的事实中恢复”。

git reset --hard HEAD^
git push -f

现在任何在本地拥有X的人都必须重新同步;请参阅git docs中的“从上游重新恢复”部分:https://git-scm.com/docs/git-rebase