我开始着手开发一个新功能,编码了一段时间后,决定将此功能放到自己的分支中。
我该如何将现有的未提交更改移动到新分支并重置我的当前分支?
我想在保留新功能上的现有工作的同时重置我的当前分支。
我开始着手开发一个新功能,编码了一段时间后,决定将此功能放到自己的分支中。
我该如何将现有的未提交更改移动到新分支并重置我的当前分支?
我想在保留新功能上的现有工作的同时重置我的当前分支。
Git 2.23增加了新的switch
子命令,旨在消除由于checkout
命令被多种用途重载而导致的混淆(切换分支,恢复文件,解开HEAD等)。
从这个Git版本开始,将checkout命令替换为:
git switch -c <new-branch>
行为相同且保持不变。
使用以下内容:
git checkout -b <new-branch>
这将保留您当前的分支状态,创建并切换到一个新的分支,并保留所有更改。然后,您可以对文件中的更改进行暂存以提交:
git add <files>
并使用以下命令将更改提交到你的新分支:
git commit -m "<Brief description of this commit>"
工作目录下的更改和索引中暂存的更改尚未属于任何分支。这会影响修改将要落在哪个分支上。
您不需要重置原来的分支,它仍保持不变。 <old-branch>
上的最后一个提交仍然是相同的。因此,您需要使用checkout -b
然后再进行提交。
git checkout -b <new branch>
命令可以将这些更改归为新分支。 - Jakub Narębski或者:
将当前更改保存到临时贮藏:
$ git stash
基于此贮藏创建一个新的分支,并切换到新的分支:
$ git stash branch <new-branch> stash@{0}
提示: 使用Tab键缩短输入贮藏名称的时间。
git stash apply
。 - Archonicgit checkout -b <新分支名>
的被接受的回答更好。 - Noitidartgit add -A
。 - vichle如果您在编码过程中一直在主分支上提交代码,但现在想将这些提交移到另一个分支,这是一种快速的方法:
将当前的历史记录复制到一个新分支上,并带上任何未提交的更改:
git checkout -b <new-feature-branch>
现在强制将原始的“混乱”分支回退:(无需切换到它)
git branch -f <previous-branch> <earlier-commit-id>
例如: git branch -f master origin/master
或者如果您已经进行了4次提交:
git branch -f master HEAD~4
警告:git branch -f master origin/master
会重置该分支的跟踪信息。因此,如果您已经将master
分支配置为推送到其他位置而不是origin/master
,则该配置将丢失。
警告:如果在创建分支后进行变基操作,则可能会丢失一些提交记录,详情可以参考此处。避免此情况的唯一方法是使用cherry-pick创建新的历史记录。该链接描述了最安全的、万无一失的方法,尽管不太方便。(如果您有未提交的更改,则可能需要在开始时使用git stash
命令,在结束时使用git stash pop
命令。)
git stash
git checkout master
git checkout -b "New_branch"
git stash apply
如果你提交了它,你也可以挑选单个提交ID。当我开始在主分支上工作时,我经常这样做,然后想在推送到我的origin/之前创建一个本地分支。
git cherry-pick <commitID>
你可以在这里了解到关于 cherry-pick 的很多用法,但这可能是适用于你的一个使用场景。
选项1(使用现有分支)
git stash (from main/any-branch)
git checkout your-existing-branch
git stash apply
选项2(创建一个新分支)
git switch -c your-new-branch
这是唯一一个告诉你使用git stash -k
的答案,如果你已经花了一个小时用git add -p
,然后决定在实际提交之前测试你添加到索引中的内容。在这种情况下,不要使用普通的git stash
!
相反,做如下操作:
git stash -k
这将保留索引并删除其余仍在工作目录中且尚未添加到索引中的内容。正是您想要的。
现在,您可以尝试编译/测试和提交。例如:
make
git commit -m 'Yay!'
git stash pop
如果你发现它无法编译,那么对其进行更改并添加这些更改到索引中并提交可能会让git stash pop
混淆。当涉及合并时,它并不是很好用。在这种情况下,你可能应该直接提交;因此:
make
git commit -m 'Grrrr'
然后创建一个新分支,
git switch -c tmpbranch
在那里完成你的工作(更改代码,进行测试和提交更多内容)
/* blood sweat and tears */
一旦所有东西都正常工作,请将其提交到新分支
commit -a -m 'Finally!'
回到旧分支,然后使用与推送到存储区时相同的工作目录执行git stash pop
。
git checkout youknowwhatbranchyouwereonright
git stash pop
提交这个也要,否则你无法合并tmpbranch。 然后合并你创建的临时分支。
git commit -a -m 'Still working on this.'
git merge tmpbranch
/* fix collisions and commit */
现在你可以进行一次变基操作,将“仍在处理中”的提交放在顶部,并将其余的提交压缩/修复为单个注释。例如:
git rebase -i
可能会给你:
pick 540623a Grrr
pick a8589d3 Still working on this.
pick d3b602c Finally
然后将其更改为:
reword 540623a Grrr
fixup d3b602c Finally
pick a8589d3 Still working on this.
最后撤销上一次提交(即“仍在处理中”)
git reset HEAD~1