git

git: 分布式版本管理

一、优势

  • 本地版本控制
  • 可以重写提交说明
  • 可以撤销操作
  • 分支系统
  • 全量: 每一个版本都包含全部的文件,时刻保持数据的完整性

二、三种状态

  1. 已修改(modified): 在本地工作区
  2. 已暂存(staged): 在暂存区
  3. 已提交(commit): 在对象区

注意: 暂存区和对象区,统称: 版本库,即是.git目录

三、设置用户名和邮箱

// 添加
// 1、命令添加
// 2、直接在文件里添加
// 基本不用:给整个计算机一次性设置
git config --global 
// 推荐: 给当前系统用户一次性设置
// 配置文件的位置:cd ~(进入到系统用户目录); pwd(查看当前目录); cat .gitconfig(查看config配置文件内容)
git config --system
// 给当前项目一次性设置
// 配置文件的位置:当前项目: .git/config文件
git config --local

// 删除
// 1、命令删除
// 2、直接在文件里删除
git config --local --unset user.name

// 使用config的优先级:
loacl > system > global

四、git常用操作命令

// git工作区初始化
git init 
// git当前状态
git status
// 添加某个文件: 工作区到暂存区,例如 git add hello.txt
git add <file>
// 添加所有已修改的文件到暂存区
git add .
// 与git add . 的区别: 会add忽略文件
git add * // 不建议使用
// commit提交
git commit -m 'msg'
// 合并add和commit(不能在项目中,第一次使用。第一次提交需要分开)
git commit -am 'mss'

// 查看所有日志
git log
// 查看最近的某几个日志: git log -1
git log -<number>
// 一行显示一个日志
git log --pretty=oneline
// 图形化日志
git log --graph
// 
git log --graph --pretty=oneline --abbrev-commit
// 暂存区到工作区
git rm --cached <file>

// 删除已提交的文件: 文件被放到暂存区,彻底删除需要再commit一下
git rm <file>
// 系统删除:状态直接到工作区
rm <file> 

// git rm的撤销
// 1、从暂存区恢复到工作区
git reset head <file> / git restore --staged <file>
// 2、撤销删除动作【撤销工作区的修改】
git checkout -- <file>


// checkout 1、切换分支2、撤销工作区的修改3、版本穿梭
// 版本穿梭【游离状态:必须提交;需创建分支】
git checkout sha1值

// 将上一次(最近)一次的提交注释重写
git commit --amend -m '重写注释'


// 分支系列。分支:一条commit链,是一条工作记录线
// 查看分支
git branch
// 查看分支最近一次提交的id和msg
git branch -v
// 查看到包括origin/xxx 本地的远程分支【查看本地和本地的远程分支/追踪分支(感知远程分支的分支)】
git branch -a 
git branch -av
// 创建分支
git branch 分支名
// 切换分支
git checkout 分支名
// 删除本地分支(1、不能删除当前分支;2、不能删除未合并到当前分支的分支)
git branch -d 分支名: 不能删除时,有提示
git branch -D 分支名: 强行删除用大写D
// 删除远程库分支
git push origin :远端分支名  或者  git push origin --delete 远端分支名
// 新建分支并切换
git checkout -b 分支名
// 分支重命名
git branch -m 原分支名 新分支名


// 版本系列
// 版本穿梭
// 回退到上一次的版本 : ^ 有几个就是回退到上几个版本
git reset --hard HEAD^
// 回退到前n此提交
git reset --hard HEAD~n
// 通过sha1值,跳转到任意一个版本  结合git reflog
git reset --hard sha1值
// 查看所有log,包括已经回退的
git reflog


// stash 保存现场
// 在没有commit之前就要切换分支,则需要先将代码保留到现场
git stash   // 差异性代码将看不到
// 还原最近一次保留的代码
git stash pop // 删除原来保存的现场,用于还原内容
// 还原内容,不删除原来现场的代码
git stash apply
// 指定还原某一次代码
git stash apply stash@{n}
// 手动删除某一次的现场代码
git stash drop stash@{n}
// 查看现场列表
git stash list

