这经常发生在我身上:我写了一些代码,去签入我的更改,然后意识到我不在适当的分支中签入这些更改。然而,我不能切换到另一个分支没有我的更改恢复。是否有一种方法可以将更改移动到另一个分支中进行检查?


当前回答

少管所是你的朋友。

如果你还没有提交,就运行git stash。这将保存您所有的更改。

切换到你想要更改的分支,并运行git stash pop。

git stash有很多用途。这当然是一个更有用的原因。

一个例子:

# work on some code
git stash
git checkout correct-branch
git stash pop

更新:不需要使用stash命令。未提交的更改不属于任何分支,所以只需使用git checkout -b <new-branch>

其他回答

软git重置将把提交的更改放回索引中。接下来,签出您打算提交的分支。然后git提交一个新的提交消息。

Git重置——soft <commit> Git checkout <branch> git commit -m“提交信息到这里”

来自git文档:

git reset [<mode>] [<commit>]重置当前分支头 到并可能更新索引(将其重置到树中) 的)和工作树。如果是 省略,默认为——mixed。必须是以下其中之一: 不触及索引文件或工作树(但重置头部,就像所有模式一样)。剩下的 你更改的文件“要提交的更改”,就像git状态所显示的那样 它。

如果您还没有提交您的更改,只需使用git签出移动到新的分支,然后正常提交它们-对文件的更改不会绑定到特定的分支,直到您提交它们。

如果您已经提交了更改:

输入git log并记住要移动的提交文件的SHA。 签出要将提交移动到的分支。 键入git -pick SHA替换上面的SHA。 切换回您原来的分支。 在错误的分支提交之前,使用git reset HEAD~1重置。

Cherry-pick接受一个给定的提交,并将其应用于当前签出的报头,从而允许您将提交复制到一个新的分支。

少管所是你的朋友。

如果你还没有提交,就运行git stash。这将保存您所有的更改。

切换到你想要更改的分支,并运行git stash pop。

git stash有很多用途。这当然是一个更有用的原因。

一个例子:

# work on some code
git stash
git checkout correct-branch
git stash pop

更新:不需要使用stash命令。未提交的更改不属于任何分支,所以只需使用git checkout -b <new-branch>

如果你创建了新的文件,你可以这样做:

git checkout main
git checkout -b branch-b
git checkout branch-a :rel/path/to/yourchangedfiles
git commit -m "w"
git checkout branch-a

git checkout main :rel/path/to/yourchangedfiles

# if this happens:
error: pathspec ':rel/path/to/yourchangedfiles' did not match any file(s) known to git

# then just rm the folder
trash-put rel/path/to/yourchangedfiles

不幸的是,这种情况也经常发生在我身上,如果我在git提交之前意识到自己的错误,我会使用git stash,否则就使用git cherry-pick,这两个命令都在其他答案中解释得很好

我想为git checkout targetBranch添加一个说明:如果targetBranch与当前分支具有相同的历史记录,这个命令只会保留你的工作目录和阶段性快照

如果您还没有提交您的更改,只需使用git签出 转移到新的分支,然后正常提交

@Amber的声明不是假的,当你移动到一个newBranch,git checkout -b newBranch,一个新的指针被创建,它指向与你当前分支完全相同的提交。 事实上,如果你碰巧有另一个分支与你当前的分支共享历史(都指向同一个提交),你可以通过git checkout targetBranch“移动你的更改”

但是,通常不同的分支意味着不同的历史记录,Git不允许您在具有脏工作目录或暂存区域的这些分支之间切换。在这种情况下,你可以执行git checkout -f targetBranch(清除并丢弃更改)或git stage + git checkout targetBranch(清除并保存更改),简单地运行git checkout targetBranch将会给出一个错误:

错误:您对以下文件的本地更改将被覆盖 付款: ... 请在切换分支之前提交您的更改或保存它们。流产