关于git强制推送

Regarding git force push

我将一个存储库克隆到我的本地 machine.Then,我使用 git checkout -b dev/abc/test1 创建了一个新分支(从当前的 master )。我是唯一在这个分支工作的人。我在这个分支上工作了几个小时,然后提交并做了 git push 并创建了一个拉取请求。审阅者对此拉取请求发表了一些评论。

在开始处理这些评论之前,我做了,git checkout master,然后,git pull 更新了 master 分支。后来,我想将这些更改(自从我上次更新以来 master 中有很多更改)合并到我的分支 dev/abc/test1.

因此,我做到了git checkout dev/abc/test1。然后我做了 git reset --hard origin/master 然后 git merge origin/master。因此,我从该分支所做的所有更改都按预期丢失了。我手动复制粘贴了我从拉取请求中所做的更改。现在我开始处理那些评论者的评论并修复所有这些评论,做了 git commit 然后 git push 但只看到消息

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart.

为了避免这种情况,我继续 git push --force

这会有什么负面影响吗?我看到其中一条评论说 Cannot push to GitHub - keeps saying need merge 'forcing' is most of the time, if not always, the wrong answer。我的方法是否会以任何负面方式影响存储库? (作为旁注,我是该分支的唯一个人贡献者 dev/abc/test1

在这种情况下,您正在重写 dev/abc/test1 分支的历史记录。只要没有其他人在使用这个分支就应该没问题。

我会建议以下工作流程,这意味着您下次不需要强制推送。

git checkout --branch dev/abc/test1
git checkout master
git pull
git checkout dev/abc/test1
git merge master
## Resolve merge conflicts
git commit
git push

这会产生相同的结果,但不会重写历史记录。

如果您处于 GitHub 拉取请求审核过程中,则强制推送是可以接受的。这样做会自动更新您的拉取请求,GitHub 会检测到更改的内容。

审查过程的另一个常见工作流程是 添加 处理反馈的提交。所以你可以直接推动它们(不用力)。最后,通常由负责合并的人来压缩这些提交,这样在您的初始 PR 之上进行的单个修复就不会单独出现。

强制推送通常是不受欢迎的,因为它通常意味着你正在重写历史(rebase 所做的事情)。发布重写的历史是扰乱你所有团队成员的好方法,所以你真的应该不惜一切代价避免这种情况。然而,拉取请求始终被认为处于流动状态(通常需要重新设置基础以匹配基础分支上正在进行的开发),因此人们不太可能期望它具有一致的历史记录。

当您执行 git push --force 时,您强行覆盖了远程 dev/abc/test1 分支。这意味着之前的远程分支可能会被永久删除。你的情况应该没有副作用,因为你是唯一一个使用分支的人。强制推送通常不好的原因是因为通常远程分支一次由多个开发人员共享。当您重写远程分支的历史记录时,您可能会对共享该分支的任何其他人造成严重破坏。当其他人转到 git pull 时,他们将看到一个新的历史记录。

请注意,也许具有讽刺意味的是,您所做的最好的事情就是将 dev/abc/test1 的本地副本替换为远程分支。因此,您可以通过以下方式对 dev/abc/test1 跟踪分支进行硬重置,而不是对 master 进行硬重置:

git reset --hard origin/dev/abc/test1

这会撤消您在本地所做的任何操作,这可能会提示您重置为 master