如何将我当前的更改提交到git中的另一个分支

Aur*_*ron 626 git branch commit

有时我会在工作目录中进行一些更改,并且我意识到这些更改应该在与当前更改的分支中提交.这通常发生在我想尝试新事物或进行一些测试时,我忘记事先创建一个新分支,但我不想将脏代码提交给主分支.

那么,如何将未提交的更改(或存储在索引中的更改)提交到与当前更改不同的分支?

Cas*_*bel 955

其他答案建议检查另一个分支,然后承诺,只有在可以通过本地修改结账时才能工作.如果没有,您就是最常见的用例git stash:

git stash
git checkout other-branch
git stash pop
Run Code Online (Sandbox Code Playgroud)

第一个stash隐藏你的更改(基本上是临时提交),然后stash pop重新应用它们.这让git使用它的合并功能.

如果当您尝试弹出存储时,会遇到合并冲突......接下来的步骤取决于这些冲突是什么.如果所有隐藏的更改确实属于另一个分支,那么您只需要对它们进行排序 - 这是因为您在错误的分支上进行了更改.

另一方面,如果你真的搞砸了,你的工作树有两个分支的混合变化,并且冲突只是你想要在原始分支上提交的那些,你可以节省一些工作.像往常一样,有很多方法可以做到这一点.这是一个,从弹出并看到冲突后开始:

# Unstage everything (warning: this leaves files with conflicts in your tree)
git reset
# Add the things you *do* want to commit here
git add -p     # or maybe git add -i
git commit
# The stash still exists; pop only throws it away if it applied cleanly
git checkout original-branch
git stash pop
# Add the changes meant for this branch
git add -p 
git commit
# And throw away the rest
git reset --hard
Run Code Online (Sandbox Code Playgroud)

或者,如果您事先意识到这将会发生,只需提交属于当前分支的东西.您可以随时返回并修改该提交:

git add -p
git commit
git stash
git checkout other-branch
git stash pop
Run Code Online (Sandbox Code Playgroud)

当然,请记住,这一切都需要一些工作,并且下次可以避免它,也许通过$(__git_ps1)在bashrc中添加到PS1中将当前分支名称放在提示符中.(例如参见Bash文档中的Git.)

  • @ user815423426如果您有未提交的更改,当且仅当您更改的文件集和两个分支之间不同的文件集不相交时,您可以签出另一个分支.也就是说,如果您修改了文件A,则只有在两个分支中文件A相同时才能检出另一个分支. (5认同)
  • 不幸的是,@sybog64 `git` 对于新手来说非常危险。所有的。很容易导致东西以难以找回或不可能找回的方式丢失或消失,直到您在不了解的情况下放弃做任何事情。这是一个完全渗透了抽象漏洞的软件的完美例子,实际上 git 中的几乎所有内容都是速记,而不是抽象。要点是:每个“git”答案确实需要一个通用警告,并且很难为任何单个答案提供更具体的警告,因为通常有多个你可以操纵/绊倒的陷阱。 (5认同)
  • 如果工作树中存在其他更改,则此答案非常有效,这些更改无法在我需要提交更改的分支上干净地移动. (2认同)

tan*_*ius 57

您可以创建一个新分支并切换到它.然后提交您的更改:

git branch dirty
git checkout dirty
// And your commit follows ...
Run Code Online (Sandbox Code Playgroud)

或者,您也可以签出现有分支(仅git checkout <name>).但是,只有在没有冲突的情况下(所有已编辑文件的基础与当前分支中的相同).否则你会收到一条消息.

  • 请注意,在切换到**现有*****divergent***分支的情况下,您可以使用`-m`选项告诉git尝试合并更改,即`git checkout -m <name>` (11认同)
  • 更短的版本:`git checkout -b dirty` (4认同)
  • @ user815423426:如果编辑文件但未提交,则无法签出文件未提交(或之前已删除)的分支.Git将中止:*错误:以下文件的本地更改将被结帐覆盖:...* (3认同)
  • @ Jefromi的答案在我认为的每一个案例中都更好. (2认同)
  • 当您致力于新分支时,这确实是更好的答案。`stash` 会删除你已经上演的内容;这种方法没有。 (2认同)

Han*_*Gay 21

  1. git checkout my_other_branch
  2. git add my_file my_other_file
  3. git commit -m

并提供您的提交消息.

  • @tanascius好建议,做完了.我一直在使用别名,所以我忘记它们不是默认值. (3认同)