gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:19:09 26 4
gpt4 key购买 nike

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

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

最佳答案

注意“还原”一词

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

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

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

修订版A中 README的版本显示为“我是自述文件”,并且只有一行。

修订版B中 README的版本显示“我是自述文件”。像以前一样,但是添加了第二行,“此文件长五行。”

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

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

这个问题 Undo a particular commit in Git that's been pushed to remote repos涉及的是还原的还原方式。尽管有时会导致还原为某种还原,但事实并非如此。根据您的问题,您想要的是:“使我成为一个新的提交 D,它具有与commit A相同的源代码”。您想还原到 A版本。

Git没有要还原的用户命令,但是很容易

这个问题 How to revert Git repository to a previous commit?充满了有关使用 git reset --hard的答案,该功能可以完成工作,但是可以通过放弃历史来完成。不过, accepted answer包含其中一个键,具体来说是这样的:

git checkout 0d1d7fc32 .


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

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

现在我们有四个提交:
A <-B <-C <-D   <-- master (HEAD)

其中commit D具有正确的两行 README和新文件 newfile

如果我们这样做:
$ git checkout <hash-of-A> -- .

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

为了解决这个问题,我们不仅要从提交中 check out 所有文件,还应该从删除索引中的所有文件开始:
$ git rm -r -- .

然后从commit A重新填充索引和工作树是安全的:
$ git checkout <hash> -- .

(我尝试在这里自动使用 --,以防我想要的路径名类似于选项或分支名称或类似名称;即使我只想 checkout 名为 -f的文件或目录,它也可以使之工作)。

完成这两个步骤后,就可以对结果进行 git commit了。

次要:快捷方式

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

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

关于git - git恢复到某些提交,而不更改历史记录并创建一个新的提交,如git revert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49388201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com