在Git中硬重置之后,是否有方法截断分支,使其不';不反映快进?

在Git中硬重置之后,是否有方法截断分支,使其不';不反映快进?,git,version-control,Git,Version Control,在我的主要分支上,我提交了一些代码。我需要回滚我的代码2提交。为了做到这一点,我做了一个 git reset --hard HEAD~2 我认为这将截断在当前HEAD设置之后完成的任何提交,但是状态反映出我有2个提交,我应该快进 Your branch is behind 'origin/release-DECEMBER-2019' by 2 commits, and can be fast-forwarded. (use "git pull" to update your local bra

在我的主要分支上,我提交了一些代码。我需要回滚我的代码2提交。为了做到这一点,我做了一个

git reset --hard HEAD~2
我认为这将截断在当前HEAD设置之后完成的任何提交,但是状态反映出我有2个提交,我应该快进

Your branch is behind 'origin/release-DECEMBER-2019' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)

我如何截断它,使我不再“落后于2次提交”。总而言之,我希望倒带2个提交,从那里重新开始。我希望这是清楚的。问题是,在我“倒带”或重置之后——硬GIT反映出我应该做一个拉动以赶上进度。

如果您熟悉重定基址(重写历史)的危害,您可以做一个
GIT推送-f origin release-2019年12月
。这将强制将分支的新版本推送到源


*如果有人使用过您的分支,请不要这样做。可能/将导致冲突。

您在这里需要非常小心

重定基址将重写分支的历史记录。如果许多开发人员使用同一分支,这将导致问题

我现在要做的是:

  • 从远程拖动(基本上,撤消硬重基命令)
现在回到了执行硬重基命令之前的问题

要撤消最后两次提交,请执行以下操作:

1-转到远程分支并恢复提交(不重置!)

无论您使用的是什么服务器(Github、Azure等等),在任何提交旁边都应该有一个按钮,上面写着“恢复”。恢复提交将创建一个新的提交,它与原始提交的工作相反。这基本上是撤消原始提交

2-将远程拉到本地以查看恢复提交

意味着,远程主机现在将有两个新提交(两个原始提交的还原)。现在,您的本地服务器比远程服务器落后两倍,当您拉动时,您将同步,当您查看代码时,您将发现原始提交的工作已撤消

现在,使用该分支的任何人都将有两个额外的提交,而不是需要拉入的提交。这样,您的原始工作将在所有和任何开发人员的机器上撤消。

TL;博士 您需要强制推送,
gitpush--force origin branch
。关于这一点有很多警告,归结起来就是:不要在没有先告诉其他用户该名称的情况下强制推送。如果没有其他用户,就没有其他人可以告诉你,你可以随时强制推送

长的 每个Git存储库都有自己的分支。这里有两个存储库:您的存储库和您当前的分支(我假定它的名称为
release-DECEMBER-2019
),以及他们的存储库和分支(我假定这一个的名称相同)

您的Git存储库使用您的远程跟踪名称来记住它们的(
origin
)分支,例如
origin/release-DECEMBER-2019

请记住,Git提交哈希ID是通用的,您的Git和他们的Git对共享的提交使用相同的哈希ID,但分支名称是独立的。因此,在这里,我们使用单个大写字母来表示提交哈希ID,“字母”在两个Git存储库中的含义相同

让我们现在就画出他们的Git存储库中的内容:

...--F--G--H--I--J   <-- release-DECEMBER-2019
此处的
(HEAD)
符号显示Git的HEAD连接到名为
release-DECEMBER-2019
的分支的位置。此分支名称和您的
origin/release-DECEMBER-2019
名称都指向现有的提交
J

现在运行的是
git reset--hard HEAD~2
。您的Git计算从commit
J
返回到commit
H
的两个第一父级步骤,并移动名称
release-DECEMBER-2019
指向commit
H
(同时重置索引和工作树以包含commit
H
中的文件):

这会向他们发送任何新的提交(无),然后向他们发送一个强制命令:将您的
版本-2019年12月
设置为指向提交
H
!假设他们服从,1您的Git会看到他们的Git已将其2019年12月发布的
更改为指向
H
,并相应地更新您的
origin/release-2019年12月发布的

...--F--G--H   <-- release-DECEMBER-2019 (HEAD), origin/release-DECEMBER-2019
            \
             I--J   [abandoned]

…--F--G--H这意味着远程设备上有6个本地没有的提交-如果需要,则需要拉,如果不需要,则需要强制推。值得注意的是,这里使用
truncate
有点奇怪-通常
truncate
用于表示删除旧的和不需要的提交-而不是直接影响头部的最新提交。请更新问题以表明您的意图。这里可能有问题。您删除的这两个提交是否已推送到存储库,是否还有其他人使用此分支?感谢您的快速响应。事实上,我想扔掉那些快进的东西。我希望删除已提交的更改,并从我重置到的位置开始。从何处放弃?请更新问题以表明您的意图。我更新了问题。没有其他人使用此分支。我上次提交是作为合并完成的。似乎我无法恢复到合并点。@Dale:你可以恢复合并,需要一些努力,但在你的情况下——双方都是私人分支——你真的不想:这会给你自己留下一个定时炸弹。是的。我同意。现在比以后好。
...--F--G--H   <-- release-DECEMBER-2019 (HEAD)
            \
             I--J   <-- origin/release-DECEMBER-2019
git push --force origin release-DECEMBER-2019
...--F--G--H   <-- release-DECEMBER-2019 (HEAD), origin/release-DECEMBER-2019
            \
             I--J   [abandoned]