在 git pull 后如何保留本地更改以便重做?

3
我的错误是在本地仓库上覆盖了已经在远程仓库中的提交。我有三个提交还没有推送到远程仓库。有没有办法保留这些更改,这样当我执行git pull时,我可以解析提交并回到正常状态?
我需要逐步指导命令,因为我担心做错事情。

展示一下 git log --graph --oneline --all 的状态。你的远程仓库是正确的状态,而本地仓库是错误的状态吗?此外,根据你正在做的事情,这可能不是一个坏的状态;你在本地有尚未发布到任何地方的更改。 - Makoto
@Makoto 是的,你说得对。如果他提交了本地更改并想从远程拉取,我认为他应该运行 git reset HEAD~,然后按照我的答案中建议的命令操作。你同意吗? - scharette
@Makoto,我已经做了很多Git,但我必须承认这是一个非常好的问题,因为他可能提交了他的工作。我在Stackoverflow上没有看到其他关于这个主题的问题。 - scharette
2个回答

4
我有三个提交尚未推送到远程。有没有办法可以保留这些更改,这样当我执行git pull时,我可以解析提交并回到正常状态?

这里有几个选项:

1)您不必做任何事情。

文档所述:

git pullgit fetch后跟git merge FETCH_HEAD的速记法

因此,如果您当前的历史记录如下:
12bcdef345 my third commit
8765fedcba my second commit
abcdef1234 my first commit

然后,在执行了 git pull 后,你的历史记录会看起来像这样:
98aabbcc76 merge from server
12bcdef345 my third commit
8765fedcba my second commit
abcdef1234 my first commit

所以,如果你想回到拉取之前的状态,可以像这样重置到你最初的提交之一:

git reset --hard 12bcdef345

你可能希望快速复制你的历史记录,使用git log --oneline,以防你重置太多或改变了想法。
2)你可以使用reflog 运行git log --oneline,你会得到当前分支的提交历史。查看最近检出的提交记录也有一个类似的命令:git reflog --oneline
即使你删除了当前分支,你也可以使用git reflog找到你已经检出的提交记录,然后通过运行以下命令从旧的提交中重新创建分支:
git checkout -b <branch-name> <commit-hash>

请注意,reflog通常会保存您的历史记录约90天。
3)您可以“备份”您的分支。
如果您是紧张的类型,并且确实想确保不会丢失提交,或者您要执行一些复杂的操作,而不想在reflog中搜索旧的提交,则可以使用以下命令快速创建备份分支:
git branch <backup-branch-name> <HEAD-or-branch-to-backup>

如果您愿意,可以通过检查备份分支并查看其历史记录来验证它是否有效。然后,在检出原始分支的情况下,运行git pull
如果将来某个时候您决定要将原始分支恢复到备份时的状态,只需将其重置为备份分支即可:
git reset --hard <backup-branch-name>

1

注意

如果您的本地更改尚未提交,则此方法可行。我不确定您是否已经提交了您的本地更改。在运行命令之前,请留下一条评论回答我的问题。

如果我理解正确,您需要从远程拉取数据,同时保留当前的本地更改。如果是这种情况,以下是一个简单的解决方案。运行以下命令:

git stash
git pull
git stash apply

现在这将首先隐藏您当前的更改并允许您从远程拉取。当您运行git stash apply时可能会出现一些冲突。再次强调,我不确定您所说的“我可以解析提交并返回正常状态”的意思,但如果您之前已经解决了冲突,那么做起来应该没问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接