Git 如何有选择地将单个提交中的某些更改还原到单个文件?

Git 如何有选择地将单个提交中的某些更改还原到单个文件?,git,revert,Git,Revert,我的问题是:我愚蠢地对一个文件做了很多更改,并一次提交了所有更改 我意识到很多改变都是垃圾。。。但是他们中的很多人也很好 如何有选择地恢复部分更改?假设您此后没有提交任何其他更改,我会、、然后重新提交 我很确定这应该行得通假设你从那以后没有做过任何其他事情,我会、,然后再做 我很确定这应该可以使用git rebase-I将早期提交分解为多个部分是可行的,但它应该只用于您可以重写其历史记录的分支。操作顺序如下所示: git rebase -i <commit>~1 git-rebas

我的问题是:我愚蠢地对一个文件做了很多更改,并一次提交了所有更改

我意识到很多改变都是垃圾。。。但是他们中的很多人也很好


如何有选择地恢复部分更改?

假设您此后没有提交任何其他更改,我会、、然后重新提交


我很确定这应该行得通

假设你从那以后没有做过任何其他事情,我会、,然后再做


我很确定这应该可以

使用git rebase-I将早期提交分解为多个部分是可行的,但它应该只用于您可以重写其历史记录的分支。操作顺序如下所示:

git rebase -i <commit>~1
git-rebase-i~1
其中,
是要分解的提交。在交互模式下,将要断开的提交更改为
pick
edit
e
。然后关闭编辑器,让重基继续。当
rebase
到达受影响的提交时,它将暂停,允许您在此时进行任何编辑。这包括
git reset HEAD
取消存储
git reset HEAD
取消存储所有内容,以及
git checkout--
放弃工作目录中的更改

从这里开始,您可以按照自己喜欢的任何顺序提交更改。我建议
git add-p
以交互方式添加补丁集,如果对同一文件的多个更改最好在多个提交中提交

最后,当您已经在断开的提交中提交了您想要的所有内容,并且准备好让重新基础继续时,只需发出
git-rebase--continue


如果您想避免重写历史记录,请演示如何使用
git revert--no commit
仅还原提交的一部分。

使用
git rebase-i
可以将以前的提交分解为多个部分,但它应该只用于可以重写其历史记录的分支。操作顺序如下所示:

git rebase -i <commit>~1
git-rebase-i~1
其中,
是要分解的提交。在交互模式下,将要断开的提交更改为
pick
edit
e
。然后关闭编辑器,让重基继续。当
rebase
到达受影响的提交时,它将暂停,允许您在此时进行任何编辑。这包括
git reset HEAD
取消存储
git reset HEAD
取消存储所有内容,以及
git checkout--
放弃工作目录中的更改

从这里开始,您可以按照自己喜欢的任何顺序提交更改。我建议
git add-p
以交互方式添加补丁集,如果对同一文件的多个更改最好在多个提交中提交

最后,当您已经在断开的提交中提交了您想要的所有内容,并且准备好让重新基础继续时,只需发出
git-rebase--continue

如果您希望避免重写历史记录,将向您展示如何使用git revert--no commit仅还原提交的一部分。

在某些IDE(如netbeans)中打开文件时,您可以看到所有实时更改,如每行开头的颜色代码。右键单击其中一个颜色标记可以显示以前的颜色。右键单击时的关联菜单还允许您仅撤消对文件的部分更改。因为您已经提交了更改,所以可以执行
git reset soft HEAD^
,然后在netbeans中打开文件,有选择地撤消更改,然后执行
git commit

有人知道如何在emacs中这样做吗?(当我看到这篇文章时,我一直在寻找这篇文章。)

当你在一些IDE(如netbeans)中打开一个文件时,你可以看到所有的变化,就像每行开头的颜色代码一样。右键单击其中一个颜色标记可以显示以前的颜色。右键单击时的关联菜单还允许您仅撤消对文件的部分更改。因为您已经提交了更改,所以可以执行
git reset soft HEAD^
,然后在netbeans中打开文件,有选择地撤消更改,然后执行
git commit


有人知道如何在emacs中这样做吗?(当我看到这篇文章时,我正在寻找这一点。)

将提交修改为多个提交?@MattFenwick:我没有任何git点,这是正确的,但像人类一样区分不同的更改是计算机很难用算法解决的问题之一。我不知道git版本比较和遍历的局限性,但我有一个明智的猜测,那就是你将不得不在这个问题上投入人力,计算机除了给你一个机械的差异摘要之外,再也帮不上什么忙了。@Wug,你试图使这个问题比实际情况复杂得多。我已经知道要保留哪些行和要恢复哪些行。不需要自动微分算法。将提交修改为多个提交?@MattFenwick:我没有任何git点,这是正确的,但是像人类一样区分不同的变化是计算机很难用算法解决的问题之一。我不知道git版本比较和遍历的局限性,但我有一个明智的猜测,那就是你将不得不在这个问题上投入人力,计算机除了给你一个机械的差异摘要之外,再也帮不上什么忙了。@Wug,你试图使这个问题比实际情况复杂得多。我已经知道要保留哪些行和要恢复哪些行。不需要自动微分算法。嗯,我喜欢这个想法…我想知道是否有一种方法可以不用重新计算