本地分支领先远程分支,应该怎么正确去操作?要先 pull 还是直接 push --force?

2022-08-09 10:34:33 +08:00
 magic3584

由于昨天码云宕机,今天要提交代码。

刚才进行了如下操作:

  1. 如果直接 pull merge 的话提示没有冲突
  2. 使用 pull --rebase 以后有冲突,但是发现前两天的本地提交都没了。。。这种时候还能找回吗?

这两天遇到好几个非正常的 git 问题,都蒙了

7057 次点击
所在节点    git
84 条回复
Slurp
2022-08-09 13:57:12 +08:00
> where gupav
gupav: aliased to git pull --rebase --autostash -v
gengchun
2022-08-09 14:40:51 +08:00
对远程分支进行 `git push --force` 是一定要沟通过的。沟通不是说在 v 站上发贴。

比较保守和简单的操作其实是选一个基准,在本地新建一个分支出来。然后把本地修改过分支和远程分支需要的 commits 都用 cherry-pick 挑出来。

OP 另一个找回的需求,如果 rebase 已经完成,也可以用 `git reflog` 。

这种略看一下介绍 git 实现文章,就能自己处理的。
daimubai
2022-08-09 14:46:44 +08:00
所以说能别用 rebase 就别用 rebase 。要用的话记住一定不要在分支在远端存在的情况下 rebase 。一定不要去 rebase 公共分支
magic3584
2022-08-09 15:37:47 +08:00
@nothingistrue #19
「远程分支回滚后的那个 Head ,它之后的(在回滚前)所有提交,不管是本地的还是远程的,都被搞废了」
远程的被破坏我能理解,为什么说本地的也被破坏了呢?

「你现在本地仓库上的远程仓库引用 origin/master 跟真是的远程仓库 master 分支可能都不一样」
仓库地址我没有改过,为什么 还能不一样呢?

请大佬解惑
magic3584
2022-08-09 15:39:14 +08:00
@daimubai #23
以前公共分支拉的时候都 rebase 成一条直线了,这次弄了以后不敢 rebase 了,可是 merge 的话也太乱了吧
DeWjjj
2022-08-09 15:39:22 +08:00
Main(主),beta(测), Debug(紧急)。
主叉永远只在测试之后合并,所有人都在 beta 上面拉分叉,debug 叉跟着 main 走。、
各自叉自己 ID 在 beta 上面的叉,各自开发延申,完结了一起合并审查代码。
magic3584
2022-08-09 15:41:34 +08:00
@DeWjjj #26
我们现在是 dev ,每个人都从 dev 拉分支最后再合过去。
DeWjjj
2022-08-09 15:48:52 +08:00
pull 是拉线上分支之后再 merge ,当然会丢掉你先前的东西。
FACEB00K
2022-08-09 16:01:56 +08:00
@magic3584 解决完冲突后你们有没有 git rebase --continue ,让 rebase 继续走完呢
daolanfler
2022-08-09 16:05:29 +08:00
git pull --rebase ,发现 commit 没了,不要着急,git reflogs 看一下,一般能恢复的。
libook
2022-08-09 16:06:57 +08:00
个人认为,merge 记录也是有价值的记录,对于版本控制系统来说,为了“整洁”而放弃一些版本记录是本末倒置。

实在想用 rebase 来整理提交记录也是可以的,但最好在所要整理的 commit 被 push 之前。

万不得已要用 push --force 必须召集 repo 的所有使用者协商一致。
DeWjjj
2022-08-09 16:11:56 +08:00
你试试 git fetch 之后直接 rebase ,不报错就是 bug 。
xFrye
2022-08-09 16:19:53 +08:00
git pull --rebase origin xxxx ,然后看有没有冲突,有的话解决了就 git add xxx && git rebase --continue ,一步步地去把冲突解决掉
nothingistrue
2022-08-09 17:22:00 +08:00
@magic3584 #24 假如远程 master 的 提交顺序是 a,b,c,d,e,f,g ,被回滚到了 d ,变成了 a,b,c,d,e,f,g 。这时候 d 之后的提交 e,f,g 就都丢失了。然后丢失的不光是这些,因为这个 e,f,g 在做过 pull 的所有人的本地还是存在的,这时候这些人本地上的 master 分支,跟远程的 master 分支,是混淆的。

实际上中央服务器被回滚,相当于有人做了 push --force ,是特么相当操蛋的行为。这时候要是有人正好在服务器出问题前做过 pull 还好,他那里再做一次 push --force 就能恢复过来。但要是没有这种正好情况,那么在 d 这个提交时间点之后的所有提交,不管是本地还是中央仓库,不管有没有推送过,都成了离线的提交,需要手动处理才能搞回去。
magic3584
2022-08-09 17:23:11 +08:00
@FACEB00K #29
他们当时应该是已经 continue 了,找我去看的时候已经有 rebase 的 commit 了
magic3584
2022-08-09 17:25:43 +08:00
@nothingistrue #34
所以说远程分支落后本地的话,直接拿本地的代码 push --force 就行了吗?然后别的人再 pull 后解决自己的冲突再 push 就可以了?
xiaoming1992
2022-08-09 17:32:45 +08:00
@magic3584 不是,我的意思是,如果你本地 commit 不重要的话,直接把本地有分歧的 commit 都 soft reset 掉,然后再 rebase ,应该就没有冲突了(因为你说你 merge 的时候是没冲突的
nothingistrue
2022-08-09 17:34:12 +08:00
@magic3584 你这一块,我建议不要自己搞了,搞不定的,还是先找别人帮你处理了。后面有时间了花上半个月去看看 https://git-scm.com/book/zh/v2 ,git 才能入门。
nothingistrue
2022-08-09 17:36:53 +08:00
@magic3584 #36 不是直接 push --force ,是先要确定那个人本地的仓库跟回滚前服务器上仓库是同步过的,才能让那个人 push --force 以覆盖的方式恢复服务器上已经被破坏的仓库。
magic3584
2022-08-09 18:14:20 +08:00
@xiaoming1992 #37
是,我搞不清楚为啥 pull merge 没冲突 pull rebase 有

@nothingistrue #39
最后是找的本地最新的人把代码推上去的,有没有先拉再推,有没有强制推,他们现在也不记得了。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871607

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX