这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
git从本地创建仓库
git的配置
git的配置包括了全局配置,系统配置和库配置三种
git config --global #全局配置
git config --system #系统配置
git config --local #库配置
#用户配置
git config --global user.name "username"
git config --global user.email "xxx@mail.com"
#insteadof 配置
git config --global url.git@github.com:.insteadOf https://github.com/
#git 命令别名配置
git config --global alias.cin "commit --amend --no-edit"
git Remote配置(每个库)
每一个库都对应有一个配置,即连接的github上的仓库地址,通过下面的命令可以进行完整的查看
git remote -v #查看
git remote -h #帮助
git remote add origin_http https://github.com/xxx/sock5-demo.git #添加origin
git remote add origin git@github.com:xxx/sock5-demo.git
git remote set-url --add --push origin https://github.com/xxx/sock5-push-demo.git #修改使得push的库和fetch的不同
cat .git/config #查看配置的文件
git 密码配置
现在最推荐使用ed25519方式的ssh key,别的都有可能无法完成代码推送,这一点很重要!!!
ssh-keygen -t ed25519 -C "xxx@mail.com"
git init add commit...
在本地创建仓库的方式
git init #初始化
git add . #把文件加入
git status
git commit -m "socks5-demo"
tree .git #查看目录
分析.git文件下的文件代表了什么
#object中存放了三种文件,commit(git log 获得) , tree(存储文件目录) , blob (文件)
git log #查看作者信息,以及tree object的指针
git cat-file -p d27d8ff013b20481b5e0cf498e868f01f408852e #用git log返回的指针,指到了tree文件
所以,objects的个数=1(commit 作者)+2(两层文件目录)+7(文件数)
refs / heads tags branch 名词
refs是对各个文件的引用,tags是对某个版本代码的标签,branch是成员开发时会用到,自己在分支完成开发后再rebase到主分支。
cat .git/refs/heads/master #获取的就是master的指针,指向commit文件,和git log获取的指针一样
git checkout -b test #创建一个新的分支,指向最后一个commit
git checkout master #回到master分支
git tag v0.0.1 #给当前的commit打标签,当前HEAD -> master 所以
cat .git/refs/tags/v0.0.1 #得到的指针和上面的一样
辅助标签
git tag -a v0.0.2 -m "add feature 1" #添加辅助标签,并导致object增加了一个,即第四种对象,里面有指向commit的指针
修改文件
修改文件后,会生成新的blob,对应的tree也会修改commit也会修改
例如修改了./socks5/auth.go会导致 auto.go对应的blob,tree,上一层的tree,commit改变,随意应该会增加4个objects文件!!!
git add .
git commit -m "update"
tree .git/ #发现objects由10个变成了14个
修改历史版本
commit --amend
git rebase -i HEAD
git checkout test
git rebase master #这两条命令等价于git rebase master feature
git branch -d test #删除某个分支
git tag -d test #删除某个标签
git fsck --lost-found #查找悬空的commit
#清理过期与悬空的
git reflog expire --expire=now --all #使得reflog立即过期
git gc --prune=now
执行了命令之后,会把原来悬空的310e...指针无法访问,并把之前的objects,refs打包...
通过git log命令可以看出,版本由commit链接成串,进行历史版本的管理,用各种指针去索引各个时期的文件(保存了所有的代码)。
git clone fetch pull
git 提交
1、现在github上建设仓库
2、推送
git remote add origin git@github.com:guoshaoxing/socks5-demo.git
git push -u origin master #第一次push需要-u建立连接
git push origin --tags
git远程代码覆盖本地
git强制覆盖:
git fetch --all
git reset --hard origin/master
git pull
git强制覆盖本地命令(单条执行):
git fetch --all && git reset --hard origin/master && git pull
git回退版本
git log #找到想要回退到的版本
git reset --hard [版本号commit]
git push -f #因为本地回退的版本落后于远端,必须-f才能推送
git推送代码
git push
git创建分支
git checkout -b feature #创建分支
git checkout feature #切换分支
git checkout -d feature #删除分支
vim feature.txt
git add .
git commit -m "feature hhh"
git push origin feature #会创建一个pull request链接,点击链接并创建
#如果没有问题的话可以点击Merge pull request进行两个分支的合并
git pull #要先pull再merge
git checkout master
git pull
git merge feature
git push
1.开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支
git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master
2.当master代码改动了,需要更新开发分支(dev)上的代码
git checkout master
git pull
git checkout dev
git merge master
git push -u origin dev
cherry-pick
git log #在主分支上的一个commit
git checkout test #跳到另一个分支test
git cherry-pick [commit版本号] #test pick一个相同的commit