惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
A
About on SuperTechFans
D
Docker
腾讯CDC
Google DeepMind News
Google DeepMind News
Hacker News - Newest:
Hacker News - Newest: "LLM"
W
WeLiveSecurity
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Know Your Adversary
Know Your Adversary
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
P
Privacy International News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Application and Cybersecurity Blog
Application and Cybersecurity Blog
aimingoo的专栏
aimingoo的专栏
C
Cyber Attacks, Cyber Crime and Cyber Security
S
Secure Thoughts
Stack Overflow Blog
Stack Overflow Blog
T
Tenable Blog
T
Threatpost
P
Proofpoint News Feed
博客园 - 司徒正美
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic
Apple Machine Learning Research
Apple Machine Learning Research
云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
Hacker News: Ask HN
Hacker News: Ask HN
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Microsoft Azure Blog
Microsoft Azure Blog
F
Fortinet All Blogs
Project Zero
Project Zero
Help Net Security
Help Net Security
WordPress大学
WordPress大学
F
Full Disclosure
博客园 - 三生石上(FineUI控件)
O
OpenAI News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
H
Heimdal Security Blog
Security Latest
Security Latest
T
Tor Project blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cisco Talos Blog
Cisco Talos Blog

git

请教一个诡异的 git 问题 - V2EX 有一个 git 仓库合并问题,不知道怎么办才好 分析一个技巧让同事不知道我使用了 ai : git 忽略本地改动文件,实现不提交 Rebased, 一个 git 客户端 发现一个邪修快速清理 Git 项目里面空文件夹的方法🤡 不知道有没有什么其他标准做法. - V2EX zig 写的 100kb 的 wasm 可以 http 读写任意 git 仓库 - V2EX 有人把 IDEA 的 git 客户端做出来了 问个关于 rebase 和 github pr 的奇怪的问题 - V2EX idea 同款 git 客户端求推荐 - V2EX 有没有类似 JB 家的 Git 管理工具 - V2EX 大家自己的代码都是放在哪儿 - V2EX 分享一个在 Linux 上编译静态 Git 二进制的项目 - V2EX 上亿的 git 仓库如何做冷热存储分离呢 - V2EX 发现了一个极度臃肿的项目 - V2EX 有什么支持直接连接远程主机 git 仓库的 GUI 工具吗 - V2EX KFCode 官网上线,做好用、靠谱、有趣的 Git 托管平台 - V2EX git 工作流,大家现在用的什么样的? - V2EX 很奇怪的一个现象,有没人知道是怎么回事,所有 LLM 都说 100%不会出现 - V2EX 我宣布,最好的 git 客户端是腾讯家的 ugit - V2EX Fork 付费版有什么不同? - V2EX 一位高级工程师的 GIT 需要熟悉到什么程度? - V2EX 已经 push 到远程仓库的提交,如何修改某个用户的所有提交的邮箱啊 - V2EX [求助下] 关于代码同步问题 - V2EX 一直不理解 Windows 下 git 的这个逻辑,我自己 clone 的仓库还不能删了? rm -force 也不行 - V2EX 分享一个 Git 存储库治理利器 - hot - V2EX 代码有没有必要备份到多个远程仓库?比如 github 和 codeup。有必要的话最好怎么备份? - V2EX 请教 git 里怎么删除记录 - V2EX git 中如何将子分支的多个提交作为一个提交合并到主分支? - V2EX git 切换分支问题 - V2EX git 各种命令执行很慢是什么原因导致的? - V2EX 有没有大佬指导一下 git 问题 - V2EX git remotes 分支克隆 - V2EX 两处修改需要分开提交吗? - V2EX 问个 Git 基操:怎么样复制一个文件,能保持历史记录? - V2EX Linux 的 Ubuntu 系统有类似 Sourcetree 或者 fork 这种 git 图形化操作的客户端工具吗 - V2EX 关于刚刚 git 的问题描述的不清楚,不能编辑主题了,重新发下问题: git 如何对比服务器上最新的代码和本地的区别? git diff 对比和我预想不一样 - V2EX git 新手求教: git 如何对比服务器上最新的代码和本地的区别?不是本地远端和本地 working。 svn 可以使用 show log,直接对比,调用 beyond compare 很方便。 - V2EX 对上游提 pr,上游的管理员觉得 pr 里面的功能他不需要或者不满意 - V2EX gitee fork 时继承推送规则是否合理? - V2EX 请教各位关于 Git 合并的问题 - V2EX 请教大家一个测试环境代码合并的问题 - V2EX 推送远程仓库导致本地提交记录消失,如何找回 - V2EX 给上游 pr,自己应该先 pr 到自己的 main 分支吗? - V2EX 请教一个开发流程中 GIT 解决冲突的问题 - V2EX 求教:在 fork 的仓库上添加不太可能被 upstream 接受的修改,是不是应该在新开的 branch 上开发? - V2EX 有哪个 git 的 gui 软件。可以像 idea 的 git 管理那样查看文件历史和代码冲突?现在换到了 cursor,但是这边的代码管理个人用的太不习惯了。 - V2EX git clean 还能找回吗 - V2EX 码云代码自动同步到 github - V2EX 请教大家这样的项目应该要怎么做 git 管理 - V2EX 从本地提交代码到 gitlab 后, diff 异常问题,求大佬解惑 - V2EX 在 Git 中,已知某一个分支的某个 Commit 引入了一个 bug,如何快速确定这个 bug 是经过哪些分支流转到 master 分支的? git rebase 那么重要么??? 如何在 git 提交前将生产版本和开发版本的配置进行区分 开源了个新的版本控制系统 HugeSCM,请 V 友们指导 Git Permission denied 问题求助
求助 git 自动 merge 丢代码 - V2EX
freesun165 · 2024-12-30 · via git

