Loading

Git-基本操作

Git

img

img


本地仓库

环境搭建

安装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指向的分支)

img

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

img

将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进行更改再合并
如果两个分支都发生修改,就可能发生冲突

img

冲突就是两个分支上,对同一个源文件进行了更改,并且更改后的结果不一样
无法辨别出想要获得哪一种更改结果

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分支
posted @ 2020-11-28 14:23  lixin2020  阅读(134)  评论(0)    收藏  举报