// git本地和远程服务的操作
// 本地与远程仓库建立链接
git remote add origin 远程仓库地址
// 查看本地是否和远程状态一致
git remote show origin
// 远程仓库地址
// 1、https: 首次需要验证github登录
// 2、ssh: 需要本地和远程注册ssh密钥关联【无需登录验证】
// 生成密钥:公钥和私钥
// 1、切换到用户名目录
cd ~
// 2、生成密钥:公钥和私钥
ssh-keygen // 用户名目录下,生成 .ssh目录 id_rsa 作用于本地计算机【私钥】;id_rsa.pub【公钥】作用于github,本项目或者整个github服务
// 可以将公钥存放在github中的两个地方: 1、项目的setting中,只有当前项目和本机,免密登录;2、账号的settings,github上所有的项目都可以和本机免密钥登录
// 注意:远程github增加ssh公钥时:1、删除公钥中的回车符;2、都选可写权限项
// 步骤:当前项目---settings---deploy keys
// 本地到远程
// 1、首次推送【本地和远程都有master分支】
git push -u origin master
// 第二次推送本地master到远程 直接
git push
// 2、本地新建分支dev,远程没有dev分支,向远程推送dev分支【该分支本地有,远程没有】
// 相当于push的时候,在远程新建了dev分支
// 方法一:
git push -u origin dev
// 方法二
git push --set-upstream origin dev
// 本地推送到远端: 本地分支dev对应的是远端dev2分支
git push origin dev:dev2
// 远程到本地【远程有分支,本地没有这个分支】
// 1、远程到追踪分支
git pull // 【pull = fetch + merge,pull包括拉取和合并操作】 会将追踪仓库 origin/xxx 放到本地
// 2、追踪到本地分支
// 方法一: 创建并切换到dev分支,然后和追踪分支origin/dev 关联
git checkout -b dev origin/dev
// 方法二:追踪track 追踪分支
git checkoutb -b dev --track origin/dev
// 缩写是:
git checkout --track origin/dev
// 1和2步的结合:【将远端的dev2分支拉到本地,对应本地的分支名为dev。之前本地是没有dev分支的】
git pull origin dev2:dev 

// 本地没有test分支,但是有test这个追踪分支
// 检测无效的追踪分支
git remote prune origin --dry-run
// 删除无效的追踪分支
git remote prune origin
// 第一次远程到本地;【因为远程库包含了版本库,即.git,所以clone之前,本地不需要git init,即不需要在本地建立版本库】
git clone https/ssh地址 指定的本地项目名(默认是远程仓库名)




// 标签
// 标签作用于整个项目,和具体的分支没有关系。即是:不同分支可以操作该项目下的所有标签
// 创建标签
git tag tagName
git tag -a tagName -m 'msg'
// 查看标签
git tag
// 删除本地标签
git tag -d tagName
// 删除远程标签
git push origin :refs/tags/tagName
// 向远程推送标签[推送本地未推的所有标签]
git push origin --tags
// 拉取远程标签
git fetch origin tag 标签名

// 责任
// 查看a.txt的所有提交的sha1值和作者
git blame a.txt


// 弹出图像工具
// 1、
gitk
// 2、
git gui

// 给命令配置别名
git config --global alias.别名 git的命令名
// 如
git config --global alias.ch checkout

五、git窗口中常用命令

// 进入编辑状态
vi
// 开始编辑
a
// 退出编辑状态
esc + shift + z + z
// 退出gitlog过多的状态
q
// 查看文件内心
cat <file>
// 新建文件
touch <file>
// 查看系统用户目录
cd ~
// 切换到之前的文件路经
cd -
// 查看当前路径
pwd
// 删除当前目录下的所有文件(不会删除隐藏目录文件,如.git;删除后,不会进入到回收站)
rm -rf *
// 删除隐藏文件,需要指明隐藏文件名
rm -rf .git
// 删除根目录所有文件【慎重使用该命令】
rm -rf /

六、git忽略文件

.gitignore

// 忽略所有点txt文件
*.txt 
// 忽略所有点txt文件的同时,除了readme.txt
!readme.txt
// 忽略dir目录中所有文件
dir/
// 忽略dir目录下的所有点txt文件
dir/*.txt
// 忽略dir第一级目录下的所有点txt文件,如dir/a/b.txt  不能忽略dir/a/b/c.txt
dir/*/*.txt
// 忽略dir下任意级别目录下的点txt文件   **/ : 任意级别目录
dir/**/*.txt

七、git使用中,常见错误

1、OpenSSL SSL_read: Connection was reset, errno 10054 或者 error 443 time out——网络不好

# 第一种方法:一般访问github会造成这个问题,解除掉SSL验证即可
git config --local http.sslVerify "false"

# 第二种方法:基于windows,提高github的访问速度
# 在C:\Windows\System32\drivers\etc中的hosts文件中添加:
192.30.253.113		github.com
151.101.185.194		github.global.ssl.fastly.net

# 在dos中
$ ipconfig /flushdns

2、git Logon failed, use ctrl+c to cancel basic credential prompt——验证github/gitee登陆时错位。

// 一般是,自己删除了github上的仓库,导致之前链接的 Personal access token 失效
// 解决如下:

1、第一次验证使用 github的账号、密码登录
2、第二次验证使用 github的账号和生成的Personal access token

// Personal access token的生成
1、点击右上角头像–> setting --> Developer settings --> Personal access tokens
2、  note: push
	勾选workflow、gist、user

2、Please make sure you have the correct access rights and the repository exists——无权限

# 1、如果密钥不存在, 则使用一下命令 创建密钥
$ ssh-keygen -t ed25519 -C "your email"

# 2、在C:\Users\ZN220203\.ssh 打开id_rsa.pub  复制粘贴到github

# 3、查看是否成功获得权限
$ ssh -T git@github.com

# 4、再次尝试push到远程仓库
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