Git 工作流程用本地提交覆盖远程提交

问题描述 投票:0回答:1

我经常遇到这种情况:

  • 只有一个分支,说
    master
  • 最初,本地和远程存储库都是同步的(两者都有相同的提交历史记录)
  • 由于错误,同事在远程服务器上推送了一些提交,即
    C1
    C2
  • 在我的本地存储库中,我也有与
    L1
    L2
    冲突的提交 C1
    C2
    尚未
  • 推送)

目标是“替换”/“覆盖”/“忽略”(我真的不知道这里正确的 git 术语)我的远程提交。换句话说,存储库的实际内容应该只是

L1
L2
,因为其他提交不存在。

我不能要求恢复同事推送的最后提交。 通常我会进行标准合并,手动接受本地更改,但如果他更改了很多内容,这可能会很乏味。

有没有更快的方法来达到相同的结果?

git
1个回答
0
投票

如果我理解正确的话,你有这个:

remote
A - B - C1 - C2 [master]

local
A - B - L1 - L2 [master]

您希望遥控器与您的本地遥控器相匹配。

remote
A - B - L1 - L2 [master]

local
A - B - L1 - L2 [master]

C1和C2将完全消失。

您可以执行

git push --force
使远程主机与您本地的主机相匹配。

但是,在强力推动之后,拉动 C1 和 C2 的所有其他人以及您的同事都会处于这种情况。

remote
A - B - L1 - L2 [master]

local
A - B - C1 - C2 - L3 - L4 [master]

L3 - L4 是他们自己在 C1 - C2 之上的本地提交。如果他们试图推动,就会失败。

git status
会告诉他们他们与遥控器“分歧”,他们的历史记录不再匹配。

要解决这个问题,人们应该

git pull --rebase
。这将在远程主机上重播他们的本地提交。如果他们在 C1 - C2 之上进行工作,这可能会导致冲突。

$ git pull --rebase

remote
A - B - L1 - L2 [master]

local
A - B - L1 - L2 - L3 - L4 [master]

git pull --rebase
应该是您的默认值。我建议将
pull.rebase
设置为
true
merges
,这样
git pull
将默认变基。这避免了不必要的“更新”合并,并解决了这些分歧问题。


大多数项目通过不允许任何人推送到主分支来避免这个问题,甚至是老板......尤其是老板。所有工作必须在分支机构完成。分支机构必须通过自动检查和同行评审才能合并。这是功能分支工作流程。它确保您的主分支仍然是更多工作的高质量基础,并避免类似的错误。

大多数 Git 服务都提供此功能以及更多功能。例如,Github 的关于受保护分支

© www.soinside.com 2019 - 2024. All rights reserved.