Git一文带你理解如何使用

Git一文带你理解如何使用

  • 工作区: 在电脑上能看到的目录
  • 版本库: 工作区有一个隐藏目录 .git , 这个不算工作区,而是git的版本库
  • 暂存区: 一般存放在 .git 目录下的index 文件 (.git/index) 中,暂存区有时也叫索引

基本操作(重点基础操作)

Git基础知识点

常用git 指令

  1. 【删除分支】Git删除远程分支: git branch -d 【local_branch_name】| git push origin --delete 【origin_branch_name】

  2. 【查看分支】查看所有的本地和远程分支: git branch -a

  3. 【创建分支】创建本地分支: git branch Local_branch_name

  4. 【将本地分支v1合并到本地分支v2】

    csharp 复制代码
     # 第一步:确保v1 包含最新代码
     # 在合并前,建议先把远程 v1.0.0(或你之前关联的远程分支)的最新代码同步到本地的 v1 中,确保你合并的是最新内容。
     ​
     # 切到 v1 拉取最新
     git checkout v1
     git pull origin v1.0.0   # 如果跟踪已设置,直接 git pull 即可
     ​
     # 切回 v2(此时 v2 还是你新建时的旧状态)
     git checkout v2
     ​
     # 第 2 步:将本地 v1 合并到当前分支 v2, 因为你现在就在 v2 上,直接执行:
     git merge v1
     ​
     #第 3 步:处理可能的结果
     *若无冲突:合并成功,v2 现在拥有了 v1 的全部代码。此时你可以直接在 v2 上开始开发新功能了。
     ​
     *若有冲突:Git 会提示哪些文件冲突。用编辑器解决冲突后,执行:
     git add .
     git commit -m "merge v1 into v2"

    特别提醒(针对"新建 v2"的情况)

    既然你是新建v2 分支,说明它刚创建时是基于某个基点的。执行 git merge v1 后:

    • 如果 v2 上还没有任何你写的新提交 ,那么这次合并属于快进合并 (Fast-forward),Git 只会让 v2 的指针直接指向 v1 的位置。效果上等同于 v2v1 代码完全一致,非常适合作为开发起点。
    • 如果后续你在 v2 上写了很多新代码,而 v1 也在不断更新,你只需要重复执行 git checkout v2git merge v1 ,就能持续把 v1 的更新拉进你的开发分支,避免最后集成时出现大规模冲突

    另一种方式(不切换分支)

    如果你不想来回切换分支,也可以直接在当前 v2 下执行:

    bash 复制代码
     git fetch origin              # 先拉取远程所有更新
     git merge origin/v1.0.0      # 直接将远程 v1.0.0 合并到当前 v2

    (前提是远程 v1.0.0 的内容就是你想合并的代码,不需要经过本地 v1 中转)

  5. 【合并 远程分支到本地当前分支上】

    bash 复制代码
     # 先拉取远程最新代码(只更新本地缓存,不会合并到你的工作区)
     git fetch origin  [版本 or tag]
     ​
     # 然后再合并最新的远程 v1.0.0 到当前分支
     git merge origin/v1.0.0
    命令 合并的内容 适用场景
    git merge v1 合并本地 v1 分支上的所有提交 如果你在本地 v1 上做过额外修改(未推送到远程),就用这个。
    git merge origin/v1.0.0 合并远程仓库 originv1.0.0 分支的最新快照 如果你本地 v1 只是纯粹跟踪远程,且没有本地独有提交,用这个效果一样,且更直接。

查看分支树结构

查看分支树结构:git log --graph , 也可以给他设置别名,一劳永逸:

  • git config --global alias.tree-full "log --graph --all --pretty=format:'%h %ad %s (%an) %d' --date=short"
  • or git log --graph --pretty=format:'%C(yellow)%h%Creset %s %Cgreen(%cr)%Creset %C(blue)<%an>%Creset %C(red)%d%Creset' --all
  • 或 git config --global alias.tree "log --graph --all --oneline --decorate"

一句话总结规律:

显示顺序优先级:HEAD(当前分支) > 本地分支 > 远程分支 > 标签

  • 如果 HEAD 指向某个分支,那个分支排第一
  • 如果没有 HEAD(比如是一个不带分支的标签或裸提交),则按字母顺序列出本地分支。
  • 之后列出远程跟踪分支(通常 origin/xxx 按字母顺序)。

