目录
Git是什么
分布式的版本控制工具,对文件变更过程的存储
-
分布式的,不止远端,更在本地
版本控制有点类似改论文的时候,保存不同版本的论文,并在上面进行修改
毕业设计论文-初稿.doc
毕业设计论文-中稿.doc
毕业设计论文-终稿.doc
可以看到每一步修改的内容、时间、提交人
Git作用
-
多版本控制
-
多分支控制
-
多人协作
咋实现的
对象存储数据库(.git/objects目录),提交后生成的hash值是key,value是打包后的对象
Git 打包对象时,会查找命名及大小相近的文件,并只保存文件不同版本之间的差异内容。
Git 时常会自动对仓库进行重新打包以节省空间
ref:
在线学习和使用的网站:https://learngitbranching.js.org/?locale=zh_CN
git常用操作
克隆项目: git clone 地址
拉取更新: git pull
获取全部提交 git fetch --all
提交暂存区: git add .
提交本地仓库git commit -a -m "msg"
推送远端 git push origin bugfix:master
选取另外分支的提交到当前分支 git cherry-pick commitHash
合并分支 git merge branchName
合并分支(抛弃原分支 相当于续后面了)git rebase
重新回到某个版本 git reset commitHash --hard 强制恢复 --soft 默认
保存现场 git stash push -m "msg"
还原现场 git stash pop | git stash apply stashName | git stash drop stashName
分支相关
查看全部分支 git branch -a
新建并切换分支 git checkout -b <branchName>
删除分支 git branch -d <branchName>
删除远端分支 git push origin -d <branchName>
查看命令相关
查看提交全部记录git log --all
比较本地未commit的和目前版本的不同 git diff
查看本地未commit的文件 git status
常见场景
日常工作流场景
场景:
刚入职,拿到新的项目
操作:
-
克隆项目:git clone 地址 (ssh方式需先配置公钥)
-
拉取小伙伴提交的代码:git pull
-
git pull = git fetch (获取最新的记录) + git merge (合并分支)
-
git pull --rebase = git fetch + git rebase
-
-
进行本地代码修改,修改完毕后将本地已修改的文件全部添加到暂存区 git add . 或者add 单个文件 git add 文件路径
-
git diff 可以查看哪些文件有哪些变化(只能查看本地和当前commit的不同,也就是commit之前的)
-
查看add 了哪些:git status
-
-
将暂存区的文件 commit 到本地仓库 git commit -m "注释本次操作做了什么"
-
查看本地 commit 了什么:git log
-
-
将本地仓库的文件 push 到远端仓库 git push
note:
note: git add . 和 git add * 的区别
git add . 会将本地所有修改的文件全部加入暂存区,并且根据 .gitignore 做过滤
而 git add * 会将全部文件加入,不会在乎 .gitignore
note: git commit -a 相当于
git add . + git commit
注意:-a 只针对修改了的或者删除的,对于新建的仍需要 git commit
note: git log
-p --patch -n 显示n次提交中各个文件的差异
--stat 提交的简略信息 比如新增了多少 修改了多少 删除了多少
--pretty 展示提交历史 oneline 一行显示
--graph 日志以树的模样展示
将多个commit合并为一个commit场景
场景:
一次开发中可能会出现多次commit,合并成一个commit并提交,可以方便回滚之类的
操作:
-
git rebase -i 进入交互页面
-
按照下面的介绍进行相应的改变
-
r 使用并重新编写commit messgae
-
f 使用并重新编写commit messgae
-
合并场景
场景:
dev分支开发完毕且本地代码已全部push到远端仓库,上test分支,进行测试;
操作:
-
查看本地和远端全部分支 git branch -a
-
绿色的带*的是目前所处分支
-
-
切换分支 git checkout test
-
git checkout 提交的hash值 可以回到某个提交
-
-
合并分支 git merge dev
-
若出现conflict,则需要解决冲突,也就是在本地将对方或者自己的代码保留或综合
-
其中<<<<<<HEAD到======= 中间的代表的是目前本地的
-
git status 可以看到暂存区的文件以及状态
-
-
冲突解决完毕再次add commit push
note:
若只想复制某个分支上的部分提交,可以使用cherry-pick
合并除了merge还有rebase,语法和merge相似,merge会保留原分支,rebase会将原分支丢弃
git rebase
--abort 会放弃合并,回到rebase之前的状态,之前提交的不会丢弃
--skip 将会引起commit的丢弃掉 ,也就是把你的commit丢掉
--continue 合并冲突
git rebase之后就会变成一条直线,也就是bugfix07那条分支没了
开发新功能场景
场景:
新功能,新建一个分支进行操作
操作:
-
以某分支为基础,创建并切换至新分支:git checkout -b 新分支的名称 <远程分支名称>
-
新的分支上进行代码的编写,编写完成后 git add、commit、push
-
push 的时候需要指明哪个分支到哪个分支 eg: git push origin bugfix20210810:dev
note:
版本回退场景
场景:
错误push或者新版本上线之后发现有问题需要进行回滚
操作:
-
git log 找到需要回退的版本号
-
强制回退到指定的版本号 git reset --hard 版本号
-
强制推送(本地覆盖远端的 无需解决冲突) git push -f
-
-f == -force 推送完成后,之后的版本就都看不见了,
-
可以通过git reflog 查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
-
note:
git reset 默认为 --soft
--soft 只回退了commit的代码,本地代码修改仍在,仍需commit push
--hard 彻底回退,本地的源代码完全变为上个版本的 只需push
错误的commit 只需要git reset
可以将其想象成一个指针,在一条直线上移动,直线上的每一个点都是你提交的版本
git log --all
可以查看所有分支的提交记录
暂存本地修改场景
场景:
本地正常开发过程中突发重大bug需要修复,只能暂存本地修改代码,进行bug的修复
操作:
-
git stash push -m "save message" 将本地所作的修改暂存起来(add 未commit的)
-
git stash list 查看本都暂存的记录
-
git pop 恢复并删除本地的暂存
-
git stash apply stash@{0} 不删除暂存记录的取出
-
git stash drop stash@{0} 删除暂存的记录
-
git stash show 可以看到有哪些改动 -p stash@{0} 可以看具体的改动
-
note:
git stash 将修改存在了 refs/stash 下,在 .git/log/refs/stash 可以看到全部stash记录
打补丁场景
场景:
多人协同开发,将自己的补丁(开发的部分代码)给到主开发者
操作:
-
生成补丁 git diff > test.patch | git diff 【commit sha1 id】 【commit sha1 id】 > 【diff文件名】
-
应用补丁 git apply test.patch
git apply --reject xxxx.patch
只应用不冲突的更改,未应用的更改会生成.rej文件,可以手动根据内容进行修改解决冲突,然后add commit push