在进行分支合并时,我应该怎么做才能避免丢失 Git 的提交?

What should I do to avoid losing commits with Git when doing a branch merge?

我最近与使用 GitHub Enterprise 的开发团队合作。

我在一个分支上工作了几个小时,让我们称之为 origin/feature1,并做了几个我有效推动的提交。与此同时,一位同事正在进行从 origin/masterorigin/feature1 的合并。当他完成合并时,似乎我最近的几个提交现在丢失了,因为我在注意到问题之前就拉了,所以我也在本地丢失了它们。

问题:

从本质上讲,如何避免将来失去半天的工作?

可能您的同事在没有合并您的更改的情况下用 -f 推送了他的分支,因此,在该分支上,您的更改得到 "lost"。你总是可以保留你的本地分支,这样你仍然可以用它做一些事情......如果你删除了本地分支,你可以随时检查 reflog 以取回旧的提交。

你如何避免浪费时间?我猜你(不是你,而是你,你的团队)应该学习如何使用他们面前的工具。如果开发者想玩牛仔(为了好玩,或者可能不知道 force-pushing 的后果)......好吧,放轻松。目前,请尝试恢复您的更改。

PS哦...别担心。 个人意见免责声明:经过几轮使用git并了解其工作原理后,您会想知道您是如何通过使用 SVN 这么长时间来完成的。 :-D

同事正在他们的本地存储库中进行合并。 origin/feature1 指的是他们存储库中的远程分支,这与您推送的不同。 git remote update 将进行同步。

我怀疑涉及到一些强制推动,你通常不想这样做。如果您的同事力推到 origin/feature1,那么它会将 feature1 指向的提交更改为远离您的提交。

您的本地存储库可能仍然有您所做的提交;找到它们超出了我的回答范围。

解决方案:

  • 确保在您的 GitHub Enterprise
  • 上禁用强制推送
  • 确保没有人有任何试图强制推送的默认配置
  • 查找您推送的孤立提交;它们应该仍在您的本地存储库中。

如果我们都开始处理 origin/feature1,你先推送一些提交,然后我尝试推送不同的提交,Git 会给我一个类似

的错误
! [rejected]        feature1 -> origin/feature1 (non-fast-forward)
error: failed to push some refs to 'https://your-repo.com'
hint: Updates were rejected 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.

为了正确处理这种情况,我可以 运行 git fetch origin 将您的推送提交到我的本地 git,然后使用 [=] 将您的更改合并到我自己的13=] 或 rebase.

你的情况听起来像是发生了什么(正如其他人所说),你的同事 运行 git push --force 告诉 git 忽略它给出的错误第一次用我的 feature1 b运行ch.

覆盖 origin/feature1

为了避免以后出现这些问题,我建议:

  • 主要致力于自己的功能 b运行ches,不在开发人员之间共享它们
  • 仅当您完全知道自己在做什么时才使用-f--force标志。并确保将该消息传达给您团队的其他成员。可以在 GitHub.
  • 中禁用对 b运行ches 的强制推送

要取回您的更改,您可以 运行 git reflog,查找 "commit" 条目以找到您对该主题所做的最后一次提交,然后 checkout 相应的提交哈希。您的本地 Git 会保留您所做的每一次提交至少 30 天,除非您删除 .git 目录,否则它不会丢失。