官网文档
https://guides.github.com/activities/hello-world/
版本库介绍
工作区有一个隐藏目录 .git (执行git init 会生成) ,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫index) 的暂存区,还有Git为我们自动创建的第一个分支 master,以及指向master的一个指针叫 HEAD。
git 的存储形式是对象,对象类型有三种:commit(是一个文件)、tree(是一个目录)、blob(是一个文件)。
.git 目录下几个关键目录:
HEAD:文件,存放当前分支的索引,如ref: commit号
refs:文件夹,存放heads、remotes、tags,即所有分支和tags的相关信息。
config:文件,存放git的配置信息,如username、user.email。
objects:git 的对象(即三种对象类型)之间的关系。
通过命令修改等价于直接修改以上文件内容,都会生效。
查看git管控的文件
git cat-file -t [hash-id] :查看 hash-id 对应的类型(三种);
git cat-file -p [hash-id] :查看 hash-id 对应的内容;
其中 [hash-id] 表示对象的唯一 hash标识。
gitk、sourceTree等 相当于 git log UI。
commit、tree、blob 三者之间的关系:
分离头指针:
HEAD 指向一个commit而非branch时,HEAD 的内容就是分离头指针。否则指向branch。
不要在HEAD指向分离头指针时修改提交内容,因为这样git会当作垃圾处理,一段时间后会清掉。要基于branch修改提交。
常用命令
修改commit message(注释)
- 修改当前commit message:
git commit --amend
- 修改老的以前的commit message:
git rebase -i 【要修改的commit的父亲的commitid】
,即重新变基到父commit。
这里要修改一堆老commit message,则可以通过选择他们的父类批量修改。
合并多个commit
合并多个连续commit:git rebase - 【父commitid】
再使用s命令
合并多个不连续commit:与连续的一样,只是要手动修改pick commit的顺序后,再使用s命令
删除commit/暂存区中文件
git rm 【文件名】
git commit -m "delete 文件名"
暂存当前修改
git stash
git stash apply
--弹出stash中的内容,并保存stash的栈索引使可一直使用
git stash pop
--弹出stash中的内容,并删除stash的栈索引
Git恢复之前版本的两种方法:
reset、revert。
reset:
如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
git reset --hard 【目标版本号】
revert:
如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。
git revert -n 【目标版本号】
并使用
git commit -m '添加注释'
提交。
reset、revert(图文详解):https://blog.csdn.net/yxlshk/article/details/79944535
回退代码
get reset --hard HEAD^
重置stage区和工作区,即擦除整个commit的内容
get reset --soft HEAD^
保留工作目录,并将commit的内容放进stage区
get reset --mixed HEAD^
保留工作目录,并将commit的内容、stage区内容都放进工作区
get reset HEAD^
同 get reset --mixed HEAD^
其中Git reset 三种模式详解: https://www.jianshu.com/p/c2ec5f06cf1a
备份
clone:
克隆到本地,
git clone 【远端仓库地址】
fork:
复制别人的仓库到自己的远端仓库:
https://editor.csdn.net/md/?articleId=104010332
直接在 github 上操作 fork。
本地仓库与远端仓库建立关系
git remote add 【远端仓库别名】【远端仓库地址】
本地现有项目添加git追踪并推到已有仓库(一般为空仓库)
cd existing-project
git init
git add --all
git commit -m "Initial Commit"
git remote add origin-name ssh://git@**
注:一个项目至少关联一个远端git仓库地址
git push origin-name master
本地现有被追踪项目要推送到其它origin仓库
cd existing-project
git remote set-url origin ssh://git@**
远端仓库同步信息到本地仓库
git fetch【远端仓库别名】【远端仓库指定分支】
--拉取远端仓库指定分支代码
git merge【远端仓库别名】【远端仓库指定分支
】–将从远端拉取后的代码合并到本地中
git pull
相当于 git fetch + git merge
本地commit强推到远端,会覆盖远端
git push -f origin master
git 三剑客
git gitlab github
工作中补充
链接:
常见问题收集
问题一描述
执行 git push origin 时报错,如下:
解决办法
执行
git remote add code-na2 git@github.com:code-na2/mos-mss.git
即发现远程仓库有问题,所以重新关联到新的远程仓库。
解决过程
- 查看本地配置
git config -- list 查看当前项目下所有 git 相关配置
配置结果:
credential.helper=osxkeychain
user.name=赵娜
user.email=zhaona12@meituan.com
url.https://.insteadof=git://
url.git://.insteadof=https://
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
remote.origin.url=https://github.com/gitna2/mos-mss.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.feature-5721399.remote=origin
branch.feature-5721399.merge=refs/heads/master
remote.upstream.url=https://github.com/gitna2/mos-mss.git
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/*
即包含用户名、邮箱、所有关联的远程仓库 remote(这里是origin、upstream)、及对应仓库下分支。
从结果发现远程仓库配置url有问题,故可删除现有错误配置,重新设置远程仓库。
- 重新关联现有远程仓库相关设置或直接新建一个远程配置
先删除现有 origin 关联(直接新建远程配置时不用):
git remote remove origin
再添加新的远端仓库并设置别名,这里使用别名 code-na2:
git remote add code-na2 git@github.com:code-na2/mos-mss.git
- 查看本地仓库下 branch
git branch -r
发现没有关联分支,所以要拉取代码:
git fetch code-na2
这样,再执行:
git push origin feature-5721399
就成功了
涉及关键命令
git config -- list 查看当前项目下所有 git 相关配置
git remote remove origin 删除现有远端仓库关联
git remote add code-na2 git@github.com:code-na2/mos-mss.git 添加远端仓库关联
git fetch code-na2 从远端拉去分支
git branch -r 本地所有仓库下 branch