在子提交大小的步骤中重放git?

时间:2014-03-16 09:16:49

标签: git

在我最近的提交中,我在代码中做了一些清理工作,不幸的是我也引入了一个错误。

现在我想回到之前的提交,然后一点一点地添加新提交的更改,以便查看哪个更改是罪魁祸首。

我可以用git做到吗? 如果是这样,怎么样?

3 个答案:

答案 0 :(得分:2)

如果你没有推动改变,你可以这样做:

git reset HEAD^ # undo the last commit
git add -p      # add some of your changes
git commit      # commit them

根据需要随时重复最后两个步骤。

现在,您可以测试新提交是否包含错误。一旦找到错误提交,您可以使用git rebase -i删除该提交或修复它。

只要您没有推送您的提交,所有这一切都可以正常工作。如果您已经推送了提交,那么您可能希望首先恢复提交,并逐步重新实现您的功能是小型自包含提交。

答案 1 :(得分:1)

Git不跟踪“提交内”的更改。听起来你应该使用revert来“撤消”你的违规提交。还原后,您可以重新实现更改,减去错误。

一般情况下,您需要使本地提交较小且孤立,以便在需要时可以轻松地在分支之间进行恢复和挑选。当单个提交包含大量不相关的更改时,很难仅“撤消”有缺陷的部分。

在推送到远程存储库之前,有些人使用rebase来“压缩”提交并清理其本地历史记录;有效地“合并”小的相关提交。远程历史记录是团队资产。

答案 2 :(得分:1)

您可以使用git checkout <commit> -- <files>git gui轻松检索部分提交。

更准确地说,一种方便的方法可能是:

git tag ref #to easily point to this commit later
git revert ref #revert the bug

#Start retrieving you changes
git checkout ref -- . #The files have the modifications but aren't modified
git gui # Select only a bit of the modifications, discards the others, and commit
git commit -m "Retrieved part of my modification"

#Continue
git checkout ref -- .
git gui #Incorporate some other modifications
git commit -m "Retrieved part of my modification 2"

# and so on...