温故而知新:git常用操作场景以及命令

160 阅读5分钟

git概念详解

概念详解
工作区(Workspace)在电脑上开发项目时能实际看到的代码目录
暂存区(stage)用于临时存放文件的修改,实际上它只是一个文件(.git/index), 表示待提交文件的列表信息
版本库/仓库(Repository)git的管理仓库,管理版本的数据库,记录文件/目录状态的地方,所有内容的修改记录都在这里
本地仓库用户机器上直接使用的版本库
服务端/远程仓库(origin或remote)服务器端的版本库,为多人共享开发提供服务,本地版本库通过push把代码推送到远程仓库
分支(branch)分支是从主线分离出去的一个"副本",可以独立操作互不干扰
标签(tag)标签是指某个分支特定时间点的状态,在某个分支基础上创建,类似于分支的一个副本,但它是不可编辑的,可以理解为提交记录的一个别名,常用来标记一个里程碑版本
头(head)head类似一个指针,指向当前活动分支最新版本
暂存(add)把工作区变动的文件保存到暂存区
提交(commit)把暂存区所有变更的内容提交到本地仓库的活动分支
推送(push)将本地仓库的版本推送到远程仓库,供其他人共享
拉取(pull)从远程仓库拉取代码版本到本地仓库
获取(fetch)从远程仓库更新代码,作用同pull,区别是不会自动合并
冲突(conflict)多人对同一文件的副本进行了修改,并将这些更改合并到仓库时就会面临冲突,需要人工对比修改处理
合并(merge或rebase)把一个分支合并到另一个分支,merge会产生一个新的commit记录,rebase不会产生新的提交记录
默认分支(master或main)初始化git仓库时默认自动生成的分支
origin/master表示远程仓库originmaster分支
origin/Head表示远程仓库origin最新提交的位置

git配置

git config --list // 查看配置
git config user.email [email] // 配置局部账号
git config --global user.email [email] // 配置全局邮箱
git config --global user.name [username] // 配置全局用户名
git config –replace-all user.name "name" // 修改配置信息
git config --global credential.helper store

分支管理

场景命令场景命令
新建分支git branch b-name切换分支git checkout b-name
删除分支git branch -D b-name删除远程分支git push origin --delete b-name
查看分支git branch -av暂存分支git add .
提交分支git commit -m 'develop'推送分支到远程git push origin b-name
拉取远程分支并创建本地分支git fetch origin dev:dev拉取代码并合并git pull origin dev
修改上一次提交git commit --amend -m 'fix'修改某一次提交git rebase -i parentCommitId

注意点:切换分支时,当前分支没有 add 或者 commit,则会把内容带到另一个分支里面去,对于未add和commit的内容不属于任何一个分支,也就是说,对于所有分支而言,工作区和暂存区是公共的。

pull 和 fetch

git pull  = git fetch + git merge

pull 和 fetch都是从远程拉取代码版本到本地分支,pull拉取后会主动的进行版本合并,fetch不会主动合并(不会影响工作区代码,HEAD还是指向之前的版本),需要手动合并

分离头指针

当HEAD指向分支的其他commit时(不指向顶部commit),此次HEAD就处于分离头指针,可以在此commit基础上创建一个新的分支

git checkout commitId // 切换成分离头指针
git swtich -c new-branch // 创建新的分支

修改某一次commit的信息

如果修改之前某一次commit提交的内容,可通过其父commitId(前一次)进行调整,此时会进入到一个交互界面,通过修改pick为reward命令保存进行后续修改

git rebase -i parentCommitId

.git目录结构

683be60264844023a065cc897ae22834_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.awebp

文件管理

场景命令场景命令
删除文件git rm xx修改文件名git mv a.js b.js
恢复暂存区文件到工作区git restore xx从仓库恢复到暂存区git restore --staged xx

合并分支

merge

合并test分支到dev,会产生新的提交记录

git checkout dev // 切换到dev分支
git merge test // 合并test分支

rabase

合并test分支到dev,不会产生新的提交记录

git rebase dev // 在test分支操作
git checkout dev // 切换到dev
git merge test // 合并test
git push // 推送到dev远程
git branch -d test // 合并完成后删除test分支

标签管理

场景命令场景命令
创建标签git tag -a 'v1.0' -m '创建v1.0标签'删除本地标签git tag -d v1.0
推送标签git push origin v1.0基于标签创建分支git branch branch-name tag-name
删除远程标签git push origin :refs/tag/v1.0拉取远程标签git fetch origin tag v1.0

版本日志

场景命令场景命令
查看日志git log --oneline -n4 --all --graph查看可视化工具gitk

版本回退

回退到某次提交

回退到某次提交,会删除之前的所有改动(使用时需要注意)

git reset --hard commitId // 回退到某个版本
git reset --hard HEAD^ // 回退到上个版本
git reset --hard HEAD~3 // 回退到前3次提交之前
git push -f origin master // 强推送至远程

回退到某个commitID之后,想把当前的版本推送到远程,需要使用强制命令,普通的推送命令会提示先执行pull命令,这是由于远程的commit比本地的commit要领先,所以不能直接提交

回退到某个版本 在此基础上建立新分支

git checkout commitID命令让HEAD指向了某一个特定的commit点,而不是指向分支的顶点,此时它不属于任何的分支(是一个游离的状态)

如果在此基础上修改后进行add和commit,HEAD会指向一个游离的分支,当切换分支后,此游离分支就会自动消失

git checkout commitId // 切换到某个特定commitId
git switch -c newBranch // 在commitId基础上创建一个新的分支

版本对比

工作区和暂存区

git diff

git diff file

暂存区和版本库(HEAD)

git diff --cached

commit和branch

git diff commit1 commit2
git diff branch1 branch2 file