Git,"移动"完全没有合并文件的提交

时间:2016-07-26 07:59:22

标签: git git-commit git-reset

在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

3 个答案:

答案 0 :(得分:2)

我认为git rebase可以正常工作(但是在执行rebase时可能会发生合并冲突之间的变化)。

之后

$ git rebase be2c15 88ae59e

可能还有一些合并冲突,你可能得到你想要的东西。

使用git rebase --abort恢复

如果您想要恢复一些已删除的文件,可能会有更简单的方法来执行此操作。

关于git checkout

的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