2

(关于这个有很多类似的问题,我也阅读了各种文档,但我找不到任何回答这个特定问题的东西。)

给定一个没有远程和分支的存储库,在 master 上有 20 次提交。

目的是最终得到一个的主人,所有的提交都在发展,但没有混乱的历史。

有没有区别:

git branch --move master develop
git checkout --orphan master

和:

git checkout -b develop 
git merge master
git checkout master
git reset --hard HEAD^20

?

第一个选项似乎是执行此操作的最简单方法,但我在任何地方都没有看到它建议 - 我一直在阅读的所有各种内容都倾向于使用第二个选项的变体(或变基,我认为这里不适用)。

第一个选项是否像我认为的那样做,与第二个选项相比,它有什么好处/缺点吗?

有没有更好的方法来实现这一目标?

4

2 回答 2

3

分支只是提交指针。当没有任何可指点时,你会进入一些奇怪的领域。老实说,如果您只是想获得“干净”的工作流程历史记录,那么任何重要的第一次提交都是从developinto合并master,请在 first 中添加一个无关紧要的提交master

git branch --move master develop
git checkout --orphan master
git rm -rf . ;# abandon the staged, orphaned changes
echo README > README ;# put something in this working directory
git add README && git commit -m "Initial commit of <my_project>"

为什么要犯什么?因为一旦您运行--orphan结帐,您将无法对master分支做任何有意义的事情。自己试试:

$ git checkout --orphan master
Switched to a new branch 'master'
$ git checkout develop && git checkout master
error: pathspec 'master' did not match any file(s) known to git.

合并怎么样?

$ git checkout --orphan master
Switched to a new branch 'master'
$ git merge develop
fatal: Non-fast-forward commit does not make sense into an empty head

没有骰子。解决这个问题的唯一真正方法是向那个空分支提交一些东西,任何东西。在你这样做的那一刻,你可以develop以任何你想要的方式合并:

$ git merge develop
Merge made by the 'recursive' strategy.
 README | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 README

和日志:

$ git log --graph --oneline
*   867a1f9 Merge branch 'develop'
|\  
| * 22df145 README
* 15ba82a Initial commit of test project
于 2012-08-22T16:51:34.280 回答
0

我看到的唯一问题是第二个版本不起作用。HEAD^20 不会解决只有 20 次提交的历史记录,因此git reset --hard HEAD^20会失败。

您的初始版本应该可以正常工作。如果第二个版本有效,我看不出两者之间有显着差异。

于 2012-08-22T16:27:05.877 回答