这是一个创建于 531 天前的主题,其中的信息可能已经有所发展或是发生改变。

今天遇到个 git 合并丢代码的场景。 featB->featA->master featA 基于 master 开发,featB 基于 featA 开发。featA 合入 master 后,我直接在 featB 分支上 git merge master ,出了问题。 具体如下 featA 对于 file1 加了 line70 ,featB 对 file1 删了 line70 ,在 featB 上 merge master 后,git 自动 merge 的结果是 line70 依然还在

第 1 条附言  ·  2024 年 12 月 30 日

分析了下,问题就在于 featB 合入 master 时,base 是没有 line70 的,featB 没有 line70 ,master 有 line70 ,理所当然 line70 就被加上去了。

第 2 条附言  ·  2024 年 12 月 31 日


复现在这:
分支 local/A 增加一行
( local/A ) git co -b local/B
( local/A ) git co main
( main ) git merge local/A --squash
( main ) git co local/B
( local/B ) git ci -m 'rm line'
( local/B ) git merge main

刚才删除的一行就又被加上了。
---
这个场景还比较常见,A 分支是某个产品 1.0 功能,B 分支是另外一个人开发 1.1 功能,从 A 分支上切出,同时开发。
A 分支上需要对某个暂不支持的功能加上禁用,B 分支上放开限制。
在 A 分支合入 master 上线后,gitlab 上用的是 squash commits 。B 分支上线前,本地 git merge master 提交远端,远端再合入。

xiaozhu5

1

xiaozhu5      2024 年 12 月 30 日

git reflog 和 git fsck 两个结合看一下应该找到丢失信息

gesse

2

gesse      2024 年 12 月 30 日   ❤️ 1

featA 添加了 line70 ,并合并进了 master ,你在 featA 上 fork 出 featB ,featB 上删除了 line70 后,又把 master 合并进 featB ,这不就是在 featB 上添加了 line70 吗? 一点毛病没有。

mark2025

3

mark2025      2024 年 12 月 30 日   ❤️ 1

为什么要在 featB 上面执行 featB 分支上 git merge master ? 这就是混乱的根源
1. 要么是在 featB 分支上 `git merge featA`
2. 要么是在 featB 分支上 `git rebase master`

netabare

4

netabare      2024 年 12 月 30 日 via Android

所以不要把 master 合入分支,分支上面只用 rebase 。

mark2025

6

mark2025      2024 年 12 月 30 日

@GeruzoniAnsasu 三路合并就是人多嘴杂,你不仔细查看变动就无法确定最终合并结果是否符合预期。所以基于 rebase 的线性合并在团队开发中是最高效的( gitlab 可以设定强制线性合并)

sagaxu

8

sagaxu      2024 年 12 月 30 日

git merge 除非是 fast forward ,在处理多个分支修改同一文件时,不一定符合你的预期。

所以这种情况用 rebase 甚至是 reset --soft ,然后手动处理变更会更好。

GeruzoniAnsasu

9

GeruzoniAnsasu      2024 年 12 月 30 日

