【问题标题】:How to rewrite commit history?如何重写提交历史?
【发布时间】:2019-07-21 03:32:44
【问题描述】:

从工作分支X 创建分支Y 后,我删除了一些文件以减少视觉噪音,因为在分支Y 上工作时看不到FS 上的这些文件。这些文件正在分支X 中进行更改。

这里是场景:

A - B [origin/master]
     \
      C - D - G - H [origin/X]
           \
            E - F [Y]

来自分支Y 的更改也被推送到origin/Y

已在分支Y 上提出 PR 请求以供审核。


如何重写origin/Y中的提交历史来取回文件?

【问题讨论】:

  • @eftshift0 Branch Y 已经在最新提交的 PR 请求中。这个查询和附加的没有区别吗?
  • 那里没有解释那部分......但是取回文件的方法仍然是相同的......现在,当你得到更正的分支时,你可以这样做:git push -f origin Y。强制推送分支后,PR 应该会在 github 或 bitbucket 上更新。
  • @eftshift0 我有parent of the commit that deleted the fileid1。下面第 2 步中的 id of the previous commit 是什么?我在id1之后删除了多个文件
  • 父 ID 是您用于运行 git checkout <rev-id> -- <deleted-filepath> 命令的 ID。

标签: git git-branch


【解决方案1】:

我会给你一个简单的食谱作为备用,以防万一。假设您的分支名为 A,并且您删除了 A~3 上的文件(即 A 后面的 3 个修订版):

git checkout A~3 # we set ourselves on the revision where the files where deleted
git checkout HEAD~1 -- file1 file2 file3 # get back the files from the previous revision
git commit --amend --no-edit # commit new revision with the deleted files back in place
git cherry-pick A~3..A # replay revisions after this new revision
# if you like the results:
git branch -f A # set the branch on this new position
git checkout A
git push -f origin A

应该可以的

【讨论】:

  • 我看到this approach 更简单......因为在我的情况下,一个文件被删除,一个文件被重命名和修改。但这正在改变我的提交历史。
  • 提交历史会改变...至少修订的内容...即使您与评论/作者保持同一行修订,您正在重写历史。
  • 所以,我想在当前的提交上应用this approach。但这不是在应用这种方法之后需要新的提交然后推送这些更改吗?因为我有一个正在提交的 PR 请求?
  • 那么,您想要创建一个新的附加修订版来获取文件吗?当然,有可能......不是最优雅的处理方式,但有可能......当然,在签出已删除的文件后,您将需要一个新的提交。
  • 提交历史更改后,git push -u origin Y 是否会产生任何问题?因为提交历史在本地分支Y?
【解决方案2】:

正如 cmets 中提到的 @eftshift0,您可能会发现这个 answer 很有用。 它表明您可以使用以下内容恢复丢失的文件并重写 git 历史记录:

git rebase -i <id of the commit with the files before they were deleted>
git checkout <id of the commit previous to the one you're currently on> <filename>
git commit --amend
git rebase --continue
git tag -d originalHead

尽管如此,保持 git 历史记录不变是有价值的,因此可以在answer 找到另一个在不更改 git 历史记录的情况下恢复丢失文件的选项,它是这样说的:

git checkout &lt;id of the commit with the files before they were deleted&gt; &lt;filename&gt;

此外,如果您想恢复多个文件,answer 显示了一些方法,例如可以多次运行 git checkout 命令。

【讨论】:

  • previous commit 将是文件消失的提交之前的提交。此外,如果您想恢复多个文件,answer 显示了一些方法来做到这一点。我会更新我的答案。
  • 从运行这些命令的目录中,在子目录dir1中删除了两个文件。
  • 这是否也维护了最新提交中创建的新文件?
  • 应该的。看看git status
  • git checkout 将保留最新提交中的新文件,除非您签出在当前分支中修改过的文件。
猜你喜欢
  • 2016-01-04
  • 1970-01-01
  • 2014-11-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2022-11-07
  • 2013-04-15
相关资源
最近更新 更多