Git - 如何在 squash 合并后恢复中间提交记录

16

我已将数个提交压缩为一个提交。在压缩之前的其中一次提交包含了调试打印信息,而后面与其一同压缩的提交却删去了这些打印信息。 是否有任何方法可以恢复它们?

2个回答

38

是的。使用 git reflog,然后在压缩之前使用git checkout提交哈希值。

以下是一个示例事件序列。

git init .
touch Foo1 Foo2 Foo3
git add Foo1
git commit -m 'Adding Foo1'
git add Foo2
git commit -m 'Adding Foo2'
git add Foo3
git commit -m 'Adding Foo3'
git log # Observe all three commits
git rebase -i --root # Squash commits

git reflog 
    87a5159 HEAD@{0}: rebase -i (finish): returning to refs/heads/master
    87a5159 HEAD@{1}: rebase -i (squash): Adding Foo1
    a0eecf4 HEAD@{2}: rebase -i (squash): # This is a combination of 2 commits.
    4142aa5 HEAD@{3}: rebase -i (pick): Adding Foo1
    85ad082 HEAD@{4}: rebase -i (pick): Adding Foo1
    cbc3a0c HEAD@{5}: rebase -i (start): checkout cbc3a0c02d1899dcfcc614afc07b3a5a502af56f
    71697f7 HEAD@{6}: commit: Adding Foo3

git checkout HEAD@{6} # get back original commits, with head detached.

3
很高兴这个答案仍然有帮助! :) - merlin2011
有没有办法从另一台机器上获取压缩前的提交? - soninob
@soninob reflog 是本地的,不与远程共享,所以这个技巧在不同的机器上是行不通的,除非将整个本地仓库压缩并复制到另一台机器上。 - merlin2011

0

我知道这是一篇旧帖子,但也许其他人会觉得这个相关。
如果你想获取一个在远程存在但本地不存在的提交 ID.... 意思是:
其他人向一个特性分支推送了一些提交,然后对 develop 分支开启了一个 PR,并进行了合并策略。你可以看到提交 ID,但是你本地的 Git 不熟悉这个引用。
你需要做的只是:
git fetch <commit_id>,然后所有相关的树将可用。
我们使用 Bitbucket 作为我们的 Git 服务器,使用 curl 获取 PR 返回的数据中最新的提交摘要。从那时起,检索所有相关数据很容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接