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

mai*_*ial 388 git github

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

Bil*_*oor 675

git stash 是你的朋友.

如果您还没有提交,请运行git stash.这样可以省去所有更改.

切换到您想要更改的分支并运行git stash pop.

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

一个例子:

# work on some code
git stash
git checkout correct-branch
git stash pop
Run Code Online (Sandbox Code Playgroud)

  • 不需要隐藏未提交的更改,当您签出分支时,它们会随身携带.Stash更适用于临时事物的长期存储(您想要完成并稍后提交的内容,但您现在需要做其他事情). (113认同)
  • @Tekkub 仅当您要切换到的分支与您所在的分支是最新的时才是正确的。例如,如果您意外地在 prod 分支上工作,需要切换到 stage 分支,但同时 stash 中的 stage 已更改,这是进行切换的唯一方法。 (12认同)
  • @Tekkub“临时事物的长期存储”这句话感觉很尴尬,使用 stash 的另一点是它将它推入堆栈,因此如果您不希望它继续进行并处理其他事情,那么这种方式很有用. 是的,您不必这样做,但只是感觉更干净,更有控制力。 (4认同)
  • 我明白了。所以我必须存储,切换分支,然后弹出 `C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> 错误:你对以下文件的本地更改将被 checkout 覆盖: <br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> 请在切换分支之前提交更改或隐藏它们。<br/>中止` (2认同)

Amb*_*ber 235

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

如果您已经提交改变:

  1. 输入git log并记住要移动的提交的SHA.
  2. 查看要将提交移动到的分支.
  3. 键入git cherry-pick SHA从以上取代SHA.
  4. 切换回原始分支.
  5. 用于git reset HEAD~1在错误的分支提交之前重置.

cherry-pick 获取给定的提交并将其应用于当前已检出的头,从而允许您将提交复制到新分支.

  • **在您提交文件之前,对文件的更改不会绑定到特定分支.**< - this.这为我解开了一个谜.谢谢. (14认同)
  • 你甚至不需要在这里挑选.`git reset HEAD~N --soft`然后`git checkout -b`将所有_now_未提交的代码移动到新分支. (9认同)
  • 尝试切换分支时出现以下错误:"以下文件的本地更改将被checkout覆盖".所以,似乎我不能移动到不同的分支并正常提交. (8认同)
  • @Mischa如果您在具有不同历史记录的两个分支之间进行切换,则它不起作用 (3认同)

mr_*_*ore 34

如果要将更改移动到新分支,只需两个命令即可完成此操作:

git stash
git stash branch new-branch
Run Code Online (Sandbox Code Playgroud)

根据git stash文档:

<branchname> [<stash>]

创建并检出<branchname><stash>最初创建的提交开始命名的新分支,将记录的更改应用于新的工作树和索引.


wat*_*HUN 14

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

我想补充说明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(清理并保存更改),只需运行git checkout targetBranch就会出错:

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


JSO*_*C11 7

一个软复位的git会把提交更改回你的指数。接下来,检查您打算提交的分支。然后使用新的提交消息git commit

  1. git reset --soft <commit>

  2. git checkout <branch>

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

git 文档

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

--soft根本不接触索引文件或工作树(但将头部重置为 ,就像所有模式一样)。这会留下所有更改的文件“要提交的更改”,正如 git status 所说的那样。