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

时间:2011-08-27 22:51:17

标签: git github

这经常发生在我身上:我写了一些代码,去检查我的更改,然后意识到我没有在正确的分支中检查这些更改。但是,如果没有我的更改还原,我无法切换到另一个分支。有没有办法将更改移动到另一个分支进行检查?

5 个答案:

答案 0 :(得分:587)

git stash是你的朋友。

如果您尚未提交,请运行git stash。这样可以省去所有更改。

切换到您希望更改的分支,然后运行git stash pop

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

一个例子:

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

答案 1 :(得分:214)

如果您尚未提交更改,只需使用git checkout移至新分支,然后正常提交 - 文件更改不会绑定到特定分支,直到你犯了他们。

如果您已提交更改:

  1. 键入git log并记住要移动的提交的SHA。
  2. 查看要将提交移动到的分支。
  3. 键入git cherry-pick SHA替换上面的SHA。
  4. 切换回原来的分支。
  5. 在错误的分支提交之前使用git reset HEAD~1重置。
  6. cherry-pick接受一个给定的提交并将其应用于当前检出的头部,从而允许您将提交复制到新的分支。

答案 2 :(得分:33)

如果您想将更改移至新分支,只需使用两个命令即可完成此操作:

git stash
git stash branch new-branch

根据git stash documentation

  

分支<branchname> [<stash>]

     

创建并签出一个名为<branchname>的新分支   最初创建<stash>的提交适用于   记录在新工作树和索引中的更改。

答案 3 :(得分:10)

可悲的是,这种情况也经常发生在我身上,如果我在git stash之前意识到我的错误并使用git commit,我会使用git cherry-pick,否则两个命令在其他答案中都会得到很好的解释< / p>

我想为git checkout targetBranch添加一个说明:如果targetBranch与当前分支具有相同的历史记录,此命令将仅保留您的工作目录和暂存快照

  

如果您尚未提交更改,请使用git checkout   移动到新分支,然后正常提交

@ Amber的声明并非错误,当您转到 newBranch git checkout -b newBranch时,会创建一个新指针,它指向与当前分支完全相同的提交。<登记/> 实际上,如果您碰巧有另一个与当前分支共享历史记录的分支(两者都指向同一个提交),您可以“移动您的更改”git checkout targetBranch

但是,通常不同的分支意味着不同的历史记录,并且Git不允许您使用脏工作目录或暂存区域在这些分支之间切换。在这种情况下,您可以执行git checkout -f targetBranch(清除和一次性更改)或git stage + git checkout targetBranch(清除和保存更改),只需运行{{1}会出错:

  

错误:您对以下文件的本地更改将被覆盖   结帐时:           ...   请在切换分支之前提交更改或存储它们。中止

答案 4 :(得分:0)

软git reset 将已提交的更改放回索引中。接下来,签出您打算提交的分支。然后 git commit 带有新的提交消息。

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

来自git docs

  

git reset [<mode>] [<commit>]此表单将重置当前分支头   并可能更新索引(将其重置为树)   和取决于的工作树。如果是   省略,默认为--mixed。必须为以下之一:

     

--soft完全不触摸索引文件或工作树(但将头重置为,就像所有模式一样)。这留下了所有   您更改的文件“要提交的更改”,就像git status一样   它。