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

如何在Git中执行以下操作?

我当前的分支是分支1,我做了一些本地更改。然而,我现在意识到我实际上是想将这些更改应用到分支2。有没有办法应用/合并这些更改,使它们成为分支2上的本地更改,而不会提交给分支1?

149018 次浏览

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

由于您的文件尚未在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的提交之上,因此它会恢复最初的存储状态而不会发生冲突。


如评论 by本约翰(见git stash手册页):

要存储当前未跟踪(新添加)的文件,请添加参数-u,因此:

git stash -u

存储、临时提交和重新建立基础都可能是多余的。如果您还没有将更改的文件添加到索引中,那么您可能只能签出另一个分支。

git checkout branch2

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

git checkout -m branch2

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

git reset

接受的答案的较短替代方案是:

暂时将更改移动到存储区。

  1. git stash

创建并切换到一个新的分支,然后只需一步即可将存储弹出到它。

  1. git stash branch new_branch_name

然后只需addcommit对这个新分支进行更改。

警告:不适合git新手。

这在我的工作流程中出现得足够多,以至于我几乎试图为它编写一个新的git命令。通常的git stash流程是有点尴尬。我通常从如果我一直在看的变化所有的信息是新鲜的在我的脑海里开始先提交一个新的提交,最好立即开始git commit-ing我发现的(通常是我在处理功能分支时发现的属于master的错误修复)。

如果你经常遇到这样的情况,将另一个工作目录与当前的master分支一起检查也是有帮助的。

所以我是如何做到这一点的:

  1. git commit立即更改并提供良好的提交消息。
  2. git reset HEAD~1从当前分支撤消提交。
  3. (可选)继续处理该功能。

有时稍后(异步),或立即在另一个终端窗口中:

  1. cd my-project-master这是另一个共享相同.git的WD
  2. git reflog找到我刚刚做的错误修复。
  3. #提交的EYZ0。

可选(仍然是异步的),然后您可以重新定位(或合并)您的功能分支以获取错误修复,通常是在您即将提交PR并且已经清理了您的功能分支和WD时:

  1. cd my-project,这是我正在开发的主要WD。
  2. git rebase master获取错误修复。

通过这种方式,我可以不间断地继续研究该功能,而不必担心git stash写入任何内容或在git checkout之前清理我的WD(然后再次检查功能分支),并且仍然将我所有的错误修复转到master而不是隐藏在我的功能分支中。

IMOgit stashgit checkout是一个真正的PIA,当你在工作中的一些大的功能。

以下是我遵循的步骤:

  • git clone{link}删除链接
  • cd{repo文件夹}

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

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

注意:在这里,如果您在移动到新分支之前在本地存储库中进行更改,则以下步骤仍应有效。

如果“git分支”显示master,并且您想创建+移动到另一个分支:

  • git check out-b{分支名称}

使用“git分支”再次检查分支 它现在应该显示您在新分支中。

现在添加、提交和推送:

  • git add
  • git提交-m"添加新的分支"
  • git推送来源{分支名称}

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

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

什么是未跟踪的更改?

当您创建一个新文件时。VSCode e. g在文件资源管理器中的文件旁边显示一个U

什么是跟踪更改?

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

快速解释程序

因此,假设您在分支A上,但您只想将对现有文件的更改提交到分支A,而新创建的文件(未跟踪)应该提交到新分支B

将脚本添加到.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"

我发现这个答案很有用。

然而,由于该线程已关闭,无法发表评论,我对该答案有问题。

当我应用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