在git我遇到过这样的情况:
a - b - c - d - #be2c15
^
我想从提交中恢复一些文件" a"所以我没有修改工作树就重置了SOFT
a - b - c - d - #be2c15
^
然后我恢复了标记为已删除的文件。
此时我不得不将索引重置为#be2c15然后执行提交但是我犯了一个错误并立即提交了更改:
a - b - c - d - #be2c15
\
#88ae59e
现在提交#88ae59e完全包含我想要的所有内容但位置错误。我怎样才能"移动"它没有触及它包含的任何文件? 像这样:
a - b - c - d - #be2c15 - #88ae59e
答案 0 :(得分:2)
我认为git rebase
可以正常工作(但是在执行rebase时可能会发生合并冲突之间的变化)。
之后
$ git rebase be2c15 88ae59e
可能还有一些合并冲突,你可能得到你想要的东西。
使用git rebase --abort
恢复
但如果您想要恢复一些已删除的文件,可能会有更简单的方法来执行此操作。
的git文档git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>…
当给出
<paths>
或--patch
时,git checkout 不会切换分支。它从索引文件或命名的<tree-ish>
(通常是提交)更新工作树中的命名路径。
所以
$ git checkout a -- path-to-folder/or/file/
将检查提交时path-to-folder/or/file
的{{1}}。
答案 1 :(得分:1)
假设您要使用#88ae59e
树创建提交,此命令序列应该可以解决问题:
git checkout 88ae59e #checkout the tree that you want to commit
#you should be in detached head state now
git reset --soft master #switch HEAD to the intended parent commit
#you should still be in detached head state now
git checkout master #reattach to your branch so it will see the following commit
git commit ...
如果你在分离头状态下执行git reset --soft
,你就不会离开头部状态,所以你需要在重置后通过第二个git checkout
将你的头部指向分支。 / p>
答案 2 :(得分:0)
你可以在git之外做到这一点很容易避免任何冲突或烦恼:
git checkout 88ae59e
tar cf /tmp/tmp.tar --exclude=.git
git checkout be2c15
tar xf /tmp/tmp.tar ; rm /tmp/tmp.tar
git add... ; git commit