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


422

这经常在我身上发生:我写了一些代码,检查我的更改,然后意识到我不在适当的分支中来检查那些更改。但是,如果不恢复更改,我将无法切换到另一个分支。有没有办法将更改移动到另一个要在其中检查的分支?

Answers:


751

git stash 是你的朋友。

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

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

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

一个例子:

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

122
无需隐藏未提交的更改,当您签出分支机构时,它们会随您而去。存放更多用于长期存储临时内容(您想要完成并稍后提交的内容,但是您现在需要做其他事情)。
2011年

2
我明白了 所以我必须C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
隐藏起来

3
@Tekkub“临时存储长期的东西”说起来很尴尬,使用存储的另一个要点是将它压入堆栈,所以如果您不希望它继续进行其他工作,那么它很有用。是的,您不必一定要保持清洁,并且可以更好地控制自己。
Atherion

宝贝,宝贝!应该附上您提交后应该做的事情
Ishan Srivastava

2
@Tekkub仅当您要切换到的分支与您所在的分支是最新的时,这才是正确的。例如,如果您不小心在prod分支上工作,并且需要切换到阶段分支,但是阶段已更改,同时隐藏存储是进行切换的唯一方法。
danielson317

248

如果尚未提交更改,请使用git checkout移至新分支,然后按常规进行提交-对文件的更改在提交之前不会绑定到特定分支。

如果您已经已经提交改变:

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

cherry-pick 接受给定的提交并将其应用于当前检出的头部,从而使您可以将提交复制到新的分支。


9
您甚至不需要在这里采摘樱桃。 git reset HEAD~N --soft然后git checkout -b将所有现在尚未提交的代码移至新分支。
亚伦

19
在提交文件之前,对文件的更改不会绑定到特定分支。<-这个。这为我解决了一个谜。谢谢。
Tschallacka

8
尝试切换分支时收到以下错误:“对以下文件的本地更改将被签出覆盖”。因此,似乎我无法移至其他分支并正常提交。
Mischa

3
@Mischa如果您在具有不同历史的两个分支之间切换,则无法正常工作
watashiSHUN

1
@Aaron更好(对于提交后的场景)!请另外回答。
Jacktose

16

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

我想对以下内容进行澄清git checkout targetBranch如果targetBranch与当前分支具有相同的历史记录,则此命令将仅保留您的工作目录和暂存快照

如果尚未提交更改,只需使用git checkout移至新分支,然后按常规提交即可

@Amber的语句不是假的,当您移至newBranchgit checkout -b newBranch,将创建一个新的指针,该指针指向与当前分支完全相同的提交。
实际上,如果您碰巧有另一个分支与当前分支共享历史记录(两个点都在同一提交中),则可以通过以下方式“移动更改”:git checkout targetBranch

但是,通常不同的分支意味着不同的历史记录,并且Git不允许您使用肮脏的工作目录或暂存区在这些分支之间进行切换。在这种情况下,您可以执行git checkout -f targetBranch(清除并丢弃更改)或git stage+ git checkout targetBranch(清除并保存更改),仅运行即可git checkout targetBranch产生错误:

错误:您对以下文件的本地更改将被签出覆盖:...在切换分支之前,请先提交更改或存储更改。堕胎


5

一个软的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那样,这会将所有更改的文件保留为“要提交的更改”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.