Git的正确使用姿势与最佳实践| 青训营笔记

110 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第6篇笔记。

1.查看git仓库结构

tree .git                //linux
winpty tree.com .git         //git bash,另一种办法是下载tree.exe文件

2.查看git仓库中当前分支信息

cat .git/HEAD

3.常见git配置

//查看git仓库中配置信息
cat .git/config

//不同的配置级别,由高到低,低级别的配置会覆盖高级别的配置
--system        //存在/etc/gitconfig目录下
--global        //存在~/.gitconfig目录下,用户目录
--local         //存在.git目录下

//用户名配置
git config --global user.name  "name"
git config --global user.email xxxx@xxx.com

//instead of配置
//对协议的替换,比如将http换成https
git config --global usl.git@github.com:.insteadOf https://github.com/

//别名配置
//例:将 --amend --no-edit 命令简化为 cin
git config --global alias.cin "commit --amend --no-edit"

4.git remote

配置本地和远端的一些关联信息

//查看remote
git remote -v

//添加remote源,同时从这个源上fetch和push
git remote add orgin_ssh git@github.com:git/git.git
git remote add orgin_http https://github.com/git/git.git

//设置这个源push时的url,实现fetch和push可以不在同一个仓库
git remote set-url --add --push origin git@github.com:new_repo/git.git 

//配置也可以直接通过vim更改


HTTP Remote(不推荐,不够安全)

URL

github.com/git/git.git

免密配置

//内存
git config --global credential.helper 'cache --timeout=3600'

//硬盘
git config --global credential.helper "store --file /path/to/credential-file"
//不指定目录时默认是~/.git-credentials

SSH Remote

URL

git@github.com:git/git.git

免密配置

SSH通过公私钥的方式,生成公钥放在服务端,从而实现免密访问

目前Key有四种:dsa、rsa、ecdsa、ed25519

默认使用rsa,dsa和rsa不够安全,优先推荐使用ed25519

ssh-keygen -t ed25519 -C "591923227@qq.com"
//密钥默认存在~/.ssh/id_ed25519.pub

5.git add

//创建文件
touch readme.md

//查看当前状态
git status

//将文件从工作区添加至暂存区
git add .

//提交commit
git commit -m "add readme"

//查看变更日志
git log

6.Objects

commit / tree / blob 在git里被统称为Object,除此之外还有个tag的object

  • Blob: 存储文件内容

  • Tree: 存储文件的目录信息

  • Commit: 存储提交信息,一个Commit可以对应唯一版本的代码

悬空的Object

修改Commit之后,object会新增文件,但之前的commit object并未被删除,出现了没有ref指向的object,即悬空的Object

git fsck --lost-found           //查找悬空的object

这种不需要的object,可以通过git GC来删除

7.Refs

Refs存储的内容是对应的Commit ID

ref为一个指针指向对应的Commit来表示当前Ref对应的版本

8.Tag

标签一般表示一个稳定版本,指向的Commit一般不会变更

git tag v0.0.1

Annotation Tag(附注标签)

git tag -a v0.0.2 -m "信息"    //也会生成一个object的tag,存在tagger信息

9.查看文件内部信息

    git cat-file -p a03fab0cd625da260077ee7e68d0f9dcf8dbde0e2b//最后为文件全名

10.修改历史版本

1.commit --amend

通过git commit --amend修改最近一次的commit信息,修改后commit id会变

2.rebase

通过git rebase -i HEAD~3可以实现对最近三个commit的修改

可执行的操作:

1.合并commit

2.修改具体的commit message

3.删除某个commit

3.filter

通过filter --branch指定删除所有提交中的某个文件或者全局修改邮箱地址等操作

11.GC

通过git gc命令删除一些不需要的object,以及会对object进行一些打包成pack,将refs打包成pack-refs压缩来减少仓库的体积。

Reflog

记录操作日志,防止误操作后数据丢失。

通过reflog来找到丢失的数据,手动将日志设置为过期。

git reflog expire --expire=now --all      //设置日志的过期时间
git gc --prune=now             //指修建多久以前的对象,默认是两周前

12.Branch

//创建新分支
git checkout -b test

//切换分支
git checkout branchName

13.Clone & Pull & Fetch

clone

拉取完整的仓库到本地目录,可以指定分支和深度。

Fetch

将远端某些分支最新代码拉取到本地,不执行merge操作

会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作

Pull

拉取远端某分支,并和本地代码进行合并,操作等同于git fetch + git merge

也可以通过git pull --rebase完成git fetch + git rebase操作

可能存在冲突,需要解决冲突

Push

常用命令:

git push origin master

冲突:

如果本地的commit记录和远端的commit历史不一致,则会产生冲突

如果该就一个人使用,可以通过git push orgin master -f来完成强制推送

14.分支管理工作流-Github Flow

只有一个主干分支,基于Pull Request往主干分支中提交代码。

团队合作的方式:

1.owner创建好仓库后,其他用户通过fork来创建自己的仓库,并在fork的仓库上进行开发(没有提交权限)

2.owner创建好仓库后,同意给团队内成员分配权限,直接在同一个仓库内开发