git:从较早的提交中删除文件

时间:2017-07-03 10:14:01

标签: git

我正在开发一个分支,我做了几次提交,在第一次提交中我改变了一个接口来添加一个新方法,然后也改变了实现类。

我已经在代码库中找到了一个现有的方法,它可以完成我想要的任务,所以我想在第一次提交时检查文件。

我之前只提交了重置文件,因此我不知道如何做到这一点,过去我已经检查了我想要从旧提交中删除的文件,但是创建了一个新的提交,也意味着文件在坩埚中显示为代码审查的一部分,但没有任何更改。

有人可以向我解释如何做到这一点吗?

1 个答案:

答案 0 :(得分:2)

如果您不希望文件被更改(然后更改回来)成为历史记录的一部分,那么您需要进行历史记录重写。如果有问题的提交已被推送(并且可能与其他开发人员共享),则重写所产生的问题可能会比您在上面概述的问题更糟糕,而您正试图避免这些问题。 / p>

执行此操作的最基本方法是使用交互式rebase。如果你有

... A --- B --- C --- D <--(current_branch)

其中current_branch是您正在处理的任何分支,B是您添加方法的提交,您可以说

git rebase -i A current_branch

(将A替换为相应提交的SHA ID)。这将打开一个带有TODO列表的文本编辑器,每行代表一个提交。

找到B的命令(它应该是第一行)。如果提交中的事物是您要还原的更改,请删除该行。否则,更改&#34;选择&#34;线路上的第一个单词。到&#34;编辑&#34;。

然后从编辑器中保存并退出。现在按照提示操作。如果您要编辑B,则会收到提示,要求您进行更改;所以还原有问题的文件。如果从B删除更改会导致冲突,系统会提示您解决这些冲突。

最终你得到了一个成功的变基,但重要的是要注意:如果current_branch先前被推过,那么你现在有了

... A --- B --- C --- D <--(origin/current_branch)
     \
      B' --- C' --- D' <--(current_branch)

当你尝试推送时,git会抱怨(因为对current_branch的更新不会是快进的)。如果你强行推动,那么使用分支机构的所有其他人现在必须从一个&#34;上游的rebase&#34; (参见&#34下的git rebase文档;从上游rebase恢复&#34;)。

当我说你需要与其他回购用户协调时,我并没有指示你做得好;我警告你,如果你没有,并且他们错误地处理了最终的恢复过程,你的工作就会被取消。