如何在具有多个提交的单个文件之间恢复特定提交

时间:2017-11-03 16:45:57

标签: git

我们说我有一个文件

hello.txt的

1. Hello
2. World

我添加了以下文字(3. Bye)..所以文件变为

1. Hello
2. World
3. Bye

并将其提交给SHA1_1

再次添加另一行(4. World

1. Hello
2. World
3. Bye
4. World

并将其提交到SHA1_2

如果我还原SHA1_1,我不应该只收到这样的文件(删除我在3. Bye中添加的SHA1_1

1. Hello
2. World
4. World

不这样做。所以我尝试重置为原来的SHA1_1和樱桃挑选SHA1_2。你猜怎么着? SHA1_2包含带有3. Bye的整个文件的快照,该文件不在该提交中。有没有更好的方法来获得差异,正如我们在这些提交之间的差异中所看到的那样?

@JDB我必须做错事......我说

revert bye_commit

1. Hello
2. World
<<<<<<< HEAD
3. Bye
Z. Extra Line
4. World
=======
Z. Extra Line
>>>>>>> parent of f6e1e81... Added Bye

1 个答案:

答案 0 :(得分:1)

我担心你的例子无法解决冲突,这意味着一个简单的恢复将要求你解决这个冲突。你的变化太紧密了,所以Git不能自信地告诉他们。

如果我们通过分离SHA1_1和SHA2_1引入的更改来稍微修改示例,那么我们可以做到这一点而不会发生冲突:

添加了Hello.txt

1. Hello
2. World
Z. Extra Line

<强> SHA1_1

1. Hello
2. World
3. Bye
Z. Extra Line

<强> SHA2_1

1. Hello
2. World
3. Bye
Z. Extra Line
4. World

现在Git可以自信地确定3和4是单独的更改并为您自动合并。

> git revert SHA1_1

生成一个如下所示的新提交:

1. Hello
2. World
Z. Extra Line
4. World

您可以在此处查看这些提交的示例:https://github.com/cyborgx37/sandbox/commits/SO-47100683

更深度

在您的示例中,当您还原SHA1_1时,它会尝试将文件还原到:

1. Hello
2. World

当它比较文件的当前状态SHA2_1时,它会看到:

1. Hello
2. World
3. Bye
4. World

所以git不知道如何处理第3和第4行。

在我的修改示例中,还原尝试应用SHA1_1'

1. Hello
2. World
Z. Extra Line

并且文件的当前状态为SHA2_1'

1. Hello
2. World
Z. Extra Line
4. World

Git可以比较Z线并看到一条线被移除并自动将两个变化合并在一起。