如何从git历史中消除提交及其更改?

时间:2015-12-04 19:05:33

标签: git

我对文件提交了许多提交:

  • 提交E
  • 提交D
  • 提交C
  • 提交B
  • 提交A

我相信我在提交C中引入了一个错误。我想在那个文件上删除Commit C中引入的所有更改,而不会影响其他更改,因此它看起来像A - > B - > D - >即

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

  1. 查看当前工作状态的单独分支(例如backup_branch)。
  2. 找出提交B,D和E的提交哈希值(例如,执行git log)。
  3. 在目标( not backup)分支上,通过执行git reset --HARD committish_b恢复提交B,其中committish_b是您为提交B的提交哈希找到的任何内容。执行此操作后,您将丢失在目标分支上提交B后所做的所有更改。
  4. Cherry pick通过git cherry-pick committish_dgit cherry-pick committish_e将D和E提交到目标分支。

答案 1 :(得分:1)

每次提交都附带一个哈希值。

假设commit C的哈希是abc123

你可以做一个简单的git revert <hash>

$ git revert abc123
  

git revert命令撤消已提交的快照。但是,它不是从项目历史记录中删除提交,而是指出如何撤消提交引入的更改,并使用生成的内容附加新提交。这可以防止Git丢失历史记录,这对于修订历史记录的完整性和可靠的协作非常重要。

source

修改

根据您的评论,您只想恢复文件而不是整个提交。如果是这种情况,请考虑以下事项:

提交B的散列为abc456

$ git checkout abc456 -- /path/to/file.ext

答案 2 :(得分:0)

git checkout commitE-SHA

git checkout commitB-SHA / path / to / file

(然后照常提交)

这将创建一个新的提交来撤消一个文件中的更改。

这比尝试重写历史记录或从历史记录中删除错误的提交或错误文件更好(更安全,更容易,更容易混淆)。