在进行分支合并时,我应该怎么做才能避免丢失 Git 的提交?
What should I do to avoid losing commits with Git when doing a branch merge?
我最近与使用 GitHub Enterprise 的开发团队合作。
我在一个分支上工作了几个小时,让我们称之为 origin/feature1
,并做了几个我有效推动的提交。与此同时,一位同事正在进行从 origin/master
到 origin/feature1
的合并。当他完成合并时,似乎我最近的几个提交现在丢失了,因为我在注意到问题之前就拉了,所以我也在本地丢失了它们。
问题:
是否有可能实际上丢失被推送的提交,或者 一切 都可以恢复(即使这意味着 运行 很多神秘的命令)?
如果是,是否意味着 Git 不知何故……坏了?我的意思是,作为 SVN 的快乐用户,我从未丢失过任何与 SVN 相关的工作。顺便说一下,2013 年的 TFS 也没有。
合并的时候我在场。执行合并的人似乎没有做任何“特别”的事情,也没有执行任何看起来他们可以丢弃一些提交的命令。我不认为这是一个错误(Git 客户端和 GitHub Enterprise 都几乎是最新的)。那么在进行合并时是否有一些不应该指定的特定参数?或者某些特定的合并模式 默认情况下 会导致提交丢失?
从本质上讲,如何避免将来失去半天的工作?
可能您的同事在没有合并您的更改的情况下用 -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
目录,否则它不会丢失。
我最近与使用 GitHub Enterprise 的开发团队合作。
我在一个分支上工作了几个小时,让我们称之为 origin/feature1
,并做了几个我有效推动的提交。与此同时,一位同事正在进行从 origin/master
到 origin/feature1
的合并。当他完成合并时,似乎我最近的几个提交现在丢失了,因为我在注意到问题之前就拉了,所以我也在本地丢失了它们。
问题:
是否有可能实际上丢失被推送的提交,或者 一切 都可以恢复(即使这意味着 运行 很多神秘的命令)?
如果是,是否意味着 Git 不知何故……坏了?我的意思是,作为 SVN 的快乐用户,我从未丢失过任何与 SVN 相关的工作。顺便说一下,2013 年的 TFS 也没有。
合并的时候我在场。执行合并的人似乎没有做任何“特别”的事情,也没有执行任何看起来他们可以丢弃一些提交的命令。我不认为这是一个错误(Git 客户端和 GitHub Enterprise 都几乎是最新的)。那么在进行合并时是否有一些不应该指定的特定参数?或者某些特定的合并模式 默认情况下 会导致提交丢失?
从本质上讲,如何避免将来失去半天的工作?
可能您的同事在没有合并您的更改的情况下用 -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
目录,否则它不会丢失。