将更改后的文件移动到另一个分支进行签入

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

269856 次浏览

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

如果您已经提交了您的更改:

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

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

git stash是你的朋友。

如果您还没有提交,只需运行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 commit之前意识到自己的错误,我就使用git stash,否则就使用git cherry-pick,这两个命令在其他答案中都解释得很好

我想澄清git checkout targetBranch: 如果targetBranch与当前分支具有相同的历史记录,该命令将只保留您的工作目录和阶段性快照

如果你还没有提交你的更改,就使用git签出 移动到新分支,然后正常提交

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

来“移动你的更改”

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

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

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

  1. # EYZ0

  2. # EYZ0

  3. # EYZ0

从# EYZ0:

这个表单重置当前分支头 到并可能更新索引(将其重置到树中) 的)和工作树。如果是 省略,默认为——mixed。必须为以下选项之一:

--soft根本不触及索引文件或工作树(但重置头部,就像所有模式一样)。剩下的 你更改的文件“要提交的更改”,就像git状态所显示的那样 它。< / p >

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

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