Git - 将单个更改提交到新分支的最快方法,保持未提交的WIP更改

时间:2015-03-09 11:44:36

标签: git git-branch

有时在开发过程中,我意识到我应该分开我的工作并分别提交一个小修复 - 但是,如果我有正在进行中的未提交更改,并且我已经在多个提交的分支上,这将变得很困难。< / p>

Git似乎有以下选项,其中没有一个是理想选择:

  1. 将更改提交到当前分支。樱桃 - 在完成并承诺完成后,选择它。
  2. 克隆第二个存储库并将更改复制/粘贴到那里。
  3. 存储未提交的更改。切换,写小修复,提交,推送,切换回,卸载(看起来很长,需要在编写之前实现小修改需要一个单独的分支)
  4. 我想我会喜欢这样的话:

    1. 提交&#34;到新分支&#34;,指定基本提交和分支名称。这将创建一个新分支,提交更改,并可选择保留在当前分支上,包括未完成的更改,或切换到新分支,以丢弃未分级的更改。
    2. 我可以使用这样的东西吗?有没有更好的方法来做这一切?

2 个答案:

答案 0 :(得分:2)

我不确定我是否得到了你的问题。 你有一个git repo而且你在current_branch。您已经进行了一些更改,并且您意识到要在 new 分支上提交部分更改。 在这种情况下,git branch -b new_branch将创建并切换到您的新分支而不会抱怨。只有当您切换到可能需要存储更改的现有分支时才会这样做。

如果问题是您已经进行了更改但想要在其他地方修复一些代码,那么stash就是解决方案。

编辑:从讨论开始,您似乎有一个stable和一个current分支,并希望避免在稳定中弹出存储。 在这种情况下,您可能必须在新分支中提交您想要的内容,然后在stable中选择此提交:

$ git checkout -b tmp_new
$ git add ... && git commit
$ git stash
$ git checkout stable
$ git checkout -b new
$ git cherry_pick tmp_new
$ git branch -d tmp_new
$ git checkout current
$ git stash pop

答案 1 :(得分:1)

所以你在某个分支上非常沉重,你可以对你的工作树进行一个相当容易分离的修复,例如,应该提交给master的当前分支点。

这里有

git add --patch和边带索引:

git branch bugfix-62831 $(git merge-base @ master)  # commit selected changes here

bash                                            # work in an interactive subshell:

export GIT_INDEX_FILE=.git/patchworkindex       # start a(n arbitrarily-named) sideband
rm $GIT_INDEX_FILE

git read-tree bugfix-62831                      # tracking the bugfix content
git add --patch fixed.c fixed.h                 # and apply selected worktree changes

git update-ref refs/heads/bugfix-62831 $(       # update the ref with the fixed content
        git commit-tree -p bugfix-62831 -m- `git write-tree`
)

exit                                            # and we're done 

所有索引都是路径名列表以及随附的回购内容的ID。 Git的read-tree加载索引条目。所以当git查看该索引时,它会看到该提交的路径名和内容。然后git add从工作树中添加新内容并在其中指向索引条目,add --patch允许您根据已存在的内容从差异构建新内容。 write-tree将索引写入repo并打印其顶部的id,commit-tree将指向它的提交写入repo,update-ref更新ref以指向提交。