今天我对git的改变在哪里?

时间:2013-11-11 15:18:49

标签: git

我对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'

之后我注意到我对本地回购的所有更改都丢失了!

还有回路吗?

1 个答案:

答案 0 :(得分:3)

恢复工作

不要害怕:你的承诺没有消失,只是未引用!

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

现在运行:

git reflog

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

git reset --hard <sha>

环顾你的工作副本;你应该恢复你的工作!如果它仍然不存在,请返回到reflog并返回历史记录,直到找到 的正确提交为止。现在,您可以根据需要重新合并,如果您愿意,可以将工作推回到origin

如果您在开始时stashed进行了更改,请在对您所处的位置感到满意后,使用git stash pop将其更改回来。

出了什么问题

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

当您运行完全指定的命令,例如git pull origin mastergit fetch origin master时,git将master <{1}} 提取提交,但是它将提交的名称存储在名为origin的特殊引用中,而不是更新FETCH_HEAD。要使远程跟踪分支保持最新,只需运行origin/master而不使用任何参数。

所以,可能发生的情况是,您的git fetch(#4)和reset(#8)都在merge上定位较早的提交!

你想做什么

与上游工作保持同步:

master

分享你的作品:

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