如何在Git中执行以下操作?
我当前的分支是branch1,我做了一些本地更改。但是,我现在意识到我实际上是要将这些更改应用于branch2。有没有办法应用/合并这些更改,以便它们在branch2上成为本地更改而不在branch1上提交它们?
答案 0 :(得分:852)
由于您的文件尚未在branch1
中提交:
git stash
git checkout branch2
git stash pop
或
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
git stash
man page):
要隐藏当前未跟踪(新添加的)文件,请添加参数
-u
,以便:
git stash -u
答案 1 :(得分:83)
存储,临时提交和变基可能都是矫枉过正的。如果您还没有将更改的文件添加到索引中,那么您可以只签出另一个分支。
git checkout branch2
只要您编辑的文件在branch1和branch2之间不同,这将起作用。它会让你在branch2上保留工作变更。如果它们不同,那么您可以指定要将本地更改与通过使用-m
选项切换分支所引入的更改合并以进行结帐。
git checkout -m branch2
如果您已添加对索引的更改,那么您将首先通过重置撤消这些更改。 (这将保留您的工作副本,它只会删除分阶段的更改。)
git reset
答案 2 :(得分:11)
前面提到的藏匿方法的一个较短的替代方案是:
暂时将更改移至存储区。
git stash
创建并切换到新分支,然后只需一步即可将存储区弹出。
git stash branch new_branch_name
然后只需add
和commit
对此新分支的更改。
答案 3 :(得分:8)
警告:不适用于git newbies。
这在我的工作流程中已经足够了,我几乎试图为它编写一个新的git命令。通常的git stash
流是的方式,但有点尴尬。我通常先做一个新的提交,因为如果我一直在查看更改,所有信息都是我脑海中的新鲜事而且最好只是启动git commit
- 我发现的(通常)
如果你遇到这样的情况很有帮助,你可以another working directory与当前的{{3}}一起检查
master
分支。
所以我如何实现这一点:
git commit
立即通过良好的提交消息进行更改。git reset HEAD~1
撤消当前分支的提交。有时候稍后(异步),或者立即在另一个终端窗口中:
cd my-project-master
这是另一个WD共享相同的.git
git reflog
找到我刚刚制作的错误修补程序。git cherry-pick SHA1
提交。(可选)(仍然是异步的)您可以重新设置(或合并)您的功能分支以获取错误修正,通常在您即将提交PR并清理了您的功能分支和WD时:
cd my-project
这是我正在研究的主要WD。 li>
git rebase master
获取错误修正。通过这种方式,我可以不间断地继续处理该功能,而不必担心git stash
任何事情或者必须在git checkout
之前清理我的WD(然后检查功能分支退出)再次。)并且仍然将我的所有错误修正都转到master
而不是隐藏在我的功能分支中。
当您处理一些重要功能时,IMO git stash
和git checkout
是真正的PIA。
答案 4 :(得分:2)
如果是关于承诺的更改,你应该看一下git-rebase,但正如VonC在评论中指出的那样,当你谈论本地更改时,git-stash肯定是这样做的好方法
答案 5 :(得分:1)
到目前为止给出的答案并不理想,因为它们需要大量不必要的工作来解决合并冲突,或者它们做出太多假设,这些假设经常是错误的。这是如何做到完美。该链接指向我自己的网站。
您要my_branch
提交master
的未经修改的更改,而不提交my_branch
的所有更改。
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
合并到您的分支中,因为无论如何您最终都必须这样做,现在是解决任何冲突的最佳时机。
-u
中的--include-untracked
选项(又名git stash -u
)可以防止您稍后在git clean -f -d
内执行master
时丢失未跟踪的文件。
在git checkout master
之后,重要的是你不要git stash pop
,因为你以后需要这个藏匿处。如果您弹出在my_branch
中创建的存储,然后在git stash
中执行master
,则稍后在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
。
答案 6 :(得分:0)
Create a new branch
add your changes
commit to your changes with a beautiful message
git checkout -b branch_name
git add file_one_name file_two_name file_three_name
git commit -m commit_message