Git-基本操作
Git


本地仓库
环境搭建
安装Git,同时配置环境变量以在控制台中直接使用,此时Git就是可以直接使用的命令
并在git bash中设置用户信息
git config --global user.name "用户名"
git config --global user.email "用户邮箱"
创建及操作本地仓库
包含了三个区域
工作区(working tree),暂存区(index/stage,存放在.git文件夹中),本地仓库(repository)
cd D:\OneDrive\Code # 跳转到想要作为git仓库的目录
git init # 在该目录下生成.init的隐藏文件夹,将当前非隐藏目录作为git的仓库(repository)
git add 文件名
# 将该工作区(working tree)的某个文件添加到git暂存区(stage)
# 注意此处需要指定文件
git commit -m "注释"
# 将文件进行提交,从暂存区(index)移动到仓库区(repository)
# 此处不需要指定文件,默认为暂存区的所有文件
# 也就是可以多次add,一次commit
查看状态
git status
# 显示工作区哪些文件未追踪(untracked)以及修改(modified)未上传或者提交
# 文件夹内的变化分为两种,一种是出现了新文件(untracked),另一种是修改(modified)未提交
git diff 文件名
# 可以查看该文件工作区和暂存区的区别
# 针对的是还没有进行add的文件,用于在add之前确认
git diff --cached
# 查看所有文件工作区和暂存区的区别
git diff HEAD
# 查看工作区和仓库区的差异,查看是否全部进行了commit
# HEAD实际上是分支的一个版本指针,指的是本地仓库最新的提交版本
文件回滚
可以查看文件的历史记录及进行回滚
# 当还未进行add时,可以使用暂存区获得此次修改前的内容
git checkout --文件名
# 撤销工作区更改,将暂存区最新版本转移到工作区
# 也就是放弃此次对文件的修改(如果你上次commit了的话)
# 当已将程序add到暂存区时
git reset HEAD 文件名
# HEAD表示要回退到仓库去的最新版本
# 也可以直接输入commit id
# 实际上是将仓库区的某个指定版本转移到暂存区
# 然后再使用check out命令转移到工作区,即可撤销本次的所有修改
# 当已经commit到仓库区时
git log
# 可以查看仓库区文件的修改历史记录
# 包括了作者,修改时间,修改内容
# 每次修改都对应了一个commit id
# head为一个指针,指向了最新的版本
git reflog
# 查看自己回滚的历史记录
# 可以用来之前操作对应的commit id,如果对回滚后悔的话
$ git reset --hard HEAD^
# 仓库区的指针指向上一个版本
# 实际上只是文件的指针发生了变化,然后就可以使用reset命令转移到暂存区
文件删除
git rm 文件名
# 在暂存区进行删除
git commit -m "delete"
# 将删除提交,也就是在仓库区进行删除
git checkout --文件名
# 如果误删,从暂存区进行还原
远程仓库
本地关联
即将本地推送到远程(反之称为抓取)
# 在github上创建一个repository
ssh-keygen -t rsa -C "youremail@example.com"
# 在git bash下运行
# 创建SSH key,其会默认在指定路径下创建一个密钥对,rsa为私钥,pub为公钥
git remote add origin git@github.com:xxxxx/xxxxxxx.git
# 与远程仓库建立连接,此处没有与本地文件建立具体的映射
# 此处将远程主机命名为了origin
git push -u origin master
# 首次推送使用-u参数
# -u会将本地的master分支和远程的master分支进行关联
# 后面就可以不使用-u参数
克隆远程仓库
git clone git@github.com:xxxxxx/xxxxx.git
# xxx/xxx指的是某个用户对应的某个仓库
# 一般在github的主页会有对应的ssh克隆连接
从远程仓库进行拉取
git remote -v
# 查看远程仓库的分支信息(包括了拉取和推送的分支)
git pull origin master:brantest
# 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并
# 远程主机在初始建立连接的时候就已经命名为origin
git pull origin master
# 远程分支是与当前分支合并,则冒号后面的部分可以省略
标签(tag)
以下的操作需要在具有.git的文件夹(也就是其需要是一个git仓库)内操作,否则无效
注意标签(tag)是和提交(commit)联系在一起的
查看标签
git tag v1.0 # 创建名为v1.0的标签,并打在最新提交的commit上(也就是其对应着当前head指向的位置)
git tag # 查看所有创建的标签
git tag v1.0 f52c633 # 为某个commit id打上标签
git show v1.0 # 查看标签对应的信息
git tag -d v0.9 # 删除本地的标签
将标签推送到远程
git push origin v1.0 # 推送标签至远程的origin分支
git push origin --tags # 推送本地的所有标签至远程的origin分支
git push origin :refs/tags/v0.9 # 删除远程的标签,对应分支名origin以及标签名
分支(branch)
分支的创建实际上就是指针的增加,默认的指针就是master,指向的时间线上的内容
(head也是一个指针,指向的是不同的分支,提交操作是针对head指向的分支)

不同分支的不断进化,就会变成如下,此时就涉及到合并的问题

将master指针直接指向dev,就可以完成合并,然后删除掉dev,剩下一个master分支
创建及切换分支
git checkout -b dev
# 此时就会切换到一个新的branch
# -b表示创建并切换到一个新的分支,起点是master上head指向的位置
git branch dev
# 创建
git checkout dev
# 切换
git branch
# 列出所有分支。当前的分支会标出*
git merge dev
# 合并指定分支到当前分支
git branch -d dev
# 删除dev分支
# -D为强制删除
关于切换和创建,推荐以下方式来替代,更加简洁
git switch -c dev
# 创建到dev分支并且切换到该分支
分支的冲突
之前预设的都是master保持不变,使用dev进行更改再合并
如果两个分支都发生修改,就可能发生冲突

冲突就是两个分支上,对同一个源文件进行了更改,并且更改后的结果不一样
无法辨别出想要获得哪一种更改结果
git status
# 可以查看到当前的冲突信息,也就是运行不同分支获得的修改结果
git log
# 可以查看合并情况
分支的分类
master分支应该是稳定的,用于发布新版本
创建多个不同名的支线,每个人都有自己的分支,完成之后就进行合并,发布新版本
开发(dev)分支:用于开发基础结构
功能(feature)分支:用于增加新功能
git branch -D 功能名
# 删除这个功能分支
# 如果功能实现不佳,也可以删除这个功能
调试(bug)分支:用于处理出现的问题,需要创建临时分支
git stash
# 存储当前工作状态
# 使用git status可以看出其没有需要修改的部分
git swich -c debug
# 创建临时分支进行调试
git add 文件名
git commit -m 注释
# 暂存和提交
$ git merge --no-ff -m "merge with no-ff" debug
# 由于会创建一个commit来上传合并的详细信息,所以其会添加-m注释
git stash pop
# 恢复到之前的状态,此时也会删除原有的stash
git stash list
# 显示所有的封存状态
分支的推送
git remote -v
# 查看远程库的分支,默认名为origin
# -v可以查看详细信息
# 也可以使用git branch -r
git branch -a
# 所有的分支
git push origin master
# 将所有的commit部分推送到远程的origin对应的mater分支
git push origin dev
# 将所有的commit部分推送到远程的origin对应的dev分支
git push 远程仓库名 :分支名
# 删除远程分支
分支的抓取
git clone git@github.com:xxxxx/xxxx.git
# 进行仓库的抓取,此时只能获得一个mater分支

浙公网安备 33010602011771号