git恢复到某些提交,而不更改历史记录并创建一个新的提交,如git revert

曼森(Manthan Jamdagni)

有没有一种方法可以还原到某个提交而不更改远程历史记录,基本上像git revert一样在新提交中撤消对该提交的所有更改?

例如-我有3次提交,提交A-> B-> C,我的头目前在CI上,现在想创建另一个提交D,它将具有与A相同的代码,以便我可以将该提交推送到远程分支而无需更改历史。

星期二

注意“还原”一词

当人们在Git中说“我想还原”时,它们有时表示做什么git revert,这更多的是后退操作,有时表示您所做的事情,这是从较早版本还原源库

为了说明这一点,假设我们有一个只有一个文件,README三个提交的提交:

A <-B <-C   <-- master (HEAD)

的版本README在版本A说:“我是一个README文件”,而仅仅是一个线长。

的版本README在修订版B说:“我是一个README文件。” 和以前一样,但是增加了第二行,“此文件长五行。”

README修订版C的版本已得到纠正,其第二行显示为“此文件长两行”。

Gitgit revert可以撤消更改,因此,现在,运行git revert <hash-of-B>将尝试删除添加的line这将失败,因为该行不再匹配(并且我们可以git revert --abort放弃)。同样,运行git revert <hash-of-C>将尝试撤消更正这将成功,有效地恢复修订B

这个问题(在Git中撤消已提交到远程存储库的特定提交)完全是关于回退类型的。尽管有时会导致还原为某种还原,但事实并非如此。根据您的问题,您想要的是:“使我成为一个新的提交D,它的源代码与commit相同A”。您想还原到version A

Git没有用户命令可还原为,但这很容易

这个问题,如何将Git存储库还原到先前的提交?充斥着有关使用的答案git reset --hard,它可以完成工作,但是可以通过放弃历史来完成。接受的答案,但是,包括的关键之一,特别是这样的:

git checkout 0d1d7fc32 .

这个命令告诉GIT中提取,从给定的承诺0d1d7fc32所有的文件是在该快照和当前目录(.)。如果当前目录位于工作树的顶部,则将从所有目录中提取文件,因为它们.递归包括子目录文件。

这样做的一个问题是,是的,它提取了所有文件,但没有从索引和工作树中删除不需要的任何文件。为了说明,让我们回到我们的三提交存储库并添加第四次提交:

$ echo new file > newfile
$ git add newfile
$ git commit -m 'add new file'

现在我们有四个提交:

A <-B <-C <-D   <-- master (HEAD)

其中,提交D了正确的两行README新的文件newfile

如果我们这样做:

$ git checkout <hash-of-A> -- .

我们将README使用commit的版本覆盖索引和工作树版本A我们将回到第一行README但是,我们的索引和工作树中仍将包含file newfile

为了解决这个问题,我们不仅要从提交中检出所有文件,还应该从删除索引中的所有文件开始

$ git rm -r -- .

然后可以安全地从commit重新填充索引和工作树A

$ git checkout <hash> -- .

(例如--,如果我想要的路径名类似于选项或分支名称或类似名称,我会尝试自动使用此处;即使我只想签出名为的文件或目录-f它也可以使它正常工作)。

一旦完成了这两个步骤,就可以git commit确保结果安全

次要:快捷方式

由于Git实际上只是根据索引进行提交,因此您要做的就是将所需的提交复制到索引中。git read-tree命令执行此操作。您可以让它同时更新工作树,因此:

$ git read-tree -u <hash>

而不是删除并签出就足够了。(您仍然必须照常进行新的提交。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章