用你的例子验证:

  • 提交 1HEADnewFile → 所以 HEAD -> newFile 排第一 → 然后列出同指向该提交的 origin/1.0.0。 这里表示 三个引用都指向了同一个提交,所以是并列关系
  • 提交 2HEAD 不在这里(因为 HEADnewFile 分支上,而该分支已离开 main)→ 所以没有 HEAD → 按字母顺序列出:origin/main(o 前)→ main(m 后)

推送分支流程

csharp 复制代码
 git checkout -b 新分支名    # 创建并切换
 git add .                  # 添加 到暂存区
 git commit -m "说明"        # 提交 本地仓库
 git push -u origin 本地分支名:新分支名 or 本地支名(默认推送到远程仓库的当前分支) # 推送并创建远程分支
写法 效果
git push origin A 本地 A 推送到远程 A
git push origin A:B 本地 A 推送到远程 B
git push -u origin A:B 推送 + 本地 A 追踪远程 B

简单记忆本地分支:远程分支,冒号左边是你本地的名字,右边是远程的名字

分支切换与隐藏

当前分支有未提交的修改 ,而 git checkout 切换到其他分支时,这些修改会被覆盖,所以 Git 阻止了你

  1. 临时保存

    • 暂存当前所有修改: git stash ,
    • 恢复最近一次暂存并删除记录 : git stash pop stash@{0}
    • 恢复最近一次暂存(保留记录): git stash apply stash@{0}
  2. 如果想把修改的带到新分支:

    • 使用 stash 再 apply

      perl 复制代码
         git stash
         git checkout newFile
         git stash pop

合并分支

