我从Github(提交#5)中提取代码并进行了处理,但与此同时,其他人将#6和#7提交到了Github。我们决定只考虑我的工作,这意味着我们不再需要提交#6和#7了。
如何从Github中删除提交#6和#7的推送?
答案 0 :(得分:0)
假设:
master
origin
origin/master
指向#7 然后以下内容适合您:
git push --force origin origin/master^^:master
--force
:默认情况下,git push
只允许提前分支 - 新提交必须是旧提交的后代。但是,--force
让您覆盖此安全检查。它允许您强制分支指向您想要的任何提交,即使它在拓扑上与分支当前指向的位置无关。
警告:如果您需要--force
,则表示您正在重写历史记录。重写历史可能会导致各种问题。在重写历史记录之前,请确保您和您的队友牢牢掌握Git的工作原理,并告诉每个人您将要重写历史记录。如果你不这样做,你将会遇到比git revert
造成的不愉快更糟糕的后果。
origin
:您要修改的远程存储库的名称origin/master^^:master
:这称为 refspec 。冒号右侧的部分(master
)是您尝试更新的远程存储库中的分支的名称。冒号左侧的部分(origin/master^^
)标识您希望远程分支指向的提交。所以在这种情况下,你告诉Git你希望origin
的{{1}}分支指向master
指向本地存储库的同一个提交。 origin/master^^
之后的^^
表示“第一个父亲的第一个父亲”,因此origin/master
指的是origin/master^^
指向的提交的祖父母。鉴于origin/master
指向提交#7,origin/master
应该引用提交#5。或者,您只需使用提交#5的SHA1标识符。从技术上讲,这不会从远程存储库中删除提交。如果没有对存储库的文件系统级访问权限,则无法删除提交(即,您作为系统管理员在GitHub中使用)。但它具有相同的效果:远程存储库中没有任何东西直接或间接地引用提交,因此它们只是坐在那里无法访问,浪费空间直到Git决定是时候垃圾收集它们。
答案 1 :(得分:0)
如果您不想冒险运行复杂的git语句,那么请求那些推动不需要的提交的人运行以下代码:
git reset --hard HEAD^
(那个提交#7的人应该先跑了),再次
git reset --hard HEAD^
(那个提交#6的人应该继续下去)。
现在,您尝试提取代码,然后提交本地更改并推送到git。
这可能很傻......