如何将本地未提交的更改合并到另一个Git分支中?

llycmphe  于 2022-10-23  发布在  Git
关注(0)|答案(8)|浏览(261)

如何在Git中执行以下操作?
我现在的分支机构是branch1,我在本地做了一些更改。然而,我现在意识到,我实际上是想将这些更改应用到branch2。有没有办法应用/合并这些更改,使它们成为branch2上的本地更改,而不必在branch1上提交它们?

6rqinv9w

6rqinv9w1#

由于您的文件尚未在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

以上是rbentoanswer更长更明确的版本:

git stash
git stash branch branch2

它使用:

git stash branch <branchname> [<stash>]

  • 创建并 checkout 名为<branchname>的新分支,从最初创建<stash>时的提交开始,
  • <stash>中记录的更改应用于新的工作树和索引。

如果成功,并且<stash>stash@{<revision>}形式的引用,那么它将删除<stash>
如果运行git stash push的分支已发生足够的更改,以致git stash apply因冲突而失败,则此功能非常有用。
由于stash条目应用于运行git stash时为HEAD的提交之上,因此它恢复了最初的隐藏状态,没有冲突。
正如benjohn所评论的(见git stash man page):
要存储当前未跟踪的(新添加的)文件,请添加参数-u,以便:

git stash -u
u0njafvf

u0njafvf2#

保留、临时提交和重新设置可能都是过火的。如果您还没有将更改的文件添加到索引中,那么您可以只 checkout 另一个分支。

git checkout branch2

只要您正在编辑的文件在branch1和branch2之间没有不同,这将起作用。它将使您留在branch2上,并保留您的工作更改。如果它们不同,则可以指定要将本地更改与通过使用-m选项切换分支引入的更改合并。

git checkout -m branch2

如果您已向索引添加了更改,则需要先通过重置来撤消这些更改。(这将保留您的工作副本,只会删除暂存的更改。)

git reset
jucafojl

jucafojl3#

可接受答案的一个较短替代方案是:
暂时将更改移动到存储库。
1.git stash
创建并切换到一个新的分支,然后只需一步就可以将藏品放入其中。
1.git stash branch new_branch_name
然后,只需addcommit对这个新分支进行更改。

bfrts1fy

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的另一个WD
1.git reflog找到我刚刚做的错误修复。
1.提交的git cherry-pick SHA1
可选地(仍然是异步的),然后您可以重新设置(或合并)功能分支以获得错误修复,通常是在您即将提交PR并且已经清理了功能分支和WD时:
1.cd my-project,这是我正在研究的主要WD。
1.git rebase master获取错误修复。
通过这种方式,我可以不间断地使用该功能,而不必担心git stashgit checkout之前做任何事情,也不必清理我的WD(然后再次检查功能分支),而且我的所有错误修复程序都会转到master,而不是隐藏在我的功能分支中。
IMO git stashgit checkout是一种真正的PIA,当您正在开发一些大功能时。

7rtdyuoh

7rtdyuoh5#

如果是关于提交的更改,你应该看看git rebase,但正如VonC在评论中指出的,当你谈论本地更改时,git stash肯定是一个很好的方法。

ut6juiuv

ut6juiuv6#

以下是我遵循的步骤:

  • git克隆{link}
  • cd{repo文件夹}

您可以检查状态以及正在使用的分支:

  • git状态
  • git分支
  • git分支-a

注意:在这里,如果您在移动到新分支之前对本地回购进行了更改,以下步骤仍然有效。
如果“git branch”显示master,并且您想创建+移动到另一个分支:

  • git checkout-b{分支名称}

使用“git branch”再次检查分支。现在应该显示您在新的分支中。
现在添加、提交和推送:

  • git添加。
  • gitcommit-m“添加新分支”
  • git推送源{分支名称}

当我在迁移到新的本地分支之前进行更改或在迁移到新分支之后进行更改时,上述步骤对我都适用。我希望它能帮助人们遇到类似的情况。

zmeyuzjn

zmeyuzjn7#

如果未提交的更改是未跟踪已跟踪更改的混合

什么是未跟踪的更改?

当你创建一个新文件时。VSCode例如在文件资源管理器中的文件旁边显示U

什么是跟踪的更改?

当您更改之前提交到存储库的文件时(在以前的提交中)。

快速解释程序

因此,假设您在分支A上,但您只想将对现有文件的更改提交到分支m12o1p,而新创建的文件(未跟踪)应该提交到新的分支m1n 3o1p。可以通过一些技巧使用存储,一步一步地解释。

将脚本添加到.git/config

.git文件夹中有一个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,您可以立即访问它)

git checkout -b newBranchName

使用stash pop时,隐藏的更改将添加到当前分支。

git stash pop

剩下的唯一事情就是在新的分支B上暂存并提交更改

git add .
git commit -m "created new file"
kpbpu008

kpbpu0088#

我发现我很有用。
然而,由于该线程已关闭,无法发表评论,我对该答案有一个问题。
当我应用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

相关问题