我已经克隆了代码仓库并进行了一些提交:
git clone ...
git add
git commit
git add
git commit
git add
git commit
现在我意识到将所有的提交移动到另一个新分支会更好。如何最好地做到这一点?
我已经克隆了代码仓库并进行了一些提交:
git clone ...
git add
git commit
git add
git commit
git add
git commit
现在我意识到将所有的提交移动到另一个新分支会更好。如何最好地做到这一点?
简单来说,检出你的新分支,然后将旧分支(假设为master
且有3个提交)移回:
git checkout -b my_new_branch
git branch -f master HEAD~3
knittl's answer适用,但还有其他方法可以做到这一点。
我假设你在克隆这个仓库时处于master
分支,当你第一次克隆这个仓库时,主分支将与你从中克隆的仓库上的主分支匹配。这是origin/master
。由于你的问题以clone
开头,这是一个合理的假设。
因此,在你在主分支上进行提交之后,你现在超过了origin/master
分支。
你要做的第一件事就是创建一个新分支。
git branch new_branch
master
和new_branch
现在指向相同的提交,但您仍然在master
分支上。master
)设置为添加提交之前的状态。这与origin/master
的状态相同,因此您可以发出此命令。git reset --hard origin/master
origin/master
相同的状态。 --hard
将索引和工作树设置为初始状态。还有其他标志,但它们在此处无法实现您想要的功能。(注意:如果您在工作树中有未提交的更改,则现在它们已被丢弃。在重置之前,在这种情况下使用git stash
。)origin/master
相同状态的master
上,您只需要切换到新分支即可:git checkout new_branch
是的,这个命令有点长(3个命令而不是2个),但你不需要数一下要回退多少次提交,即使你已经创建了分支、合并和变基,这个方法也可以使用;另外我还可以解释Git中其他的做法。
reset --hard
将从工作树中删除所有更改。你提到了“将索引和工作树设置为初始状态”,但我认为这个警告对于 Git 新手来说不够清晰。在合并、变基和其他操作后,使用 git branch
也可以起作用。你可以使用 git branch -f master origin/master
在 origin/master 提交(或任何其他位置)重新创建主分支。 - knittlnew_branch
和master
来说都是一样的。如果你在master
上执行了git reset --hard
,然后切换回new_branch
,你仍然会有一个干净的工作树——除非你在切换分支之前进行了存储并在执行分支之间的切换和重置游戏后弹出了更改。我没有看到你的答案中提到stash
;) - knittlorigin/master
代替HEAD~3
。 - Paŭlo Ebermannreset --hard
会丢失工作树中的任何未提交的更改(普通的checkout会在这里抱怨)。可以通过在之前使用git stash
来避免这种情况,或者使用knittl的版本,它根本不会影响工作树。 - Paŭlo Ebermanngit branch new_branch
git reset --hard origin/master
注意:这个最后的命令将会丢弃你工作副本中尚未提交的任何内容。如果有任何需要保留的内容,请在此之前使用git stash
。
然后切换到你的新分支。
git checkout new_branch
reset --hard
会从工作树中删除所有更改!这是一个非常糟糕的建议,完全没有任何警告提示。 - knittlnew_branch
中进行了更改。它将重置主分支的工作树,但然后你可以检出new_branch
。 - Abizern
-f
:git branch -f master HEAD~3
。 - Rob Davisgit reset --soft HEAD^3; git commit -m'undoing the last 3 commits';
- knittl