所以我在github上有两个分支 - master&重构。我在当地检查了重构,然后去了镇上。在某些时候,我搞砸了并且做了一个git push origin master
而不是推送到原点重构,而且直到两周后才对master进行进一步的有效更改之后才注意到这个问题。
/ me facepalms
为了尝试解开东西,我在本地检查了master,并做了git revert <some tag>
,通过删除我添加的各种文件来修复master,依此类推。美好结局!推到原点大师,一切都很顺利。保持在我的本地重构分支上工作,偶尔推动原点重构。
今天,我完成了我的重构的第一次传递,并希望将我的更改推送到掌握。我git add
,git commit
,git push origin refactor
。一切都很好。然后我尝试推动原始大师。失败!不足为奇,需要手动合并,因为恶作剧,对吧?所以我git pull origin master
在我当地的重构分支......而且所有的东西都松了。我的所有新文件都被删除,到处都是冲突。
我认为正在发生的事情是,revert push正在尝试应用,并且与我非常快乐的变化相冲突,这些变化应该干净地应用在master之上,如果只是。
所以,因为我还是一个git newb,关于如何拯救我的跛脚的任何建议?如果您可以提供一些关于如何在我未来的工作流程中避免此类错误的一般指导/教育,则可获得奖励积分。谢谢!
答案 0 :(得分:3)
关于如何在将来避免这种情况:将push.default
设置为upstream
并且只运行git push
而不进一步参数,除非您明确要推送到其他分支(我个人从来没有)。不要推到其他分支机构。查看master
,合并refactor
,推送。
您可能还想考虑合并中的父订单。你的工作流程在那里造成了一团糟。
修复你的问题:你猜对了:你正在合并你的恢复提交,所以这就是git所做的。以下是如何防止这种情况:
创建master-fix-revert
的新分支master
并查看它:
git checkout -b master-fix-revert master
还原你还原:
git revert **SHA-of-revert-commit**
查看您的refactor
分支并合并您的master-fix-revert
:
git checkout refactor
git merge master-fix-revert
删除临时分支:
git branch -d master-fix-revert
答案 1 :(得分:0)
git revert
通过添加新提交撤消更改,这些提交会对先前提交中执行的操作进行反向更改。当您想要撤消更改而不重写已公开推送的分支的历史记录以及其他可能已经存入其自己的存储库的分支历史记录时,它非常有用。
如果不是您的情况,我建议使用更直观的技术撤消更改,例如git reset
。假设您的主分支提交了A,B,C,并且您意外地将D和E置于其上。
master
A <-- B <-- C <-- D <-- E
如果D和E是您不必要的,多余的提交,您可以这样做:
继续当地的主分行:
git checkout master
使用--hard
指向特定提交。这是一个非常通用的命令,提交可以是对象库中的任何内容,它不一定必须是master的历史记录中的提交。在你的情况下:
git reset --hard <sha1 of C>
master
A <-- B <-- C
然后使用force推送到您的仓库,因为您重新编写了历史记录,因此它不是快进的:
git push origin master -f
然后,结帐重构并继续工作。如果你想从你的主分支指向的位置(即使用额外的多余提交)进行拾取,你可以使用git reset
将其设置在那里:
git checkout refactor
git reset --hard <sha1 of E>
master refactor
A <-- B <-- C <-- D <-- E
这是可选的,当然,您可以决定使用其他方式,例如从新主分支中分支重构,手动添加以前的修改,或者通过分享等等。
然后继续向refactor
添加提交,然后合并为master并推送master:
git checkout master
git merge refactor
git push origin master
master
refactor
A <-- B <-- C <-- D <-- E <-- F
在那里,它仍然是一个非常基本的工作流程。我的建议是使用像gitk
这样的工具:
gitk --all
尽可能多地查看您不同分支机构上发生的事情。