我对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'
之后我注意到我对本地回购的所有更改都丢失了!
还有回路吗?
答案 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 master
或git 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