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

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

Git基础知识点
常用git 指令
-
【删除分支】Git删除远程分支: git branch -d 【local_branch_name】| git push origin --delete 【origin_branch_name】
-
【查看分支】查看所有的本地和远程分支: git branch -a
-
【创建分支】创建本地分支: git branch Local_branch_name
-
【将本地分支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的位置。效果上等同于v2和v1代码完全一致,非常适合作为开发起点。 - 如果后续你在
v2上写了很多新代码,而v1也在不断更新,你只需要重复执行git checkout v2和git merge v1,就能持续把v1的更新拉进你的开发分支,避免最后集成时出现大规模冲突
另一种方式(不切换分支)
如果你不想来回切换分支,也可以直接在当前
v2下执行:bashgit fetch origin # 先拉取远程所有更新 git merge origin/v1.0.0 # 直接将远程 v1.0.0 合并到当前 v2(前提是远程
v1.0.0的内容就是你想合并的代码,不需要经过本地v1中转) - 如果
-
【合并 远程分支到本地当前分支上】
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合并远程仓库 origin的v1.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按字母顺序)。
用你的例子验证:
- 提交 1 :
HEAD在newFile→ 所以HEAD -> newFile排第一 → 然后列出同指向该提交的origin/1.0.0。 这里表示 三个引用都指向了同一个提交,所以是并列关系 - 提交 2 :
HEAD不在这里(因为HEAD在newFile分支上,而该分支已离开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 阻止了你
-
临时保存
- 暂存当前所有修改: git stash ,
- 恢复最近一次暂存并删除记录 : git stash pop stash@{0}
- 恢复最近一次暂存(保留记录): git stash apply stash@{0}
-
如果想把修改的带到新分支:
-
使用 stash 再 apply
perlgit stash git checkout newFile git stash pop
-
合并分支
根提供的 Git 历史,当前状态如下:
- 当前分支 :
v1.0.0(HEAD 指向066d151) main分支 :指向4ce3c57(最早的那个First commit)v1.0.0与main的差异 :v1.0.0包含从e9cc860到066d151的所有提交,而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.0、git push origin v1.0.0:main 等强制推送(需要 -f 参数),但这会丢失 main 上的 First commit 历史(除非你明确要覆盖)。通常不建议覆盖 main,而是合并过去。
如何优雅的整合远程项目到本地上
-
想让历史干净、线性,选
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
-
-