674

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

我当前的分支是 branch1,我做了一些本地更改。但是,我现在意识到我实际上打算将这些更改应用于 branch2。有没有办法应用/合并这些更改,以便它们成为分支 2 上的本地更改,而无需在分支 1 上提交它们?

4

6 回答 6

950

由于您的文件尚未提交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而由于冲突而失败,这将很有用。
由于存储条目应用在运行时为 HEAD 的提交之上git stash,因此它恢复了最初的隐藏状态而没有冲突。


正如benjohn所评论的(参见git stash手册页):

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

git stash -u
于 2009-02-17T14:16:07.730 回答
89

存储、临时提交和变基可能都过大了。如果您尚未将更改的文件添加到索引中,那么您可以只签出另一个分支。

git checkout branch2

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

git checkout -m branch2

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

git reset
于 2009-02-17T19:53:44.203 回答
16

接受答案的更短的替代方法是:

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

  1. git stash

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

  1. git stash branch new_branch_name

然后只是对这个新分支的更改addcommit

于 2014-08-23T05:46:00.797 回答
10

警告:不适用于 git 新手。

这在我的工作流程中出现得足够多,以至于我几乎尝试为它编写一个新的 git 命令。通常的git stash流程是要走的路,有点尴尬。我通常首先进行新的提交,因为如果我一直在查看更改,所有信息在我的脑海中都是新鲜的,最好开始git commit我发现的内容(通常是我在工作时发现的属于 master 的错误修复)功能分支)马上。

如果您经常遇到这样的情况,在当前目录旁边有另一个工作目录也很有帮助,该目录总是master签出分支。

所以我如何实现这一点是这样的:

  1. git commit立即通过良好的提交消息进行更改。
  2. git reset HEAD~1从当前分支撤消提交。
  3. (可选)继续开发该功能。

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

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

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

  1. cd my-project这是我正在研究的主要 WD。
  2. git rebase master得到错误修正。

通过这种方式,我可以不间断地继续处理该功能,而不必担心git stash-ing 任何事情或必须在 a 之前清理我的 WD git checkout(然后再次检查功能分支退出。)并且仍然有我所有的错误修复master而不是隐藏在我的功能分支中。

IMO git stashgit checkout当您正在开发一些重要功能时,它是一个真正的 PIA。

于 2015-04-08T08:22:46.890 回答
2

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

于 2009-02-17T14:04:25.323 回答
1

这些是我遵循的步骤:

  • 混帐克隆{链接}
  • cd {repo 文件夹}

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

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

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

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

  • git checkout -b {分支名称}

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

现在添加、提交和推送:

  • 混帐添加。
  • git commit -m "添加新分支"
  • git push origin {分支名称}

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

于 2021-10-01T10:38:26.113 回答