用户 A 开发完一个 feature1 后打算合并到主分支然后 push 到远程。
git checkout master
git pull --rebase
这时候发现没有需要更新的内容。打算对 feature1 进行合并。
可就在用户 A 合并的这个过程中,用户 B 提交了一个 commit 并 push 到远程。
在这之后,用户 A 完成了 feature1 的合并。
然后发现 push 不上去。(因为就在合并的这个过程中,用户 B 提交了新东西到 origin/master )
于是用户 A 使用git pull --rebase
打算更新后再 push。
但是发现这个时候合并的那次 commit 不见了。
好了,下面是问题:
1.为什么最后一次git pull --rebase
的结果不会保留 Merge branch 'feature1'的那次提交呢?
(也就是这样)
2.难道这种情况下我只有 git pull 生成一个新节点(我不愿意看到的),还有什么其他好的方法解决这种情况吗?
注:请仅仅考虑这种工作方式的解决方案
1
woodensail 2019-11-26 15:05:46 +08:00
看你的结果,理论上应该是第一次的 merge 结果直接被废弃了。我怀疑是发现 push 不上去时,直接把本地 master reset 到了远端的 master。也就是第二张图的样子,然后再执行了一次 rebase 把 feature1 rebase 过来了
|
2
woodensail 2019-11-26 15:08:50 +08:00
其实本身 merge 一个分支后再去做 rebase 很容易冲突的,然后就是一锅粥。所以我发现 merge 后 push 失败,也是倾向于 reset 后重新 merge。而不是直接 rebase
|
3
ryougifujino OP @woodensail #2 重新 reset 确实是一个方法,理论上来说 push 不上去就 reset,然后 pull 主分支再 merge feature,如果还是 push 不上去就再重复这一过程总会提上去。
|
4
woodensail 2019-11-26 15:34:45 +08:00
@ryougifujino 嗯,刚刚有个小项目偷懒,merge 之后发现有更新,然后做了 rebase,结果出现了和你一样的结果,merge 丢失……
很是神奇,不知道发生了什么…… |
5
LuckyBoyGirl 2019-11-26 15:39:07 +08:00 1
直接对比那次 commit 的代码,compare branch 然后再 push
|
6
maichael 2019-11-26 15:41:58 +08:00
这不就是因为 rebase 么。如果你要保留 merge 的 commit,用 rebase 干嘛。
|
7
jeffh 2019-11-26 16:10:42 +08:00
其实并没有丢失,只是变成游离态,没 branch 指针后界面就不显示了。原来 merge 提交的节点你可以 reflog 看下 commitId,然后在 checkout 到该 id 上,打上一个分支指针,这个时候就能看到了。
|
8
bertonzh 2019-11-26 16:16:25 +08:00
reset 到合并前,pull --rebase,merge,push
|
9
momocraft 2019-11-26 16:19:20 +08:00
pull 包括 rebase / merge 的时候过于“自动”。
我现在几乎不用 pull,每次 git merge && git rebase origin/SOME_BRANCH |
10
momocraft 2019-11-26 16:19:35 +08:00
#9: 应为 git fetch && git rebase
|
11
jeffh 2019-11-26 16:31:47 +08:00
接#7,复现了楼主的场景,git reflog => git checkout => git branch the-merged-branch 之后如图,merge 节点还是在的。
发布了图,图片地址 base64: aHR0cHM6Ly9pLmxvbGkubmV0LzIwMTkvMTEvMjYvVldHaTZrM1h2c0FJQlJ4LnBuZw== |
12
SoloCompany 2019-11-29 02:46:43 +08:00 via iPad
希望保留 merge commit 应该使用 git rebase -m
并且不能使用 -i RTFM |