如何在Git中执行以下操作?
我当前的分支是Branch1,我做了一些本地更改。然而,我现在意识到我实际上打算将这些更改应用到Branch2。有没有一种方法可以应用/合并这些更改,使它们成为Branch2上的本地更改而不在Branch1上提交它们?
- 这里有一个很棒的Git教程。它是所有关于堆栈溢出的git问题的中心。
由于您的文件尚未在branch1中提交:
1 2 3
| git stash
git checkout branch2
git stash pop |
或
1 2 3 4
| git stash
git checkout branch2
git stash list # to check the various stash made in different branch
git stash apply x # to select the right one |
如Benjohn所评论(见git stash手册页):
To also stash currently untracked (newly added) files, add the argument -u, so:
- 谢谢-这正是我要找的
- 不客气。在unethicalblogger.com/posts/2008/11/…上使用stash的更多示例。
- 如果您正在寻找同一问题的解决方案,但是使用tfs,等效的解决方案是搁置您的更改,然后使用tfs power tools使用/migrate开关取消搁置到正确的分支。
- 这对我有用。不过,我还必须创建一个本地分支机构,让"StashPop"工作。签出stackoverflow.com/questions/1783405/git checkout remote bran‌&8203;ch,如果您遇到类似情况。
- 这对我不起作用。如果我在master上意外地做了一组更改,并且这些更改是未限制的,但是我想将它们应用到其他分支开发中,如果我尝试git stash,那么它将不允许我签出开发。
- @ems您在藏匿后试图删除cx1〔0〕时收到了什么错误信息?
- 我打开了一个问题。
- 如果你有一个新添加的文件怎么办?你如何将它应用到不同的分支?
- @Kapitanluffy如果新文件尚未添加到索引中,它将被存储并重新应用。如果将其添加到索引中,则新分支的签出不应触及它。
- @VONC添加到索引?你是说承诺?我试着把新文件添加到舞台上,把它藏起来,移动到另一个分支,然后在那里"git stash pop"。但没有显示。
- @不,不是提交,只是添加到索引中:stackoverflow.com/a/3690796/6309
- @我试过了,但是当我换到另一个分支并应用了存储时,新文件没有出现。
- 这个答案和你的答案拯救了我的工作。:)
- 若要存储当前未跟踪(新添加)的文件,请添加参数-u,so:git stash -u。
- @本约翰说得对。我已经把你的评论包括在回答中,以提高可见度。
- 好的,谢谢
- 在切换分支后,如何避免在所需分支中发生可怕的合并冲突?
- @Conantonakos"避免"?如果同一个文件涉及并发修改,就不能避免这种情况。但是stackoverflow.com/a/27382210/6309很有趣。
- 谢谢!我认为下一个答案可能会真正帮我解决这个问题:theverge.com/tldr/2016/10/4/13160850/…
藏匿、临时承诺和重新平衡可能都是多余的。如果您还没有将更改后的文件添加到索引中,那么您可以只签出另一个分支。
只要您正在编辑的文件在Branch1和Branch2之间不存在差异,这将起作用。它将使您留在Branch2上,并保留工作更改。如果它们不同,则可以指定要将本地更改与通过将分支与-m选项切换到签出而引入的更改合并。
如果您已经添加了对索引的更改,那么您将希望先通过重置来撤消这些更改。(这将保留您的工作副本,只删除阶段性更改。)
- 我认为stash在某种程度上是"简单"的,但是您的方法在考虑跨不同分支的工作目录方面更好。+ 1
- 简单的传统结账方式似乎更适合解决手头的问题。签出更轻,它只更新需要更改的文件。也许更容易理解隐藏方法,或者仅仅是因为在这个用例中,结帐是"安全的"还不够明显。
- 如果checkout -m在某些情况下不"安全"(可能会导致合并冲突),stash会提供任何优势(例如,你能打开stash pop吗)?
- @Craigmcqueen你不能打开一个弹出的隐藏,但当你打开它时,隐藏会抱怨冲突。您可以修复冲突,然后提交,但在本例中,原始存储仍然在堆栈上!:)
- 如果发生合并冲突,文件是否备份为.orig?
与先前提到的库存方法相比,较短的替代方法是:
Temporarily move the changes to a stash.
git stash
Create and switch to a new branch and then pop the stash to it in just one step.
git stash branch new_branch_name
然后,只有add和commit对这个新分支进行了更改。
(P)警告:不是为了吉特·纽斯(p)(P)This comes up enough in my worklow that I've almost tried to write a new git command for it.通常的EDOCX1音标0-音符是通往去的路,但它是一个小Awkward。I usually make a new commit since I have been looking at the changes,all the information i s fresh in my mind and it's better to just start EDOCX1 individual 1-ing what i found(usually a bugfix belonging on master that I discover while working on a feature branch)right away.(p)布尔奇1(P)So how I achieve this goes like this:(p)
EDOCX1:The changes right away with a good commit message.
EDOCX1 3 Ondo the commit from Current Branch.
(optional)continue working on the feature.
(P)有时晚期(Asynchronously),或当下在另一个终点窗:(p)
是另一首诗
EDOCX1 6 to find the bugfix I've just made.
EDOCX1:承诺书7
(P)Optimonally(still asynchronous)You can they redase(or merge)your feature branch to get the bugfix,usually when you are about to submit a PR and have cleaned your feature branch and WD already:(p)
EDOCX1 8,which is the main WD I'm working on.
EDOCX1 9极致的找到猫头鹰
(P)This way I can keep working on the feature unienterprupted and not have to worry about EDOCX1 universal 0-ing anything or having to clean my WD before a EDOCX1 original 11(and then having the check the feature branch back again)and still have all my bugfixes goes to EDOCX1 12-instead of hidden in my feature branch.(p)(P)IMO EDOCX1的英文字母0和EDOCX1是一个真正的PIA,当你在工作的中间关于一些大的Feature。(p)
- 有趣和有效的替代我的答案。+ 1
- 你是墨丘利人吗?my-project-master共享同一个.git使它听起来像这样。为什么不是git checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard之后(异步)在master上,git cherry-pick 上?(或者甚至,为了避免从你现在所在的分支机构找到sha1,git rebase --onto master feature bugfixABC。这意味着你可以直接在上面的git reset之后做,而在feature上做。)
- 然而,OP听起来好像还没有准备好提交更改,在这种情况下,只有checkout -m更好。
如果是关于承诺的变更,您应该看看Git-Rebase,但是正如VONC在评论中指出的,当您谈论本地变更时,Git-Stash无疑是实现这一点的好方法。
- 我不理解这个解决方案:它将重写Branch1中Branch2的提交历史…当我们只想获取Branch2中Branch1的本地未提交更改时,为什么要获取Branch2中Branch1的所有已提交更改?…
- @VONC:同意,在这种情况下,REBASE获取自上次分支合并到Branch1以来所有提交的更改。我一开始没有得到这个问题的"未提交"参数。重新平衡不是个好答案。
- @克莱弗里:普夫…我开始头疼了;)我本来会对你的回答投反对票的,但自从我自己发表了一个答案之后,就出现了"明显的利益冲突"。有了你最新的帖子,我现在不必投反对票了。谢谢)
- @VONC:下次,只要我的回答和这一个一样错误,就可以随意投反对票;)
目前给出的答案并不理想,因为它们需要大量不必要的工作来解决合并冲突,或者它们做出了太多的假设,而这些假设往往是错误的。这就是如何做到完美。链接指向我自己的网站。
如何提交到Git中的其他分支
您在my_branch上有未提交的更改,您希望提交给master,而不提交来自my_branch的所有更改。
例子
1 2 3 4 5 6 7 8 9 10 11 12
| git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop |
解释
首先将master合并到您的分支中,因为您最终必须这样做,现在是解决任何冲突的最佳时机。
git stash -u中的-u选项(即--include-untracked选项)可防止以后在master中执行git clean -f -d操作时丢失未跟踪的文件。
在git checkout master之后,重要的是你不能在git stash pop之后,因为你以后需要这个藏身处。如果你打开在my_branch中创建的藏匿,然后在master中执行git stash,当你以后在my_branch中应用该藏匿时,你将导致不必要的合并冲突。
git reset使git stash apply引起的一切不稳定。例如,在存储库中修改过但不存在于master中的文件被分阶段显示为"被我们删除"冲突。
git checkout .和git clean -f -d放弃所有未提交的内容:对跟踪文件的所有更改,以及所有未跟踪的文件和目录。它们已经被保存在藏匿处,如果留在master中,在切换回my_branch时会造成不必要的合并冲突。
最后一个git stash pop将以原来的my_branch为基础,不会引起任何合并冲突。但是,如果您的藏品中包含您已承诺掌握的未跟踪文件,Git会抱怨它"无法从藏品中恢复未跟踪文件"。要解决此冲突,请从工作树中删除这些文件,然后删除git stash pop、git add .和git reset。
- 您的答案没有被删除,因为它链接到您的网站,它被删除,因为它与来自其他帐户的其他答案相同。我看到另一个帐户与您的帐户有相同的配置文件,您使用两个帐户吗?您可以合并两个帐户。另外,标记一个mod来解释情况,你可以得到你的原始答案(加上upvote)未删除。
- 如果它们合并了,你就不能将它们分开,但是你可以拥有多个账户,只要你不使用它们进行投票欺诈(或者让它们通常相互作用)。向国防部解释你的情况。此外,删除是一个诚实的错误,你怎么能指望有人告诉你使用了两个不同的帐户?
- 你需要标记你的帖子并使用另一个选项来引起一个mod的注意,当你编辑你删除的答案时,他们不会注意。我已经标记了你的帖子,以引起国防部的注意,但是他们很忙,所以耐心点,他们最终会找到你的。
- 不要发布重复的内容,尤其是来自不同帐户的内容。如果两个问题相同,则投票或标记以关闭为副本。