git的使用

38 阅读8分钟

主分支有新提交,基于主分支的分支如何同步主分支的代码

主分支上新增提交,我一定要把主分支上新增的代码合并到我的分支上么

这取决于你的开发场景和协作需求:

场景 1:需要同步主分支的最新改动(推荐)

如果主分支新增的代码与你的功能开发强相关(比如修复了公共依赖、调整了基础逻辑),建议将主分支代码合并到你的分支。这样可以:

  • 提前发现冲突,避免后续集成时出现大量代码冲突。
  • 确保你的功能基于最新的主分支逻辑开发,减少上线风险。

操作方式(以 Git 为例):

bash

# 切换到你的分支
git checkout 你的分支名
# 拉取主分支最新代码并合并
git pull origin 主分支名(如main)
# 解决冲突后提交
git add .
git commit -m "合并主分支最新改动"
git push

场景 2:暂时不需要同步(可选)

如果主分支的新增代码与你的功能完全无关(比如其他模块的独立优化),可以暂时不合并,但需注意:

  • 后续集成到主分支时,必须合并主分支最新代码,否则可能因长期差异导致大量冲突。
  • 若主分支改动会影响你的功能运行(如接口变更),不合并可能导致本地测试正常、上线后异常。

总结

推荐优先合并主分支的最新改动,尤其是多人协作的项目。这是保障代码一致性、减少集成风险的最佳实践。

如果本地已经有main分支最新的代码了呢

如果本地已经有 main 分支最新的代码,是否需要将 main 分支上新增的代码合并到你的分支,还是取决于你的开发场景和需求。以下是不同情况的分析:

  • 需要同步主分支改动的情况:如果主分支的新增代码与你正在开发的功能相关,比如主分支更新了公共库版本、修复了基础逻辑问题等,为了避免后续集成时出现大量冲突,确保你的功能基于最新的主分支逻辑开发,建议将主分支代码合并到你的分支。操作步骤如下:

    • 切换到你的分支:使用命令 git checkout 你的分支名
    • 执行合并命令:使用命令 git merge main,将主分支的修改合并到当前特性分支。如果主分支的修改与特性分支无冲突,Git 会自动创建合并提交;若存在冲突,则需要手动解决冲突。
    • 处理冲突(如有必要) :手动编辑冲突文件,保留所需代码并删除冲突标记,然后使用命令 git add 冲突文件名 标记冲突已解决,最后使用命令 git commit -m "Merge main into 你的分支名" 提交合并结果。
    • 同步到远程仓库:使用命令 git push origin 你的分支名,将更新后的特性分支推送到远程。
  • 不需要同步主分支改动的情况:如果主分支的新增代码与你的功能完全无关,比如其他模块的独立优化,且你不希望当前分支的代码状态被改变,那么可以暂时不进行合并。但需要注意的是,随着开发的进行,可能会导致你的分支与主分支差异越来越大,后续合并时可能会遇到更多更复杂的冲突。

你的场景:

你当前在自己的开发分支(例如 feature/login),这个分支是基于 main 创建的。
现在 main 分支有了新的提交(别人更新的),你想让自己的分支同步这些新代码。


✅ 推荐方式 1:使用 git rebase(干净、整洁)

# 1. 确保在你的功能分支上
git checkout feature/login

# 2. 获取远程最新代码
git fetch origin

# 3. 将你的分支“重新基于”最新的 main 分支
git rebase origin/main

🧠 rebase 的意思:

rebase 会把你的提交“摘下来”,然后一个个“重新贴到”最新的 main 分支上。
就像是:

main:     A -- B -- C -- D   (主分支新进展)
你原来:  A -- B -- X -- Y   (你的开发分支)
rebase后: A -- B -- C -- D -- X' -- Y'   (线性干净)

如果中途有冲突,Git 会提示:

Resolve conflicts, then run "git rebase --continue"

你只要解决冲突、保存文件后执行:

git add .
git rebase --continue

✅ 方式 2:使用 git merge(安全、不改变历史)

# 1. 切换到你的分支
git checkout feature/login

# 2. 拉取最新的主分支
git fetch origin

# 3. 合并主分支的最新代码
git merge origin/main

这样你的分支上会出现一个新的合并提交(merge commit),结构大概是这样:

          X -- Y (你的提交)
         / 
A -- B -- C -- D (main)
          \
           M (合并提交)

