如何在Git中执行以下操作?我现在的分支机构是branch1,我在本地做了一些更改。然而,我现在意识到,我实际上是想将这些更改应用到branch2。有没有办法应用/合并这些更改,使它们成为branch2上的本地更改,而不必在branch1上提交它们?
6rqinv9w1#
由于您的文件尚未在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的answer更长更明确的版本:
git stash git stash branch branch2
它使用:
git stash branch <branchname> [<stash>]
<branchname>
<stash>
如果成功,并且<stash>是stash@{<revision>}形式的引用,那么它将删除<stash>。如果运行git stash push的分支已发生足够的更改,以致git stash apply因冲突而失败,则此功能非常有用。由于stash条目应用于运行git stash时为HEAD的提交之上,因此它恢复了最初的隐藏状态,没有冲突。正如benjohn所评论的(见git stash man page):要存储当前未跟踪的(新添加的)文件,请添加参数-u,以便:
stash@{<revision>}
git stash push
git stash apply
git stash
-u
git stash -u
u0njafvf2#
保留、临时提交和重新设置可能都是过火的。如果您还没有将更改的文件添加到索引中,那么您可以只 checkout 另一个分支。
git checkout branch2
只要您正在编辑的文件在branch1和branch2之间没有不同,这将起作用。它将使您留在branch2上,并保留您的工作更改。如果它们不同,则可以指定要将本地更改与通过使用-m选项切换分支引入的更改合并。
-m
git checkout -m branch2
如果您已向索引添加了更改,则需要先通过重置来撤消这些更改。(这将保留您的工作副本,只会删除暂存的更改。)
git reset
jucafojl3#
可接受答案的一个较短替代方案是:暂时将更改移动到存储库。1.git stash创建并切换到一个新的分支,然后只需一步就可以将藏品放入其中。1.git stash branch new_branch_name然后,只需add和commit对这个新分支进行更改。
git stash branch new_branch_name
add
commit
bfrts1fy4#
**警告:**不适合git新手。
这在我的工作流程中出现得足够多了,以至于我几乎试图为它编写一个新的git命令。通常的git stash流是一种方式,但有点尴尬。我通常会先提交一个新的提交,因为如果我一直在查看更改,所有的信息在我的脑海中都是新鲜的,最好立即开始我发现的东西(通常是我在处理功能分支时发现的属于master的错误修复)。如果您经常遇到这样的情况,将another working directory与当前的i1j2o1l放在一起也很有帮助,因为当前的i2o1p分支总是被检出。所以我是这样做的:1.git commit立即用一条好的提交消息处理更改。1.git reset HEAD~1撤消当前分支的提交。1.(可选)继续使用该功能。有时稍后(异步),或立即在另一个终端窗口中:1.cd my-project-master,这是共享相同.git的另一个WD1.git reflog找到我刚刚做的错误修复。1.提交的git cherry-pick SHA1。可选地(仍然是异步的),然后您可以重新设置(或合并)功能分支以获得错误修复,通常是在您即将提交PR并且已经清理了功能分支和WD时:1.cd my-project,这是我正在研究的主要WD。1.git rebase master获取错误修复。通过这种方式,我可以不间断地使用该功能,而不必担心git stash在git checkout之前做任何事情,也不必清理我的WD(然后再次检查功能分支),而且我的所有错误修复程序都会转到master,而不是隐藏在我的功能分支中。IMO git stash和git checkout是一种真正的PIA,当您正在开发一些大功能时。
git commit
git reset HEAD~1
cd my-project-master
.git
git reflog
git cherry-pick SHA1
cd my-project
git rebase master
git checkout
master
7rtdyuoh5#
如果是关于提交的更改,你应该看看git rebase,但正如VonC在评论中指出的,当你谈论本地更改时,git stash肯定是一个很好的方法。
ut6juiuv6#
以下是我遵循的步骤:
您可以检查状态以及正在使用的分支:
注意:在这里,如果您在移动到新分支之前对本地回购进行了更改,以下步骤仍然有效。如果“git branch”显示master,并且您想创建+移动到另一个分支:
使用“git branch”再次检查分支。现在应该显示您在新的分支中。现在添加、提交和推送:
当我在迁移到新的本地分支之前进行更改或在迁移到新分支之后进行更改时,上述步骤对我都适用。我希望它能帮助人们遇到类似的情况。
zmeyuzjn7#
当你创建一个新文件时。VSCode例如在文件资源管理器中的文件旁边显示U。
U
当您更改之前提交到存储库的文件时(在以前的提交中)。
因此,假设您在分支A上,但您只想将对现有文件的更改提交到分支m12o1p,而新创建的文件(未跟踪)应该提交到新的分支m1n 3o1p。可以通过一些技巧使用存储,一步一步地解释。
A
.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"
kpbpu0088#
我发现我很有用。然而,由于该线程已关闭,无法发表评论,我对该答案有一个问题。当我应用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
8条答案
按热度按时间6rqinv9w1#
由于您的文件尚未在
branch1
中提交:或
以上是rbento的answer更长更明确的版本:
它使用:
git stash branch <branchname> [<stash>]
<branchname>
的新分支,从最初创建<stash>
时的提交开始,<stash>
中记录的更改应用于新的工作树和索引。如果成功,并且
<stash>
是stash@{<revision>}
形式的引用,那么它将删除<stash>
。如果运行
git stash push
的分支已发生足够的更改,以致git stash apply
因冲突而失败,则此功能非常有用。由于stash条目应用于运行
git stash
时为HEAD的提交之上,因此它恢复了最初的隐藏状态,没有冲突。正如benjohn所评论的(见
git stash
man page):要存储当前未跟踪的(新添加的)文件,请添加参数
-u
,以便:u0njafvf2#
保留、临时提交和重新设置可能都是过火的。如果您还没有将更改的文件添加到索引中,那么您可以只 checkout 另一个分支。
只要您正在编辑的文件在branch1和branch2之间没有不同,这将起作用。它将使您留在branch2上,并保留您的工作更改。如果它们不同,则可以指定要将本地更改与通过使用
-m
选项切换分支引入的更改合并。如果您已向索引添加了更改,则需要先通过重置来撤消这些更改。(这将保留您的工作副本,只会删除暂存的更改。)
jucafojl3#
可接受答案的一个较短替代方案是:
暂时将更改移动到存储库。
1.
git stash
创建并切换到一个新的分支,然后只需一步就可以将藏品放入其中。
1.
git stash branch new_branch_name
然后,只需
add
和commit
对这个新分支进行更改。bfrts1fy4#
**警告:**不适合git新手。
这在我的工作流程中出现得足够多了,以至于我几乎试图为它编写一个新的git命令。通常的
git stash
流是一种方式,但有点尴尬。我通常会先提交一个新的提交,因为如果我一直在查看更改,所有的信息在我的脑海中都是新鲜的,最好立即开始我发现的东西(通常是我在处理功能分支时发现的属于master的错误修复)。如果您经常遇到这样的情况,将another working directory与当前的i1j2o1l放在一起也很有帮助,因为当前的i2o1p分支总是被检出。
所以我是这样做的:
1.
git commit
立即用一条好的提交消息处理更改。1.
git reset HEAD~1
撤消当前分支的提交。1.(可选)继续使用该功能。
有时稍后(异步),或立即在另一个终端窗口中:
1.
cd my-project-master
,这是共享相同.git
的另一个WD1.
git reflog
找到我刚刚做的错误修复。1.提交的
git cherry-pick SHA1
。可选地(仍然是异步的),然后您可以重新设置(或合并)功能分支以获得错误修复,通常是在您即将提交PR并且已经清理了功能分支和WD时:
1.
cd my-project
,这是我正在研究的主要WD。1.
git rebase master
获取错误修复。通过这种方式,我可以不间断地使用该功能,而不必担心
git stash
在git checkout
之前做任何事情,也不必清理我的WD(然后再次检查功能分支),而且我的所有错误修复程序都会转到master
,而不是隐藏在我的功能分支中。IMO
git stash
和git checkout
是一种真正的PIA,当您正在开发一些大功能时。7rtdyuoh5#
如果是关于提交的更改,你应该看看git rebase,但正如VonC在评论中指出的,当你谈论本地更改时,git stash肯定是一个很好的方法。
ut6juiuv6#
以下是我遵循的步骤:
您可以检查状态以及正在使用的分支:
注意:在这里,如果您在移动到新分支之前对本地回购进行了更改,以下步骤仍然有效。
如果“git branch”显示master,并且您想创建+移动到另一个分支:
使用“git branch”再次检查分支。现在应该显示您在新的分支中。
现在添加、提交和推送:
当我在迁移到新的本地分支之前进行更改或在迁移到新分支之后进行更改时,上述步骤对我都适用。我希望它能帮助人们遇到类似的情况。
zmeyuzjn7#
如果未提交的更改是未跟踪和已跟踪更改的混合
什么是未跟踪的更改?
当你创建一个新文件时。VSCode例如在文件资源管理器中的文件旁边显示
U
。什么是跟踪的更改?
当您更改之前提交到存储库的文件时(在以前的提交中)。
快速解释程序
因此,假设您在分支
A
上,但您只想将对现有文件的更改提交到分支m12o1p,而新创建的文件(未跟踪)应该提交到新的分支m1n 3o1p。可以通过一些技巧使用存储,一步一步地解释。将脚本添加到
.git/config
在
.git
文件夹中有一个config
文件。打开它,你会看到这样的东西:将配置文件更改为:
现在,您将能够在分支A上使用以下命令。
如果您正在使用VSCode这样的编辑器,您将看到新文件消失了(它现在已被隐藏)
当仍在分支A阶段并将更改提交到现有文件时:
下一步是创建一个新的分支B(使用
checkout -b
,您可以立即访问它)使用
stash pop
时,隐藏的更改将添加到当前分支。剩下的唯一事情就是在新的分支B上暂存并提交更改
kpbpu0088#
我发现我很有用。
然而,由于该线程已关闭,无法发表评论,我对该答案有一个问题。
当我应用
git checkout other_branch
时,我得到了以下错误因此,我宁愿使用修复了我的问题的命令,而不是应用该命令