Gre*_*egg 24
使用checkout --orphan命令
git checkout --orphan MyNewBranch
git reset -- *
git ls-files
Run Code Online (Sandbox Code Playgroud)
另请参阅此链接 https://git-scm.com/book/en/v2/Git-Tools-Replace
tor*_*rek 18
Gregg的答案和链接的可能重复都建议使用git checkout --orphan(链接的问题可追溯到何时--orphan相对较新).
在评论中,exxecc建议从一些现有的提交创建一个分支,删除所有内容(例如,git rm -r .),然后从那里继续.
这两种方法都是有效且可行的.那么你应该使用哪一个?答案取决于你现在想做什么,而不是你想做什么,稍后再看.关键是,像往常一样,Git的提交图.(为了稍微破坏效果,但作为答案更有用,我会说"与孤儿一起去"因为你可能需要推迟这个决定,而"孤儿"会在稍后为你提供更多选择.请继续阅读以了解我的情况谈论.)
当您查看Git的提交图时,默认情况下git log从当前提交开始,或者任何命名分支的最尖端提交.(然后通过按日期对提交进行排序来破坏这种明智的行为,但这是一个不同的问题,如果日期本身是明智的,那么"破坏"基本上没有效果,实际上它仍然是明智的.)因此我们从某些分支上的当前或最新的,提交,并及时向根提交工作.
根提交只是一个没有父母的提交.这是一个起点.它有后代 - 后来的承诺,它来自它 - 但它没有祖先.它是从头开始创建的; 它没有历史.
这可能适用于重写(大规模检修,在原始问题描述中).
或者,它可能不会.当然,这是一个重写,但为某件事之前.还有人先前提交.也许你应该包括它们.
如果你作为一个非 root用户提交,一个清空以前版本的提交(根本没有任何内容,或者一个简单的框架,或者甚至是一个新的,重写的实现),你将来能够及时扫描,到这个新的开始之前的一点.事实上,这将更加准确.此外,它允许您将其合并到其他分支中,Git向您显示自"新开始"点以来修改或创建的文件的冲突.
例如,假设有问题的项目有一个主要分支,这是您打算重写的分支,但它也有一个侧面分支用于某些实验.如果这个实验证明是成功的,那么在一段时间之后,将部分或全部工作重新带入重写可能会很好.如果你的重写开始于清空然后替换,一个简单git merge的实验分支将为你提供"由它们修改,由我们删除"形式的冲突,每个文件都有变化.
无论如何,git log将能够向您展示真实的历史:在某些时候,您做了大量的重写.真实的历史可能有一些价值.(虽然,正如所有代码历史一样,有时值可能比正面更负面.:-))
尽管我上面建议不使用孤儿分支的优势,但我推荐使用孤儿分支方法.原因是这可以让你推迟决定.这是基本的想法.
在新的孤儿分支中,它具有完全独立的历史记录 - 您可以在完全独立的存储库中创建它,从而无需git checkout --orphan- 您可以从头开发大修,重写的版本.然后,在某些时候,您认为它已准备好替换旧版本.此时,您可以合并两个分支(或两个存储库),即使它们没有公共基础.您只需要使用两个父项进行新的提交:第一个父级是重写分支的当前提示,第二个父级是原始(未重写)版本.
第二个父提交既可以是现在的原始版本,也可以是两个被"合并"的点,或者是重写项目开始时的提交.
我在这里引用"merged"只是因为合并提交的树只是重写版本.我们将完全忽略旧版本的源代码.新合并提交的要点只是加入两行开发的历史,并暗示(通过使分支名称,master例如,指向新的合并提交)新版本现在负责,原样.
(这种合并是由-s ours策略制定的,虽然有一种相对简单的方法可以手动制作.如果你想直接进行这种合并,master你需要相当于-s theirs代替,这需要手动方法.然后-s ours,在orphan分支上进行合并,然后将分支名称随机移动.如果您已将新的孤立分支版本放在孤立的独立存储库中,只需将新存储库添加为额外的远程数据库,即可获取新版本,然后像往常一样进行合并提交.)