文章目录
study链接
Git是什么
Git是一个分布式版本控制系统,工作原理如图:

上图展示了 Git 四个核心区域(工作区、暂存区、本地仓库、远程仓库)之间的数据流转关系,箭头和动作对应 Git 命令:
- Workspace(工作区):本地编辑代码的工作目录,即能直接看到、修改文件的地方;
- Index/Stage(暂存区):临时存放 "待提交变更" 的中间区域,是工作区和本地仓库的 过渡层;
- Repository(本地仓库):本地存储完整版本历史的数据库,记录所有提交、分支等信息;
- Remote(远程仓库):服务器上的共享仓库,比如 GitHub/GitLab,用于多人协作同步。
这里git pull实际上相当与git fetch+git merge,讲远程仓库内容拉取到本地仓库,再执行git merge将远程跟踪分支的内容合并到当前本地分支。图中给出的本地库到工作区的箭头操作是checkout,原因是:
- 这里的checkout一般指检出某一个指定的历史版本或切换分支,以覆盖工作区的内容,常用于切换到某个分支,或者回滚历史版本
- 而merge操作会合并两个分支的提交历史,将差异整合到当前分支,一般用于同步远程分支,或者整合功能到主分支
reset指令
修改提交历史
- --soft、--mixed(默认)、--hard,这三个选项决定了 reset 对暂存区和工作区的影响
- git reflog应用,reset可恢复
- 同步远程代码仓库
https://blog.csdn.net/Hello_Ray/article/details/89851377?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ed8ff7e7adea78f536af32cd95ccfdfd%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D\&request_id=ed8ff7e7adea78f536af32cd95ccfdfd\&biz_id=0\&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1\~rank_v31_ecpm-3-89851377-null-null.142^v102^control\&utm_term=gitlab同步代码仓库\&spm=1018.2226.3001.4187 - 解决冲突
https://blog.csdn.net/eidolon_foot/article/details/149666264?ops_request_misc=\&request_id=\&biz_id=102\&utm_term=git如何同步远程仓库\&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb\~default-6-149666264.142^v102^control\&spm=1018.2226.3001.4187
新建git仓库
平台创建仓库
远程平台创建仓库,如gitlab、gitee或者github等,以gitlab为例:
本地克隆
shell
git clone 远程仓库地址
# 如git clone clone git@gitlab.com:Skye-Zhang/leon_daily.git
一般项目会有多个分支,克隆之后会在本地创建一个和远程的master或者main同名的分支,如果目标代码不在master或者main分支,需要创建一个本地分支,即:
bash
#创建一个与远程origin/mzfs-2.1.5对应的本地分支
git checkout -b mzfs-2.1.5 origin/mzfs-2.1.5
通过git branch -vv可以查看本地分支,及其关联远程分支

同步远程仓库
同步远程仓库和上游仓库主要有下面步骤:
bash
# 1.查看远程仓库配置
git remote -v
# 2.添加远程仓库
git remote add upstream http://gitlab.dvlp.macrosan.corp:8081/buss/filesystem/disk-fs/zfs/zfs.git
# 2.暂存本地未提交修改
git stash
# 3.拉取上游仓库最新提交
git fetch upstream
# 4.切换到目标分支,合并上游提交到本地
git checkout mzfs-2.1.5
#将上游upstream/mzfs-2.1.5分支内容合并到当前所在分支
git merge upstream/mzfs-2.1.5
# 5.推送到自己的 fork 仓库
git push origin mzfs-2.1.5
# 6.恢复之前暂存的本地修改
git stash pop
查看远程仓库
在本地仓库目录下,查看远程仓库配置
shell
git remote -v
这里origin即为本地仓库的远程库,upstream表示手动添加的上游主线仓库,如果没有,需要手动添加

添加远程仓库
给本地仓库增加一个远程关联仓库,upstream是一个约定成俗的名字,表示上游仓库,添加以后可以通过git remote -v查看
bash
git remote add upstream http://gitlab.dvlp.macrosan.corp:8081/buss/filesystem/disk-fs/zfs/zfs.git
暂存本地修改
bash
git stash
git stash指令用于暂存当前工作区和暂存区中修改的未提交的代码,暂存以后可以通过git stash list查看stash记录
拉取上游仓库提交
bash
# 拉取上游仓库的的提交、标签等信息到本地,但不合并
git fetch upstream
git fetch与git pull的区别,
- git fetch upstream仅拉取上游的变更,但不合并;
- git pull 会拉取上游变更并直接合并,相当于git fetch upstream + git merge upstream/当前分支
git fetch之后,本地会产生以upstream为前缀的分支,这个分支是只读的,用于记录上游仓库分支的最新状态,可以通过git branch -r查看远程分支。
git fetch之后,可以通过命令查看上游和本地分支的差异:
bash
# 查看上游 mzfs-2.1.5 比本地 mzfs-2.1.5 多了哪些提交
git log mzfs-2.1.5..upstream/mzfs-2.1.5
合并上游提交
切换到需要同步的本地分支
bash
# mzfs-2.1.5代表需要同步的本地分支名称
git checkout mzfs-2.1.5
执行merge或者reabase
bash
# 将上游仓库的提交merge到本地
git merge upstream/mzfs-2.1.5
# 变基,基于上游仓库嫁接本地的提交
git rebase upstream/mzfs-2.1.5
git fetch upstream之后,本地的mzfs-2.1.5和upstream/mzfs-2.1.5有一定区别,eg:
bash
# 上游分支(upstream/mzfs-2.1.5)的历史:
A → B → C → D (D 是上游最新提交)
# 本地分支(mzfs-2.1.5)的历史(假设有1个本地提交):
A → B → E (E 是的本地提交)
两者的区别
git merge
合并保留分叉,创建新的合并提交,Git 会找到本地分支和上游分支的共同祖先(本例中是 B),然后将上游的 C→D 和本地的 E 合并,生成一个新的 "合并提交"(M),最终历史如下:
bash
A → B → C → D
\ \
E ------→ M (M 是合并提交,记录"合并上游代码"的操作)
git rebase
改写历史为线性,无合并提交,Git 会先找到本地分支和上游分支的共同祖先(B),然后暂时 "剥离" 你的本地提交(E),将本地分支指针先同步到上游最新提交(D),再把的本地提交(E)"重新嫁接" 到 D 之后,最终历史如下:
powershell
A → B → C → D → E' (E' 是原 E 提交的"复刻版",哈希值会改变)
使用场景:
- 若 fork 后无本地提交:merge 和 rebase 效果完全一致,选 merge 更简单(无需考虑强制推送);
- 如果fork后本地有提交:想保留合并上游的记录,用merge;想让提交历史更简洁,用rebase;
- 如果当前fork的分支有多人使用,应该使用merge,避免使用rebase.
总结:merge是"保留历史的合并",rebase是"重塑历史的合并"。
推送到远程仓库
bash
git push origin
