0

我对git知之甚少。我不想坏事。今天我开始将我的更改推送到 git,然后我想解决冲突。所以,我今天所做的是:

git pull origin master               # 1
git commit -m "message"              # 2
git push origin master               # 3

git reset --hard origin/master       # 4  resulted in fatal error.

git add *                            # 5
git commit -a -m "my second commit"  # 6
git fetch origin master              # 7
git merge -s recursive \
            -X theirs origin/master  # 8 resulted in message 'up-to-date'
git pull origin/master               # 9 resulted in message 'up-to-date'

之后,我注意到我在本地 repo 上的所有更改都丢失了!

有办法回去吗?

4

1 回答 1

3

拿回你的工作

不要害怕:你的提交并没有消失,只是没有被引用!

首先,确保你的工作副本是干净的;也就是说,git status显示您没有本地修改或暂存文件的输出。如果这样做,git stash请在工作时运行以将更改放在一边。

现在运行:

git reflog

您将看到当前分支在最近过去指向的提交的名称(sha 哈希)和消息的列表。查找带有消息“消息”的提交的名称(或错误合并之前的最后一次提交)。复制该提交的 sha 并使用以下命令指向master该提交:

git reset --hard <sha>

环顾您的工作副本;你应该把你的工作拿回来!如果它仍然不存在,请返回 reflog 并返回历史记录,直到找到正确的提交来完成您的工作。现在,您可以在必要时重新合并,并将您的工作推回(origin如果您愿意)。

如果您stashed在开始时进行了更改,git stash pop请在对当前位置感到满意后将其恢复。

什么地方出了错

该名称origin/master指的是一种特殊的分支,称为远程跟踪分支。基本上,它是一个只读镜像,与另一个 git 存储库中分支的最后已知状态同步;在这种情况下,远程master分支。origin但实际更新时间的规则有点棘手。

当你运行像git pull origin masteror之类的完全指定的命令git fetch origin master时,git 会从获取提交,但它会将提交的名称存储在一个名为而不是更新的特殊引用中。要使您的远程跟踪分支保持最新,只需不带参数运行即可。masteroriginFETCH_HEADorigin/mastergit fetch

因此,可能发生的情况是您的reset(#4) 和您的merge(#8) 都针对master!

你想做什么

要跟上上游工作的最新信息:

# Update all remote-tracking branches with the lastest changes
git fetch
# Merge them in
git merge origin/master

分享您的工作:

git push origin master
于 2013-11-11T16:12:03.347 回答