根提供的 Git 历史,当前状态如下:

  • 当前分支v1.0.0(HEAD 指向 066d151
  • main 分支 :指向 4ce3c57(最早的那个 First commit
  • v1.0.0main 的差异v1.0.0 包含从 e9cc860066d151 的所有提交,而 main 只有一个初始提交,因此你的 v1.0.0 分支有大量 main 没有的内容。
目标一: 将本地分支修改合并到 main
方法 1:直接合并(推荐,保留完整历史)

假设当前所在分支是v1.0.0 , 那么,建议先将v1.0.0 合并到本地main 分支上,让后在推送到远程分支main

perl 复制代码
 # 1. 切换到 v1.0.0 并拉取远程最新
 git checkout v1.0.0
 git pull origin v1.0.0          # 或 git merge origin/v1.0.0
 ​
 # 2. 切换到 main 并更新到最新
 git checkout main
 git pull origin main
 ​
 # 3. 合并 v1.0.0 到 main
 git merge v1.0.0
 ​
 # 4. 解决冲突(若有),然后提交
 # git status
 # 编辑冲突文件 → git add <file> → git commit
 ​
 # 5. 推送合并后的 main
 git push origin main

如果希望合并后 main 的提交历史保持整洁(单线),也可以使用 rebase 后再合并,但你的分支历史比较复杂,建议直接用 merge

方法 2:变基后再合并(使历史更线性)
css 复制代码
 git checkout v1.0.0
 git rebase main          # 将 v1.0.0 的提交移动到 main 的最新提交之后
 git checkout main
 git merge v1.0.0         # 此时是 fast-forward 合并
 git push origin main

如果你的 v1.0.0 已经推送到远程并被别人基于它开发过,不要用 rebase,否则会改写历史。从你的输出看,origin/1.0.2 指向了最新的 066d151,但 origin/1.0.0 还在旧提交。如果你不确定是否多人协作,直接用 merge 最安全

目标二:同步各个分支

从你的输出看,有几个分支的状态不一致:

本地分支 指向的提交 远程跟踪分支 是否同步
v1.0.0 066d151 (最新) 无直接远程对应 需推送
1.0.2 cc4cd2d (比最新落后1个提交) origin/1.0.2 指向 066d151 落后于远程
1.0.1 不存在于本地?根据图,本地没有 1.0.1 分支,只有 origin/1.0.1 origin/1.0.1 指向 8c6034d -
newFile e9cc860 无远程对应 落后很多
main 4ce3c57 origin/main 相同 已同步
同步步骤建议:
1. 将本地 1.0.2 与远程 origin/1.0.2 同步(因为远程已经更新到 066d151

bash

perl 复制代码
 git checkout 1.0.2
 git reset --hard origin/1.0.2   # 使本地 1.0.2 完全等于远程 1.0.2
 # 或者使用 git pull --rebase

⚠️ 如果本地 1.0.2 有未推送的修改,请先备份或使用 git merge 而不是 reset --hard

2. 推送本地 v1.0.0 到远程,并让它跟踪 origin/v1.0.0(如果远程没有这个分支)

bash

perl 复制代码
 git checkout v1.0.0
 git push -u origin v1.0.0      # 创建远程分支 v1.0.0 并建立跟踪
3. 删除或忽略过时的 newFile 分支(如果需要)

bash

bash 复制代码
 git branch -d newFile          # 如果不再需要
 # 或 git branch -D newFile 强制删除
4. 将 origin/1.0.0 也更新到最新(如果希望它指向最新提交)

当前 origin/1.0.0 指向 e9cc860,而 v1.0.0 已经领先很多。如果你希望远程的 1.0.0 分支也代表最新内容:

bash

perl 复制代码
 git push origin v1.0.0:1.0.0   # 将本地 v1.0.0 推送到远程的 1.0.0 分支
5. 删除本地的 1.0.1 分支(如果没有本地修改)

bash

bash 复制代码
 git branch -d 1.0.1            # 如果本地存在
 # 或者直接删除远程跟踪引用(不影响远程分支本身)
 git branch -dr origin/1.0.1

总结命令序列(直接复制执行)

假设你希望:

  • v1.0.0 合并到 main
  • 同步 1.0.2 使其等于远程 origin/1.0.2
  • 推送 v1.0.0 到远程
  • 清理过时分支

bash

perl 复制代码
 # 1. 同步本地 1.0.2
 git checkout 1.0.2
 git reset --hard origin/1.0.2
 ​
 # 2. 合并 v1.0.0 到 main
 git checkout main
 git merge v1.0.0
 git push origin main
 ​
 # 3. 推送 v1.0.0 到远程
 git checkout v1.0.0
 git push -u origin v1.0.0
 ​
 # 4. (可选) 更新远程 1.0.0 指向最新内容
 git push origin v1.0.0:1.0.0
 ​
 # 5. 删除本地 newFile 分支
 git branch -d newFile
 ​
 # 6. 删除本地对 1.0.1 的远程跟踪引用(如果存在)
 git branch -dr origin/1.0.1

执行前建议先用 git status 确认工作区干净。如果合并时遇到冲突,按提示解决后 git add . && git commit

如果你的实际意图只是"同步所有分支使它们都指向最新的 066d151",那么更简单:用 git push origin v1.0.0:1.0.0git push origin v1.0.0:main 等强制推送(需要 -f 参数),但这会丢失 main 上的 First commit 历史(除非你明确要覆盖)。通常不建议覆盖 main,而是合并过去。

如何优雅的整合远程项目到本地上

  1. 想让历史干净、线性,选 rebase

    • 拉取远程特定分支到本地仓库: git fetch origin 1.0.1 , 修改之后先 add 再 提交 本地仓库

      • 选择变基: git rebase origin/v1.0.1

        • 推送远程仓库: git push origin HEAD:v1.0.1
      • 选择合并: git merge origin/v1.0.1

        • 推送远程仓库: git push origin HEAD:v1.0.1
相关推荐
星火10241 小时前
【LangChain4j系列06】ChatMemory 对话记忆管理
人工智能·后端
睡觉时不困4421 小时前
12.LangChain 1.0+ 第二篇:Prompt、结构化输出与 LCEL 组件组合.发布清单
后端
SomeB1oody2 小时前
【RustyML入门】2.13. 孤立森林
开发语言·后端·机器学习·rust·教程
苏三说技术2 小时前
为什么越来越多人用 Pi ? - 苏三说技术
后端
YHL2 小时前
🚀 SSE 服务器发送事件与 BFF 层实战
前端·后端
星火10242 小时前
【LangChain4j系列05】RAG 检索增强生成完整指南
人工智能·后端
技术长镜头3 小时前
别再只说“走 B+Tree”:一条 SQL 在 InnoDB 中的完整寻址过程
后端·mysql
SomeB1oody3 小时前
【RustyML入门】3.8. 正则化与归一化层
开发语言·后端·机器学习·rust·教程
zhiSiBuYu05173 小时前
Flask Session 与 Cookie 新手实战指南
后端·python·flask