Git Time Travel

Nat*_*ner 0 git version-control gitlab

我刚刚有一个有趣的git体验.我是我分支机构中唯一的开发人员my-branch,我最近从我的队友分支机构分支出来:her-branch.我已经成功地将几个提交推送到我的分支机构.但当我去推动我的最后一个分支时,发生了以下情况:

$ git push
To git@url/repo.git
 ! [rejected]      her-branch -> her-branch (non-fast-forward)
error: failed to push some refs to 'git@url/repo.git'
hint: Updates were rejecetd because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes.
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Run Code Online (Sandbox Code Playgroud)

我觉得很奇怪,即使我正在推动my-branch消息说它失败了因为her-branch.我不知道出了什么问题,但我按照消息建议拉了:

$ git pull
Already up-to-date.
Run Code Online (Sandbox Code Playgroud)

我想确认我在我的分店......

$ git checkout my-branch
Already on 'my-branch'
Your branch is up-to-date with 'origin/my-branch'.
Run Code Online (Sandbox Code Playgroud)

所以最后我强迫推.

$ git push -f
Total 0 (delta 0), reused 0 (delta 0)
To git@url/repo.git
+ 9b3232c..d35fe86 her-branch -> her-branch (forced update)
Run Code Online (Sandbox Code Playgroud)

这推动my-branch成功并更新了遥控器.但是,her-branch由于我从她的分支中删除了所有我的队友的承诺,它及时发回.她的历史完全从遥远的地方消失了.

幸运的是,她没有拉,并能够强行推动她的分支恢复她的代码的最新版本,但我很困惑.

你能解释一下这里发生了什么吗?

Jon*_*nah 5

听起来你的git配置push.default设置为matching.这曾经是默认行为,但是您遇到的可能不是大多数git工作流所需的.您可以通过运行检查当前设置git config --get push.default

请参阅https://git-scm.com/docs/git-config

push.default

如果没有明确给出refspec,则定义git push应采取的操作.不同的值非常适合特定的工作流程; 例如,在纯粹的中央工作流程中(即获取源等于推送目标),上游可能就是你想要的.可能的值是:

没有 - 除非明确给出refspec,否则不要推送任何东西(错误输出).这主要是针对那些希望通过始终明确避免错误的人.

current - 推送当前分支以更新接收端具有相同名称的分支.适用于中央和非中央工作流程.

上游 - 将当前分支推回到分支,该分支的更改通常集成到当前分支(称为@ {upstream}).如果您要推送到通常从中拉出的相同存储库(即中央工作流),则此模式才有意义.

简单 - 在集中式工作流程中,像上游一样工作,如果上游分支的名称与本地分支不同,则会增加安全性以拒绝推送.

当推送到与您通常拉出的遥控器不同的遥控器时,请作为当前工作.这是最安全的选择,适合初学者.

此模式已成为Git 2.0中的默认模式.

匹配 - 推送两端具有相同名称的所有分支.这使得您正在推动的存储库记住将被推出的分支集合(例如,如果您总是在那里推送maint和master而没有其他分支,您推送的存储库将具有这两个分支,以及您的本地maint和master将被推到那里).

要有效地使用此模式,您必须确保在运行git push之前准备好推出所有要推出的分支,因为此模式的重点是允许您一次性推送所有分支.如果您通常只在一个分支上完成工作并推出结果,而其他分支未完成,则此模式不适合您.此模式也不适合推入​​共享中央存储库,因为其他人可能会在那里添加新分支,或者更新控制之外的现有分支的提示.

这曾经是默认值,但不是因为Git 2.0(简单是新的默认值).