gpt4 book ai didi

Git:如何从改变的历史中恢复?

转载 作者:太空狗 更新时间:2023-10-29 14:47:22 25 4
gpt4 key购买 nike

强烈推荐的做法是不要更改其他人将 pull 的已推送到其他地方的提交的历史记录。尽管如此,不了解这一点的人还是不可避免地会这样做。从“其他用户”而非改变历史的人的角度来看,最好的恢复方式是什么?

这里有一个具体的例子。

Ryan 创建了一些提交和推送:

ryan $ git init
ryan $ echo "initial stuff" > file.txt
ryan $ git add file.txt
ryan $ git commit -m "Initial commit"
ryan $ echo "more stuff" >> file.txt
ryan $ git add file.txt
ryan $ git commit -m "More stuff"
ryan $ git remote add origin [some url]
ryan $ git push origin

Joe 克隆了 github 存储库

joe $ git clone [some url]

至此,万事大吉,那么……

Ryan 更改了最后一次提交:

ryan $ vi file.txt
ryan $ git add file.txt
ryan $ git commit --amend -m "More stuff"
ryan $ git push origin
[Fails]
ryan $ git push -f origin master

请注意,Ryan 在失败后进行了强制 push 。如果他是唯一一个从 origin 中 pull 出来的人,那会很好,但在这种情况下,他只是把 Joe 搞砸了。

Joe 试图 pull :

joe $ git pull origin
[Conflict!]

现在这是一个非常简单的示例,但 Joe 可能不熟悉 file.txt 并且会发现很难 merge 更改。

同样,我明白问题的根源是瑞安做了坏事。尽管如此,我正在寻找 Joe 和他的队友无需进行 merge 提交即可从中恢复的方法。

我确实知道一个技巧,就是删除远程分支的本地副本,然后从源重新检查它。但是当然这只有在你没有改变的情况下才有效。很可能 Joe 自己做了一些他想提交的新更改。

想法?

最佳答案

你需要在 origin 被重写之前保存它的提交(或者你可以在之后找到它但之前更容易)

git branch save_point origin/master (before fetch)

然后进行抓取,这没有任何改变

git fetch

现在,Joe 的存储库中尚未在 master 上的所有提交都需要重写/重新基于来自 origin 的重写提交

git rebase --onto origin/master save_point master

如果不同分支上的更改不相关,这应该可以正常工作。

您可以在 manual 中阅读相关内容但理解起来并非易事。

关于Git:如何从改变的历史中恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19597408/

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