Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有任何方法可以撤销git push-f?_Git - Fatal编程技术网

是否有任何方法可以撤销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}
    等将允许您进一步返回。)
  • 类似地,
    remotes/origin/branchname@{1}
    将是远程服务器上ref的优先值。只有在其他人没有按下遥控器时才有效。(以上关于
    @{n}
    的观点相同。)
检查你的身份证是否正确 如果您想确认从上述方法之一获取的ID是否正确,只需查看:

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