是否有任何方法可以撤销git push-f?
如果我使用是否有任何方法可以撤销git push-f?,git,Git,如果我使用push-f在远程存储库上重叠最后一次提交,即A,而其他人在我推之前已经拉了A 无论如何,为了不给别人带来麻烦,要撤销它吗 将-f原始文件推到“假装未触及任何内容”是否有用 或 git如何决定本地回购是否偏离远程跟踪回购 有几种方法可以在推之前找到原始头部(原始头部可能不是其中之一): 终端回滚 如果幸运的是终端仍然打开,则在进行推送时会有一些输出,如下所示: ... To user@host:repo.git + abcdef0...1234567 HEAD -> branc
push-f
在远程存储库上重叠最后一次提交,即A,而其他人在我推之前已经拉了A
无论如何,为了不给别人带来麻烦,要撤销它吗
将-f
原始文件推到“假装未触及任何内容”是否有用
或
git如何决定本地回购是否偏离远程跟踪回购 有几种方法可以在推之前找到原始头部(原始头部可能不是其中之一): 终端回滚 如果幸运的是终端仍然打开,则在进行推送时会有一些输出,如下所示:
...
To user@host:repo.git
+ abcdef0...1234567 HEAD -> branchname (forced update)
这里,abcdef0
是以前的头(你的A
),而1234567
是你强迫它成为的
git reflog
git reflog
的输出将按时间顺序告诉您所做的事情。您基本上希望返回到有问题的行(在更改之前您已经签出了分支),并从第一列获取提交ID
这里最有用的命令是git reflog show remotes/origin/branchname
。这应该将强制更新(1234567
)和上一个提交ID(abcdef0
)显示为前两行
先前参考
这里有几个提交引用可能很有用:
(或{1}
,如果您不在该分支上)是该引用的先前值。只有在您没有向本地分支机构进行任何其他提交的情况下才有效。(但是,分支名称{1}
,{2}
等将允许您进一步返回。){3}
- 类似地,
将是远程服务器上ref的优先值。只有在其他人没有按下遥控器时才有效。(以上关于remotes/origin/branchname@{1}
的观点相同。)@{n}
git checkout abcdef0
看看周围。如果git日志
看起来很熟悉(我也建议您浏览存储库,您甚至可以运行tig abcdef0
查看给定提交的日志),那么您可以确信您正在重置到正确的位置
重置到以前的状态
拥有上一个提交ID后,可以重置为该ID并再次强制推送:
git checkout branchname # if you're not on it already
git reset --hard abcdef0
git push -f
或者只是:
git push -f origin abcdef0:branchname
这将使分支的状态恢复到强制推之前的状态。(请注意:第一个代码段将更新本地分支和远程分支;第二个代码段仅更新远程分支。)
影响是什么?
如果自您强制推送之后,人们已经拉了分支,如果您要强制推送回到原始分支,那么在后续更新时,他们将遇到问题。如果他们没有对该分支进行任何提交,他们可以删除本地分支并重新签出(在git fetch
之后,以确保他们有最新的引用),或者执行以下操作:
git fetch
git checkout branchname # if you're not on it already
git reset --hard origin/branchname
如果他们进行了本地提交,那么他们需要将这些更改重新定位到正确的历史记录上(并可能解决任何冲突):
上面的意思是“在
1234567
(不正确的头)之后,在origin/branchname
(正确的头)之上重放所有提交。”a。gittributes
文件将允许您说出哪些文件/目录由您的本地用户保存在mergeCbuckley上,该文件已经完美地解释了如何返回。剩下的问题是你是否应该这样做。其他人是否已经取消了您新推出的状态?如果是这样的话,恢复到原来的状态可能只会造成与您现在相同的情况。这节省了我几个小时的时间。干杯,真棒!谢谢
git fetch
git checkout branchname # if you're not on it already
git rebase --onto origin/branchname 1234567