有时在开发过程中,我意识到我应该分开我的工作并分别提交一个小修复 - 但是,如果我有正在进行中的未提交更改,并且我已经在多个提交的分支上,这将变得很困难。< / p>
Git似乎有以下选项,其中没有一个是理想选择:
我想我会喜欢这样的话:
我可以使用这样的东西吗?有没有更好的方法来做这一切?
答案 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以指向提交。