[英]git: Commit the currently uncommitted work in progress in the current branch to a new branch
[英]Move existing, uncommitted work to a new branch in Git
我开始了一些新功能的工作,在编码了一点之后,我决定这个功能应该在它自己的分支上。
如何将现有未提交的更改移动到新分支并重置当前分支?
我想重置我当前的分支,同时保留关于新功能的现有工作。
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 stash
基于此存储创建一个新分支,并切换到新分支:
$ git stash branch <new-branch> stash@{0}
提示:使用 tab 键减少输入存储名称。
如果您在编写代码时一直在主分支上进行提交,但现在想将这些提交移动到不同的分支,这是一种快速的方法:
将您当前的历史记录复制到一个新分支上,同时带来任何未提交的更改:
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 git stash
并在结束时git stash pop
。)
常见的情况如下:我忘记为新功能创建新分支,而在旧功能分支中完成所有工作。 我已将所有“旧”工作提交给主分支,我希望我的新分支从“主”发展而来。 我的新工作没有一次提交。 这是分支结构:“master”->“Old_feature”
git stash
git checkout master
git checkout -b "New_branch"
git stash apply
如果您提交它,您还可以挑选单个提交 ID。 当我开始在 master 中工作时,我经常这样做,然后想在我推送到我的 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
我使用@Robin回答并列出我所做的一切,
git status <-- review/list uncommitted changes
git stash <-- stash uncommitted changes
git stash branch <new-branch> stash@{1} <-- create a branch from stash
git add . <-- add local changes
git status <-- review the status; ready to commit
git commit -m "local changes ..." <-- commit the changes
git branch --list <-- see list of branches incl the one created above
git status <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch> <-- switch back
! 如果 repo 有多个存储,请查看将哪一个应用于新分支:
git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ...
并通过以下方式检查个人藏匿处,
git stash show stash@{1}
或一次检查所有藏匿处:
git stash list -p
假设您在 GitHub 上创建了一个名为feature-branch的新分支。
拿来
git pull --all Pull all remote branches
git branch -a List all branches now
签出并切换到功能分支目录。 您可以简单地从上面的 branch -a 命令的输出中复制分支名称
git checkout -b feature-branch
证实
接下来使用 git branch 命令查看当前分支。 它将在前面显示带有 * 的功能分支
git branch
犯罪
git add . add all files
git commit -m "Rafactore code or use your message"
在源服务器上进行更新和推送更改
git pull origin feature-branch
git push origin feature-branch
这是告诉您使用git stash -k
的唯一答案,您将需要...
如果你已经用git add -p
花了一个小时
然后决定在进行实际提交之前测试您添加到索引中的内容。 在这种情况下,不要使用普通的git stash
!
而是这样做:
git stash -k
这会保留索引并删除仍在工作目录中且尚未添加到索引中的其余部分。 正是你想要的。
现在您可以尝试编译/测试和提交。 IE
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
您还可以创建 bash 别名来执行所有这些操作。
这将创建新命令...
gitco <branch>
- 检出指定的分支,带走你当前的更改gitconew <new branch name>
- 创建一个具有指定名称的新分支(从 master 分支出来)并带走您当前的更改以下是设置别名的步骤...
~/.bash_profile
gitco ()
{
git stash && git checkout $1 && git stash apply
}
gitconew ()
{
git stash && git checkout master && git checkout -b $1 && git stash apply
}
source ~/.bash_profile
以重新加载配置文件现在您可以运行gitco
和gitconew
别名命令。
这是有关 bash 别名的更多信息 -> https://linuxize.com/post/how-to-create-bash-aliases/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.