使用N-last提交创建分支

dem*_*mas 20 git

我克隆了存储库并做了一些提交:

git clone ...
git add
git commit
git add
git commit
git add 
git commit 
Run Code Online (Sandbox Code Playgroud)

现在我意识到将所有提交移动到另一个新分支会更好.最好的方法是什么?

kni*_*ttl 26

很容易,检查你的新分支,然后移动旧分支(让我们假设master并做出3次提交):

git checkout -b my_new_branch
git branch -f master HEAD~3
Run Code Online (Sandbox Code Playgroud)


Abi*_*ern 5

knittl的答案有效,但还有其他方法可以做到这一点.

我假设您在master第一次克隆此存储库时,主分支将匹配您从中克隆的存储库中的主分支.这是origin/master.因为你的问题始于clone一个公平的假设.

因此,在主分支上提交后,您现在已经领先于origin/master分支机构.

你要做的第一件事是创建一个新的分支

git branch new_branch
Run Code Online (Sandbox Code Playgroud)

注意:此命令只创建一个新分支但不切换分支.所以masternew_branch现在都指向同一个commit,但你仍然在master分支.

接下来要做的是将当前分支(即master)设置为添加提交之前的状态.这与origin/master您发出此命令的状态相同

git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

这会将当前分支设置为与之相同的状态origin/master.该--hard套指标和工作树到初始状态.还有其他标志,但它们不能在这里做你想做的事.(注意:如果您的工作树中有未提交的更改,则它们现在被丢弃.git stash在重置之前使用此情况.)

所以现在你在master哪个点上处于相同的状态origin/master,你需要做的就是切换到新的分支:

git checkout new_branch
Run Code Online (Sandbox Code Playgroud)

是的,这有点长(3个命令而不是2个),但你不必计算你需要返回多少次提交,即使你已经分支,合并和重新设置,这也会有效; 我会在Git中解释其他做事方式.

  • 您也可以在knittl的版本中使用`origin/master`而不是`HEAD~3`. (3认同)