如何在Git中执行以下操作?
我当前的分支是分支1,我做了一些本地更改。然而,我现在意识到我实际上是想将这些更改应用到分支2。有没有办法应用/合并这些更改,使它们成为分支2上的本地更改,而不会提交给分支1?
如果是关于提交的更改,你应该看看git-rebase,但正如VonC在评论中指出的那样,当你谈论本地更改时,git-stash肯定是做到这一点的好方法。
由于您的文件尚未在branch1中提交:
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
以上是rbento的回答的更长更明确的版本:
git stash git stash branch branch2
它使用:
git stash branch <branchname> [<stash>] 创建并签出一个名为<branchname>的新分支,从最初创建<stash>的提交开始, 将<stash>中记录的更改应用到新的工作树和索引。 如果成功,并且<stash>是形式stash@{<revision>}的引用,则会丢弃<stash>。 如果您运行git stash push的分支更改得足以导致git stash apply由于冲突而失败,这很有用。 由于存储条目应用于git stash运行时HEAD的提交之上,因此它会恢复最初的存储状态而不会发生冲突。
git stash branch <branchname> [<stash>]
<branchname>
<stash>
如果成功,并且<stash>是形式stash@{<revision>}的引用,则会丢弃<stash>。
stash@{<revision>}
如果您运行git stash push的分支更改得足以导致git stash apply由于冲突而失败,这很有用。 由于存储条目应用于git stash运行时HEAD的提交之上,因此它会恢复最初的存储状态而不会发生冲突。
git stash push
git stash apply
git stash
如评论 by本约翰(见git stash手册页):
要存储当前未跟踪(新添加)的文件,请添加参数-u,因此:
-u
git stash -u
存储、临时提交和重新建立基础都可能是多余的。如果您还没有将更改的文件添加到索引中,那么您可能只能签出另一个分支。
git checkout branch2
只要您正在编辑的文件在分支1和分支2之间没有不同,这就可以工作。它会让您在分支2上保留工作更改。如果它们不同,那么您可以指定要将本地更改与通过使用-m选项切换分支引入的更改合并以结帐。
-m
git checkout -m branch2
如果您已经向索引添加了更改,那么您需要先通过重置来撤消这些更改。(这将保留您的工作副本,它只会删除分阶段的更改。)
git reset
接受的答案的较短替代方案是:
暂时将更改移动到存储区。
创建并切换到一个新的分支,然后只需一步即可将存储弹出到它。
git stash branch new_branch_name
然后只需add和commit对这个新分支进行更改。
add
commit
警告:不适合git新手。
这在我的工作流程中出现得足够多,以至于我几乎试图为它编写一个新的git命令。通常的git stash流程是但有点尴尬。我通常从如果我一直在看的变化所有的信息是新鲜的在我的脑海里开始先提交一个新的提交,最好立即开始git commit-ing我发现的(通常是我在处理功能分支时发现的属于master的错误修复)。
git commit
如果你经常遇到这样的情况,将另一个工作目录与当前的master分支一起检查也是有帮助的。
master
所以我是如何做到这一点的:
git reset HEAD~1
有时稍后(异步),或立即在另一个终端窗口中:
cd my-project-master
.git
git reflog
可选(仍然是异步的),然后您可以重新定位(或合并)您的功能分支以获取错误修复,通常是在您即将提交PR并且已经清理了您的功能分支和WD时:
cd my-project
git rebase master
通过这种方式,我可以不间断地继续研究该功能,而不必担心git stash写入任何内容或在git checkout之前清理我的WD(然后再次检查功能分支),并且仍然将我所有的错误修复转到master而不是隐藏在我的功能分支中。
git checkout
IMOgit stash和git checkout是一个真正的PIA,当你在工作中的一些大的功能。
以下是我遵循的步骤:
您可以检查状态以及您正在使用的分支:
注意:在这里,如果您在移动到新分支之前在本地存储库中进行更改,则以下步骤仍应有效。
如果“git分支”显示master,并且您想创建+移动到另一个分支:
使用“git分支”再次检查分支 它现在应该显示您在新分支中。
现在添加、提交和推送:
上述步骤适用于我在移动到新的本地分支之前进行更改或移动到新分支后进行更改的情况。 我希望它能帮助遇到类似情况的人。
当您创建一个新文件时。VSCode e. g在文件资源管理器中的文件旁边显示一个U。
U
当您更改之前提交到存储库的文件时(在以前的提交中)。
因此,假设您在分支A上,但您只想将对现有文件的更改提交到分支A,而新创建的文件(未跟踪)应该提交到新分支B。
A
B
.git/config
在.git文件夹中有一个config文件。打开它,您将看到如下内容:
config
[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true [remote "origin"] url = https://github.com/... fetch = +refs/heads/*:refs/remotes/origin/* [branch "main"] remote = origin merge = refs/heads/main
将配置文件更改为:
[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true [alias] stash-untracked = "!f() { \ git stash; \ git stash -u; \ git stash pop stash@{1}; \ }; f" [remote "origin"] url = https://github.com/... fetch = +refs/heads/*:refs/remotes/origin/* [branch "main"] remote = origin merge = refs/heads/main
现在,当您在分支A上时,您将能够使用以下命令。
git stash-untracked
如果您使用的是VSCode之类的编辑器,您将看到新文件消失了(现在已隐藏)
当仍处于分支A阶段并将更改提交到现有文件时:
git add . git commit -m "committing tracked changes to current branch"
下一步是创建一个新的分支B(使用checkout -b您可以立即访问它)
checkout -b
git checkout -b newBranchName
使用stash pop时,隐藏的更改会添加到当前分支。
stash pop
git stash pop
唯一剩下的就是在新的分支B上暂存并提交更改。
git add . git commit -m "created new file"
我发现这个答案很有用。
然而,由于该线程已关闭,无法发表评论,我对该答案有问题。
当我应用git checkout other_branch时,我得到了以下错误
git checkout other_branch
error: pathspec 'other_branch' did not match any file(s) known to git
因此,而不是应用命令,我宁愿使用哪个解决了我的问题
git branch other_branch git checkout other_branch