📦 提交历史会保留分支结构,但可能稍微乱一点。


⚙️ 如果你主分支在本地也更新了:

如果你本地的 main 分支已经拉取了最新代码(git pull origin main),
那你可以直接:

git checkout feature/login
git rebase main
# 或
git merge main

🧭 总结选择:

场景推荐命令说明
想让提交记录干净(线性)git rebase origin/main适合个人开发分支
想保证安全、不动历史git merge origin/main适合多人协作分支
main 分支已在本地更新直接 merge mainrebase main不需要 fetch

合并分支冲突如何解决

git pull 和 git fetch的区别

git stash

当在修改一个分支的代码时,需要紧急去修改另一个分支的代码。可以使用git stash把修改的代码临时存储起来,等需要时再用git stash pop 弹出代码

git log --online 和 git reflog的 区别

Zhuanz@MacBook-Pro myChat % git log --oneline
10b532f (HEAD -> master, origin/master) feat:新增路由系统
34275f0 feat:新增侧边栏
aeff9ed factor: 1、新增@ alias 2、tsconfig中新增对@  alias的解析(修复ts找不到@的问题)
f1e767e init:初始化ai项目
Zhuanz@MacBook-Pro myChat % git reflog
10b532f (HEAD -> master, origin/master) HEAD@{0}: reset: moving to HEAD~1
284cf64 HEAD@{1}: commit: feat:新增知识库menu组件
10b532f (HEAD -> master, origin/master) HEAD@{2}: commit: feat:新增路由系统
34275f0 HEAD@{3}: commit: feat:新增侧边栏
aeff9ed HEAD@{4}: reset: moving to HEAD~
847cbc2 HEAD@{5}: commit: feat:新增侧边栏
aeff9ed HEAD@{6}: reset: moving to HEAD~
1c00591 HEAD@{7}: commit: feat:新增侧边栏
aeff9ed HEAD@{8}: commit: factor:
f1e767e HEAD@{9}: commit (initial): init:初始化ai项目
fb157a8 HEAD@{11}: commit (initial): init:初始化ai项目
55bf58b HEAD@{13}: commit (initial): init:初始化ai项目
f585322 HEAD@{15}: Branch: renamed refs/heads/main to refs/heads/master
f585322 HEAD@{17}: commit (initial): init:初始化ai项目

撤回已经提交到远程的代码

🧩 二、如果只是想「修改刚推送的提交」

比如你提交后发现代码不符合规范、CR 不通过。

✅ 处理步骤

# 1️⃣ 回退到上一个提交,但保留修改内容
git reset --soft HEAD~1

# 2️⃣ 修改代码 / 修复问题
vim your_file.js

# 3️⃣ 重新提交
git add .
git commit -m "fix: 修改代码根据CR建议"

# 4️⃣ 覆盖推送到远程
git push origin feature-branch -f

一、先讲两个关键点

概念含义
reset改变提交历史,把 HEAD 指针“往回挪”,相当于“时光倒流”
revert生成一个新的提交,它的内容是“撤销指定提交”的反向操作

二、push -f 的危险性

当你执行:

git push origin main -f

意思是:

🚨 “用我本地的提交历史,覆盖远程的历史。”


举个例子:

假设当前远程 main 分支是这样的:

A - B - C - D   (远程 main

你在本地执行:

git reset --hard B
git push origin main -f

此时远程就会变成:

A - B

而原来别人已经推上去的 CD
⚠️ 都被你“强行抹掉”了(历史被重写)。

这就是“重写公共历史”的危险。


三、为什么公共分支不能这样做

  • 公共分支(如 maindev)通常是多人共享的;

  • 当你强推(push -f)后:

    • 别人拉取时会发现历史“变了”,
    • 他们的分支和远程产生分歧
    • 必须手动 rebase 或 reset,非常容易出错甚至丢代码。

❌ 所以:在多人协作的分支上千万不要用 push -f


四、正确做法:git revert

git revert 不会改历史,只会新增一个反向提交

假设现在远程是:

A - B - C - D

你想撤销提交 D,执行:

git revert D
git push origin main

Git 会新建一个提交 E

A - B - C - D - E

其中 E 的内容是“撤销 D 的修改”。
这样:

  • 历史不变;
  • 不会影响他人的代码;
  • 逻辑上 D 的改动被“抵消”了。

✅ 安全又干净。