ChatGPT解决这个技术问题 Extra ChatGPT

将现有的、未提交的工作移动到 Git 中的新分支

我开始了一些新功能的工作,在编写了一些代码之后,我决定这个功能应该在它自己的分支上。

如何将现有未提交的更改移动到新分支并重置我当前的?

我想重置我当前的分支,同时保留新功能的现有工作。

同样有趣的主题stackoverflow.com/q/556923/269514

k
knittl

2020 年更新/Git 2.23

Git 2.23 添加了新的 switch 子命令,试图消除由于 checkout 的重载使用(切换分支、恢复文件、分离 HEAD 等)而引起的一些混乱。

从这个版本的 Git 开始,将 checkout 命令替换为:

git switch -c <new-branch>

行为是相同的并且保持不变。

2020 年更新/Git 2.23 之前

使用以下内容:

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> 更改这些更改的结束位置。
如果您已经有一个分支并且想要将您的更改移动到现有分支,请查看 stackoverflow.com/questions/556923/…
如果要将新分支推送到远程存储库:stackoverflow.com/questions/2765421/…
@JDSmith:取消提交更改属于任何分支。它们仅驻留在工作目录中 git checkout ./git reset --hard 将不可恢复地删除它们
R
Robin Qiu

或者:

将当前更改保存到临时存储: $ git stash 基于此存储创建一个新分支,并切换到新分支: $ git stash branch stash@{0}

提示:使用 tab 键减少输入存储名称。


如果另一个分支已经存在,您可以通过 checkout 切换到它,然后 git stash apply
我不明白提示“提示:使用 Tab 键减少键入存储名称。”。 “stash@{0}”不是这个名字吗?我无法成功运行它。
为什么这比接受的答案 stackoverflow.com/a/1394804/754997 更好?
我不明白为什么这比 git checkout -b <new branch name> 的公认答案更好
您无需在存储前git add -A
j
joeytwiddle

如果您在编写代码时一直在主分支上进行提交,但现在想将这些提交移动到不同的分支,这是一种快速的方法:

将您当前的历史记录复制到一个新分支上,同时带来任何未提交的更改: git checkout -b 现在强制回滚原来的“混乱”分支:(不切换到它) git branch -f < previous-branch> 例如:git branch -f master origin/master 或者如果你做了 4 次提交:git branch -f master HEAD~4

警告: git branch -f master origin/master重置该分支的跟踪信息。因此,如果您已将 master 分支配置为推送到 origin/master 以外的某个位置,那么该配置将丢失。

警告:如果你在分支后变基,有一些提交可能会丢失的危险,这就是 described here。避免这种情况的唯一方法是使用cherry-pick 创建新的历史记录。该链接描述了最安全的万无一失的方法,尽管不太方便。 (如果您有未提交的更改,您可能需要在开头 git stash 并在结尾处 git stash pop。)


这回答了一个与操作员提出的问题略有不同的问题。我决定把这个答案放在这里,因为这是我在寻找答案时谷歌带给我的地方。处理这种情况的实际问题 is here
A
Alex Burov

常见的情况如下:我忘记为新功能创建新分支,而在旧功能分支中完成所有工作。我已将所有“旧”工作提交给主分支,我希望我的新分支从“主”发展而来。我的新工作没有一次提交。这是分支结构:“master”->“Old_feature”

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

"git switch -c " 清除未暂存文件的更改(仅保留新文件);如果您想完全恢复所有本地文件,则存储方式会更好
那不是我的经验——正如其他人在上面所写的那样,您的本地未暂存更改将保留在新分支中。 (我必须承认我必须使用 checkout -b 而不是 switch -c,但这两个应该是相同的)
p
password

如果您提交它,您还可以挑选单个提交 ID。当我开始在 master 中工作时,我经常这样做,然后想在我推送到我的 origin/ 之前创建一个本地分支。

git cherry-pick <commitID>

here 所述,您可以使用cherry-pick 做很多事情,但这可能是您的一个用例。


将部分更改移动到新分支的更好解决方案...因为您现在可以提交您想要的内容,存储所有其他更改,检查您要从中分支的分支,将提交的内容挑选到新分支上,然后返回到原来的分支,硬重置一个提交,然后做一个 stash pop,添加,提交,然后唱哈利路亚。
@Meredith,哈哈,是这样的。这很棒,除非你提前计划好你的改变……谁来做这件事;)
K
Kristofer Doman

实际上,使用 GitHub Desktop 有一种非常简单的方法可以做到这一点,现在我不相信这是一个功能。

您需要做的就是切换到 GitHub Desktop 中的新分支,它会提示您将更改留在当前分支(将被隐藏),或者将您的更改带到新分支。只需选择第二个选项,将更改带到新分支。然后,您可以像往常一样提交。

https://i.stack.imgur.com/Rm6GJ.png


P
Przemek Struciński

这可能对所有使用 GIT 工具的人都有帮助

命令

切换分支 - 它会将您的更改移动到新分支。然后您可以提交更改。

 $ git checkout -b <new-branch>

乌龟GIT

右键单击您的存储库,然后使用 TortoiseGit->Switch/Checkout

https://i.stack.imgur.com/UjGWh.jpg

源树

使用“结帐”按钮切换分支。单击分支后,您将在顶部看到“结帐”按钮。当前分支的更改将自动应用。然后你可以提交它们。

https://i.stack.imgur.com/Vy9pY.jpg


A
Abu Shoeb

选项 1(现有分支)

git stash (from main/any-branch)
git checkout your-existing-branch
git stash apply 

选项 2(创建新分支)

git switch -c your-new-branch

n
nbs

我用了 @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

H
Hitesh Sahu

提交更改的 3 个步骤

假设您在 GitHub 上创建了一个名为 feature-branch 的新分支。

https://i.stack.imgur.com/f8oA6.png

拿来

    git pull --all         Pull all remote branches
    git branch -a          List all branches now

签出并切换到功能分支目录。您可以简单地从上面的 branch -a 命令的输出中复制分支名称

git checkout -b 功能分支

证实

接下来使用 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

E
Eric Mutta

对于那些使用 Visual Studio Community 2022(可能还有更早版本)的用户,当您有未提交的更改然后创建新分支时,您将看到如下对话框:

https://i.stack.imgur.com/2PhoO.png

只需选择第一个选项将更改带到“[your-new-branch-name]”,然后单击继续结帐。将创建新分支,您可以继续在那里提交您的更改。


C
Carlo Wood

这是告诉您使用 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