@mark2025 人多嘴杂是其次,问题在用好 merge 要制定的规范(比如不允许 pull-merge ,自己的分支不能 merge 别人分支后再 merge 到 main……等等,它一点也不直观。

你搞不清楚需要哪些规范才能保证不发生 A merge B 然后 B merge A 导致代码没了这种问题

mark2025

10

mark2025      2024 年 12 月 30 日

@GeruzoniAnsasu 这是我所有 git 项目钩子自动执行的:

git config --global i18n.commitencoding utf-8
git config --local core.autocrlf input
git config --local core.eol lf

if [ -z "$CI" ]; then
git config --local core.filemode false
git config --local core.hooksPath ./.githooks
git config --local core.ignorecase false
git config --local core.precomposeUnicode true
git config --local fetch.prune true
git config --local pull.rebase true
git config --local push.autoSetupRemote true
git config --local push.followTags true
git config --local rebase.autoStash true
git config --local remote.origin.prune true
git config --local remote.origin.tagopt --tags
git config --local remote.pushdefault origin
git config --local rerere.enabled true
fi;

leonshaw

11

leonshaw      2024 年 12 月 30 日 via Android

base 没有 line70 ,那严格来说 B 并没有基于 A 开发

leonshaw

12

leonshaw      2024 年 12 月 30 日 via Android

B merge master 没有问题,但是不能 merge 没有进 master 的 A

LeeEnzo

13

LeeEnzo      2024 年 12 月 30 日

强制 rebase 和 squash 开发

freesun165

14

freesun165      2024 年 12 月 30 日 via Android

@netabare 话虽如此,但我这个业务场景经常一个分支测一个月以上,一百多个提交,每次 master 更新,我挨个 rebase 下,成本太高了

freesun165

16

freesun165      2024 年 12 月 30 日 via Android

@mark2025 俺这规范就是上线前 featB 需要合并 master 推到远端,远端 master 再合并 featB ,然后就出现了这么不符合知觉的事

rbaloatiw

18

rbaloatiw      2024 年 12 月 30 日

按你的描述感觉不太可能, 你有最小可复现样例吗, 可以发出来看看

coolcoffee

19

coolcoffee      2024 年 12 月 30 日

git 的分支操作应该是像一颗树一样,开叉但是不会互相交叉。 如果平行的节点需要互相同步,那么应该一方往上推到相同的节点,另外一方再去拉,这样就遇到相同修改就必定会产生冲突。

BeautifulSoap

20

BeautifulSoap      2024 年 12 月 30 日 via Android   ❤️ 2

唔嗯?这情况你确定真没冲突吗?

kivmi

21

kivmi      2024 年 12 月 30 日

太危险了,master -> branch , 相当于你对同一行的修改无效啊,各种冲突吧?可以从 master 同时 fork 几个分支?一个为开发分支,一个为上线分支?当需要上线时,合并到上线分支,然后合并到 master ,一直保持上线分支跟 master 保持一致,实现快速上线。貌似 git flow hotfix 也可以做到。

zthxxx

22

zthxxx      2024 年 12 月 30 日

老生常谈话题之「不要把 master/dev 合到自己的分支」,开发时也始终应该像 GitHub / GitLab 那样的「把自己分支合到 master/dev (主干分支)」

leonshaw

23

leonshaw      2024 年 12 月 30 日

@freesun165 #15 这样 base 应该是切出去时的 commit ,不然就是后面这个 commit 被重写掉了,最好画个图看看。

BeautifulSoap

24

BeautifulSoap      2024 年 12 月 31 日

我实际在本地测试了一下

最终结果是 master 合并入 feature b 后的确没报冲突,但被 feature b 删除的 line 也没再次出现

可能 lz 实际给个最小可复现例子比较好

nightwitch

25

nightwitch      2024 年 12 月 31 日

git 只允许 fast-forward 就不容易出现这个问题。
三路合并一定要小心,否则很容易出现冲掉别人的代码 / 别人的代码把自己的冲掉 / 两边的代码合并到了一起导致逻辑不对了。

FrankAdler

26

FrankAdler      2024 年 12 月 31 日

我也遇到过,目前没有头绪,我是 master 拉出来的分支,修改后合并到 dev 分支,cicd 到测试 k8s ,出现过几次代码没有提示冲突,但是丢了几行。

jqtmviyu

27

jqtmviyu      2024 年 12 月 31 日

![]( )

我也是没有复现,main 合并到 B 没有冲突, 此时 B 比 A 和 main 领先一次提交,合并没有变化,删除的行也不会回来。

jqtmviyu

28

jqtmviyu      2024 年 12 月 31 日

@jqtmviyu #27 我是设置了

```~/.gitconfig

[merge]
ff = false
[pull]
rebase = true
```

networm

30

networm      2024 年 12 月 31 日

@freesun165 #14 使用 Fork 的 Leaning Branch 功能进行同步,只需要一键就可以自动同步。

另外推荐看下:
Git 精干分支 - 狂飙
https://networm.me/2022/09/11/git-lean-branching/

合并分支只会通过合并提交引入最终的修改,而不是合并分支中的原始提交。
因为合并提交也是提交,但是大家潜意识都不会关注合并提交的改动,因此可能会在冲突解决中引入大量的错误的修改。
如果一个东西容易引起错误,那么建议减少这个东西的使用,使用 Lean Branching 方案就可以。
在与主干同步的时候,相当于检出到主干新建分支,将原有分支上的东西 cherry-pick 到新分支,因此需要逐个解决冲突。
这个方案的核心是只在最后时合并提交,同时由于主干与功能分支的起点之间没有提交,合并提交引入的修改全部都是功能分支的改动。由于前面已经处理了冲突,这里逻辑上就不需要处理冲突,从根本上去除了冲突的处理。

chenluo0429

31

chenluo0429      2024 年 12 月 31 日 via Android   ❤️ 4

我猜 featA 合并到 master 时,经过了 sqlash 之类的操作,导致 master 上 featA 的修改与 featB 所基于的 featA 并不是同一笔提交,而是修改内容相同的两笔不同提交

feelapi

32

feelapi      2024 年 12 月 31 日

merge, rebase 两种思路是冲突的。不建议混合使用。
merge ,master->A->B ,不能跨越这个流程,B 回到 master ,也要顺序回去。merge 之前,要先从 parent 更新,例如 B 回到 master:
1. merge A->B
2. Merge B->A
3. merge master->A
4. merge A->master

wgbx

33

wgbx      2024 年 12 月 31 日

Git 不是万能药,要遵守 git flow

freesun165

35

freesun165      2024 年 12 月 31 日

@jqtmviyu 就是( main ) git merge A 时加上 squash 就可以复现了,因为当时是 gitlab 上勾选了 squash commit 的选项

zhuisui

38

zhuisui      2024 年 12 月 31 日   ❤️ 1

你要想充分利用 git merge 的自动冲突解决能力,就不要做 squash 、fixup 、amend 、cherry-pick 这类会修改 commit 的操作,你必须在 merge 时原样保留各路 branch 。
你只要记住,如果你要 merge branch ,一定要保留 branch 原来的样子。因为 git 就是利用 branch 和 merge commit 来决定冲突解决结果的。

p1gd0g

40

p1gd0g      2024 年 12 月 31 日

之前遇到几次丢代码,几个主流的 git 软件都看不到哪一次提交丢了,只有 tortoisegit 可以。
但我们没有用 squash ,我也没搞清楚同事到底是怎么操作的。

wangtian2020

41

wangtian2020      2024 年 12 月 31 日

不使用 sourcetree 喜欢用命令行操作 git 导致的

leonshaw

42

leonshaw      2024 年 12 月 31 日

很明显你 squash 把 A/B 分支点删除了,导致和 main 的分叉在 local/A 以前,这一行的添加删除都发生在分叉以后,互相抵消了。
因为 A 已经合并了,所以 B 合并前应该 git rebase --onto main local/A 把 A 排除掉。

blublu

43

blublu      2024 年 12 月 31 日 via iPhone

因为你 feat A 和 master 的 base 点( b1 )并没有 line 70 ,当你把 feat A 向 master 进行 merge 并且用 squash 方式时,新的 merge 点有了 line 70 ,记为 m1 ,当在 feat B 删掉 line70 时,和 base 点(与前面 feat A 与 master 的 base 点一样( b1 ),因为用的是 squash ,所以这个 base 点并不是 feat A 中 co 到 feat B 的那个节点)的对比中,并不会出现 line70 的变更,因为和 feat A 增加的那一行已经抵消掉了,因此会把 m1 与 b1 对比中增加的 line70 加入到 featB 中新的 merge 点 m2

不知道我这样说你清楚了么?不清楚可以再多读几遍,应该解释了整个变更过程了

mark2025

44

mark2025      2025 年 1 月 2 日

@freesun165
话虽如此,但我这个业务场景经常一个分支测一个月以上,一百多个提交,每次 master 更新,我挨个 rebase 下,成本太高了
=======
可以不用频繁 rebase ,而是功能分支要合并、发布之前集中一次 rebase 。

mark2025

45

mark2025      2025 年 1 月 2 日

@freesun165 俺这规范就是上线前 featB 需要合并 master 推到远端,远端 master 再合并 featB ,然后就出现了这么不符合知觉的事
======
这个是你们架构师、技术总监等等没设计好流程规范的问题。