我在一个分支中提交并推动了对git的更改,但随后意识到其中一些更改是不正确的。我删除了不正确的部分,并试图修改原始的提交,因为这是我的组织的标准。但是,当我尝试推送到remote时,它会说:
提示:更新被拒绝,因为当前分支的提示在提示后面:它的远程副本。集成远程更改(例如,提示:'git pull ...')然后再推一把。提示:有关详细信息,请参阅“git push --help”中的“关于快速前进的说明”。
然后,当我使用git pull时,它会将我的更改恢复为原始提交的更改(删除的部分会重新出现)。我该如何解决这个问题?
发布于 2019-06-06 16:41:55
正如joran所提到的,您的上游与您修改后的本地已经失去了同步。如果你打算使用force
,我建议你使用--force-with-lease
,因为它只在上游没有人提交的情况下强制推送。
这节省了你改写同事工作的时间,因为它只会强制替换你的工作。
不过,总的来说,我认为最好再分支一次。
git checkout -b "my-feature-branch-fix"
git push -u origin my-feature-branch-fix
完成此操作并将其合并后,请返回并删除旧分支
git branch -D branch_name
这需要更长的时间,但更安全,因为你保留了两个副本,直到所有东西合并,并且你的git历史记录更准确地反映了实际发生的事情。
发布于 2019-06-06 09:57:26
当您修改推送的提交时,您通过用新的提交替换旧的提交来重写本地历史,也就是说,新的提交将具有与旧提交相同的父项。
之前:
x---x---P---O <--- master, origin/master
修正后:
x---x---P---A <--- master
\
+-O <--- origin/master
当把这个状态推到原点时,git检测到你的(本地)分支比远程repo晚一个提交,旧的提交,然后中止。
要重写远程存储库上的历史,您需要强制推送回源
git push --force origin
推送后--force:
x---x---P---A <--- master, origin/master
现在,您所要做的就是处理已经退出旧提交的队友。
这一部分可能不完整,但在某些情况下已经足够了。那些没有任何本地提交的用户可以获取并将其本地master
分支重置为新的origin/master
git fetch
git checkout master
git reset --hard origin/master
任何有任何本地更改的人,基于旧的提交,都可以在获取和重置之前隐藏或提交到本地分支(可以从中挑选本地提交的临时分支)。
https://stackoverflow.com/questions/56469376
复制相似问题