Git学习笔记
from 稀土掘金扔物线老师的Git原理详解及实用指南课程
git指令练习网站:gitbranching
1.中央版本控制系统与分布式版本控制系统
中央版本控制系统:
每个人开发独立的功能,开发完成后上传中央仓库,其他人可下载
分布式版本控制系统:
每个成员都有本地仓库,内含所有历史版本
每个人开发独立的功能,每完成一部分改动都可以上传本地仓库,完成整体功能后上传中央仓库,其他人可查看中央仓库的改动,并下载到本地与自己本地仓库合并
2.快速尝试
git status 查看当前状态
git add [file] 将新文件存入staging area(暂存区)/修改文件也是相同操作
git commit 提交暂存区里的新文件
git log 查看提交历史
git push 将本地提交发布到中央仓库
Origin/main : origin为远程中央仓库名 main(之前为master)为默认分支名
遇到的坑:
1.在git push的时候会提示输入用户名密码,用户名即为github用户名,而密码是需要在github网站上手动生成的token
3.HEAD、main、branch
1.简单工作模型
为了解决多人协作同时push冲突问题,在git push前需要先git pull(git fetch +
merge)将远程commit与本地commit合并
2.基于branch工作模型
HEAD
当前commit的引用
每当有新的commit,HEAD就会自动指向新的commit
branch
HEAD指向commit,也指向branch
提交新commit时,HEAD会带着branch向前移动
创建commit过程:
创建commit4前:
创建commit4后:
ps:因为并没有提交commit4,所以origin/HEAD和origin/master依然不动
git clone下来的项目默认将HEAD指向master分支
branch命令
git branch [branch_name] 创建分支
git checkout [branch_name] 更换HEAD指向位置
git checkout -b [branch_name] 将上述两个操作合并
git branch -d [branch_name] 删除分支
ps:
1⃣️HEAD指向的branch不能删除
2⃣️删除branch只会删除引用,不会删除下面的commit,但是当git回收机制意识到这些commit是没有归属的branch会自动清除
3⃣️没有合并到master的分支需要使用 -D 删除
引用的本质
SHA-1(指向commit)或者路径(branch 例:ref: refs/heads/feature3)以文本形式存储在.git文件中
4.push的本质
git push会将当前HEAD所指向的分支同步到中央仓库,但命令有所不同
当前HEAD指向master
git push 将master分支同步到中央仓库
git checkout [branch_name]
git push origin [branch_name] 将新分支同步到中央仓库(已有的分支无需加后面两个参数,不过这个通过push.default更改)
ps
中央仓库HEAD一直指向master
5.merge
git merge [branch_name] 将branch合并到main中
HEAD/master指向了合并后的节点,而分支指向未变
解释图
冲突
merge操作的时候,如果各个操作的是不同文件,或者同一文件不同行,merge会自动将所有改动都生效,但如果各个操作改的是同一行,则会报错(conflict),然后只能解决矛盾+手动commit
手动提交
git add [filename] 此处需add冲突文件
git commit
git merge --abort 放弃merge
commit领先HEAD
场景就是自己分支的代码还没写,远程同事上传了新的代码,这时候需要执行git pull(fetch+merge),执行之后,HEAD/master指向就和origin/master指向一样了,保持除了自己分支的
6.Feature Branching
任何功能都添加一个branch,完成后合并到master并删除branch
7.log
git log -p 查看每个commit的具体细节
git log --stat 查看简要统计
git show 查看当前commit
git show [commit的SHA1码] 查看指定commit
git show [commit的SHA1码] [filename] 查看指定commit下的指定文件
git diff 查看工作区与暂存区不同(提交commit后)
git diff HEAD 查看工作区与提交HEAD后的不同(提交commit前)
git diff --staged 查看暂存区与上一条commit不同