你看到的是 VS Code 的 Merge Editor(合并编辑器),里面通常有这几个区域:
┌─────────────┬─────────────┐
│ 当前(Current) │ 传入(Incoming) │
├─────────────┴─────────────┤
│ 结果(Result) │
└───────────────────────────┘
以及你提到的:
与基线进行比较
Compare with Base
这里很多人第一次接触都会懵,其实理解了 Git 的三方合并(Three-way Merge)就很简单。
什么是基线(Base)?
基线就是:
你的分支和 main 分支最后一次共同拥有的那个版本
例如:
A --- B --- C (main)
\
D --- E (feature)
假设:
- 你从 B 创建了 feature 分支
- main 后来提交了 C
- 你提交了 D、E
那么:
Base = B
Current = E(你的分支)
Incoming = C(main分支)
三个窗口分别是什么
假设文件原来是:
Base(共同祖先)
name = "Tom"
Current(当前)
你的分支改成:
name = "Jerry"
Incoming(传入)
main 分支改成:
name = "Jack"
Result(结果)
Git 不知道保留哪个:
name = ?
需要你决定。
"与基线进行比较"是什么意思?
点击:
与基线进行比较
Compare with Base
实际上是在看:
Base -> Current
或者:
Base -> Incoming
到底修改了什么。
例如:
Base
name = "Tom"
Current
name = "Jerry"
VS Code 会显示:
- name = "Tom"
+ name = "Jerry"
告诉你:
你这一边把 Tom 改成了 Jerry
再看 Incoming:
Base
name = "Tom"
Incoming
name = "Jack"
显示:
- name = "Tom"
+ name = "Jack"
告诉你:
main 那边把 Tom 改成了 Jack
为什么要看基线?
因为有时候:
Current
Incoming
差异太大。
你根本不知道:
到底是谁改了什么?
这时候看 Base。
举个真实开发例子
Base
def login():
pass
Current
def login():
print("start login")
pass
Incoming
def login():
check_user()
pass
此时:
Current 和 Incoming 完全不一样
你可能看不懂。
但与 Base 比较后:
你改了
print("start login")
main 改了
check_user()
于是你就知道:
def login():
print("start login")
check_user()
pass
才是正确结果。
VS Code里的几个按钮是什么意思
你应该经常看到:
接受当前更改
Accept Current
表示:
保留你的分支代码
接受传入更改
Accept Incoming
表示:
保留main分支代码
接受两者
Accept Both
表示:
两个都保留
然后你再手工调整顺序。