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

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

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

刚才进行了如下操作:

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

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

7423 次点击
所在节点    git
84 条回复
tromoli
2022-08-09 18:21:25 +08:00
rebase 有冲突应该就是远端分支对应你本地分支检出的时候已经发生了改变,rebase 会从你本地分支检出远程的地方开始检查,之后本地提交修改的地方都会提示冲突,这时候应该在一个分离的 head 上,中断 rebase 本地提交就回来了啊,至少我以前是遇到过类似的 rebase 冲突的情况的
bjzhou1990
2022-08-09 18:29:08 +08:00
默认情况下 git server 不是应该会禁止 force push 吗
bef0rewind
2022-08-09 18:43:25 +08:00
@magic3584 你的提交是不是有多个 commits ?如果 merge 的话是用最后一个 commit 去 merge ,rebase 的话从最早的一个 commit 开始 rebase 。所以冲突结果可能不一样。

另外可以使用:fetch -> rebase -> push 的流程,远端禁止 force push 。
magic3584
2022-08-09 18:44:14 +08:00
@tromoli #41
他们是解决冲突完了已经并且 commit 了
cansiny0320
2022-08-09 18:47:49 +08:00
git pull --rebase
magic3584
2022-08-09 18:47:55 +08:00
@bef0rewind #43
「如果 merge 的话是用最后一个 commit 去 merge ,rebase 的话从最早的一个 commit 开始 rebase 。所以冲突结果可能不一样。」
那我大概知道为啥 merge 没冲突但是 rebase 有冲突了。

我平常都是 pull rebase ,没怎么用过 fetch
magic3584
2022-08-09 18:48:48 +08:00
@cansiny0320 #45
今天就是这么搞的,然后本地的 commit 好像丢了(他们说本来要推 20+ 的 commit 都没了
bef0rewind
2022-08-09 18:51:51 +08:00
@magic3584 fetch 的话是只同步远端,并不尝试合并本地的 commits 。这样更加安全一些。总之不能 force 。
magic3584
2022-08-09 18:55:07 +08:00
@bef0rewind #48
要不是这事故,一般也不会碰到远端分支回滚
cansiny0320
2022-08-09 18:58:11 +08:00
@magic3584 可以先 git stash 然后 git pull --rebase 最后 git stash pop
iulo
2022-08-09 19:08:36 +08:00
是不是你之前这个 20+commit 已经是之前 push 过的了?如果是,大概率是前一个人解决冲突的时候在相同的代码位置选择使用了他的代码(旧的),对于 git 来说这块代码 head 已经是最新的了,即使你本地(新的)和远程的不一致,git 也会认为远程的是最新的
fds
2022-08-09 19:53:45 +08:00
`git pull --rebase` 如果有冲突,可能会卡在 rebase 中,需要手动处理完冲突然后`git rebase --continue`继续处理下一个提交。
merge 没冲突而 rebase 有冲突很好理解,因为 merge 是把改动直接放回分支,生成一个新提交,而 rebase 是需要先把分支上的改动合并,然后再把本地修改 apply 上,分支上的改动可能引起本地修改不正确了,需要手动调整本地修改。
如果本地 git 搞乱了,可以用 git reflog 命令检查本地操作历史,一般可以找回所有 commit 。
JounQin
2022-08-09 21:55:57 +08:00
原来这么多人不会 rebase
dfkjgklfdjg
2022-08-09 22:03:11 +08:00
我发现一个疑问就是为啥都那么喜欢用 rebase ?多一个 merge 又能咋样....
qianxi0410
2022-08-09 22:13:07 +08:00
rebase 主要是保持分支的的线性,不是多一个提交这么简单。
qianxi0410
2022-08-09 22:14:23 +08:00
少。。
levelworm
2022-08-09 22:16:19 +08:00
@magic3584 8
rebase 我记得是把别人放在主分支的东西合并进来?可能你俩修改了同一个文件?我是小白瞎猜的
Anarchy
2022-08-09 23:28:02 +08:00
git pull --rebase 本地代码没了应该是你代码冲突了,然后进入解决冲突流程你没注意(然后就停在第一个解决冲突的本地 commit 那里了)。可以考虑直接 git rebase --abort,不行 git reflog 看历史找下最新本地 commit 的提交然后 reset --hard 回去重新搞。
不知道你本地写了多少个提交,rebase 解冲突比较烦,要把本地 commit 从开始冲突的提交起一个接一个都处理了。
zyxyz123
2022-08-09 23:51:51 +08:00
丢东西的时候 git reflog 就行了
FerrisChan
2022-08-10 00:18:32 +08:00
rebase 是把你的 dev 本地修改变基到远程的 dev 分支上,不会导致代码丢失的。如果是新文件不可能,旧文件修改的话,应该是 OP 解决冲突出问题了。
一般我建议在 dev 上更新代码也是用 rebase ,避免产生一个无谓的 merge commit 。
当然,操作都可以用 reflog 找回来

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

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

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

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

© 2021 V2EX