我经常遇到这种情况:
master
C1
和 C2
L1
和 L2
冲突的提交 C1
和
C2
(尚未
目标是“替换”/“覆盖”/“忽略”(我真的不知道这里正确的 git 术语)我的远程提交。换句话说,存储库的实际内容应该只是
L1
和 L2
,因为其他提交不存在。
我不能要求恢复同事推送的最后提交。 通常我会进行标准合并,手动接受本地更改,但如果他更改了很多内容,这可能会很乏味。
有没有更快的方法来达到相同的结果?
如果我理解正确的话,你有这个:
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 的关于受保护分支。