我更改了很多文件,我意识到我的方法不好。所以,我想尝试另一种方法。在这种情况下,我知道两种解决方案:
- 提交:我不想使用此功能,因为我知道我当前的代码不起作用。
- Stash:我也不想使用它,因为我错过了几个文件,我必须再次重写它们。
我正在寻找的是以某种方式保存我当前的更改(而不会丢失我当前的更改(,然后丢弃一些我不想要的更改,同时保留其余的更改。在这种情况下,如果我意识到我的第二种方法也不起作用,那么我只需要切换到以前的状态。
有这样的功能吗?
我认为@Signey_Gijzen的答案可能是最好的,但你也可以用git stash apply
做到这一点。 也就是说,您需要执行以下操作:
$ git stash # as usual, stashes the changes
... now your changes are gone from the working tree ...
$ git stash apply # unstashes, but keeps stash around
... now they're all back ...
$ git stash list # the stash will still be there
stash@{0}: WIP on master: ...
$ git show stash@{0} # what did that stash look like again?
签出一个新分支,添加文件并在那里提交更改。然后更改回您之前正在处理的分支。
我会使用相同的方法来尝试您的第二种方法。
Git 的使用依赖于提交
这是一个一般性问题(例如,没有特定的代码/树示例可供使用(,因此您将获得一个通用答案。简短的版本是:不,Git 无法保存提交或向索引添加内容之外的工作。即使是stash命令也是提交的特例,并利用了这些基本进程。
但是,在 Git 内部和外部,您肯定可以做一些事情。一些例子包括(排名不分先后(:
- 执行软重置为已知良好的提交,然后通过使用
git commit --patch
选择要添加到索引的差异大块来挑选正在进行的更改。
将工作树 复制到另一个目录,恢复到上次已知良好的提交,并随时将文件或大块文件复制回工作树中。例如:
mkdir /tmp/broken_wip cp * /tmp/broken_wip git reset --hard cp /tmp/broken_wip/somefile .
创建一个临时分支来存储您的"脏"提交,然后更改回主分支。然后,您可以从临时分支机构带上任何您喜欢的东西。例如,假设您当前使用的是master:
git checkout -b broken_branch git add . git commit -am 'broken WIP' git checkout master
使用 RCS存储当前状态,同时确保不提交RCS目录或任何
*,v
文件。
即使您不想发布历史记录,通常也最好将问题代码提交到临时主题分支,修复或导入内容,然后释放主题分支。但是,如果您确实需要避免将内容提交到历史记录或索引中,则可能应该利用二级修订控制系统或使用文件系统。
您的里程可能会有所不同。
按照Sidney Gizejen提出的答案,我认为在最后添加一个樱桃挑选步骤会让它对你有用。假设您当前在分支current_branch
上,并希望将更改保存到分支temp_branch
,您可以执行以下操作:
git checkout -b temp_branch
git add <the_things_you_wanna_add>
git commit -m "..."
git checkout current_branch
git cherry-pick temp_branch -n
cherry-pick
命令将应用给定提交引入的更改。在这种情况下,由于您正在传递一个分支,因此它将使用该分支上的最后一次提交。-n
选项可以应用更改但不提交更改。