git基础概念
- 客户端并不只是提取最新版本的文件快照,而是把代码仓库完整的镜像下来
- git核心本质上是一个键值对数据库。可以向该数据库插入任意类型的内容,他会返回一个键值,通过该值可以在任意时刻再次检索该内容。
- git --version 查看版本
- git config
- git config --list 查看配置信息
- git config --system(系统配置)/–global(用户)/[空](工程)
- git config --global user.name “jcl12137”
- git config --global user.email “1292305370@qq.com”
- git config --global http.proxy ‘socks5://127.0.0.1:1080’ 设置ss
- git config --global https.proxy ‘socks5://127.0.0.1:1080’ 设置ss
- git config --global https.proxy http://127.0.0.1:1080 设置代理
- git config --global https.proxy https://127.0.0.1:1080 设置代理
- git config --global --unset http.proxy 取消代理
git目录下文件的介绍
- hooks (钩子函数的一个库 类似于回调函数)
- info (包含一个全局性的排除文件)
- objects (目录存储所有数据内容)
- refs (目录存储指向数据(分支)的提交对象的指针)
- config (文件包含项目特有的配置选项)
- description (显示对仓库的描述信息)
- HEAD (文件目前被检出的分支)
- logs (日志信息)
- index (文件保存暂存区的信息)
git使用流程
- git init (初始化仓库 生成.git文件)
- 配置仓库信息(git config等)
- git add ./ 首先将工作区(文件)做成git对象放到版本库 然后再放到暂存区 但是这里没 有生成树对象
- git ls-files -s 查看暂存区的当前状态
- git status 查看当前状态
- git diff 查看当先做的哪些更新没有暂存
- git diff --cached/–staged 查看哪些已经更新好了准备下次提交
- git commit -m ‘提交的信息’ 提交版本
- git commit 进入vim编写提交信息i、esc、:wq、:q
- git commit -a -m git自动将已经跟踪过的文件暂存起来一并提交***(尽量不用)***
- git log --oneline 查看提交历史记录
- git push origin main 将本地仓库存到远程仓库中
- git clone …git 下载仓库
- 给员工开放权限通过github里面的manage access contributor
- git fetch origin main 获取员工上传的代码
- git checkout origin/main 切换成远程跟踪分支
- git merge origin/main 合并远程跟踪分支
- git pull 获取数据并合并***尽量少用,容易出问题***
- git push origin --delete 分支名 删除远程分支
- git remote prune use --dry-run 列出仍在远程跟踪但是远程分支已经被删除的无用分支
- git remote prune use 清除上面的命令列出来的远程跟宗
打tag
- git tag [–list] 列出所有的tag
- git tag -l “1.*” 列出1.**的tag
- git tag v1.0 [hash] 给hash的树对象打tag
- git checkout -b v1.0 检查tag v1.0
- git tag -d v1.0 删除tag v1.0
- git push origin v1.0 上传v1.0的tag至远程仓库
- git push origin --tags 上传所有tag
重置rest
- git reset --soft HEAD(1, 2 …) 撤销前n次的commit add中的不修改、commit的hash不删除
- git reset [–mixed] HEAD(~, 1, 2…)同上,但add的已修改
- git reset [–hard] HEAD~ 同上,但add与工作区修改
分支
-
每一个功能都可以开一个分支,不影响主线的分支
-
分支就是一个活动的指针就在提交对象的前面指向最新提交
-
master默认是主分支
-
git branch 查看本地所有分支
-
git branch -a 查看本地与远程分支
-
git branch -v 查看分支的最后一个提交
-
git branch test 会在当前的提交对象上创建一个分支
-
git checkout test 将分支转到test上面来
-
git branch -D test 删除分支 不能自己删自己
-
git push origin --delete [branchname] 删除远程分支
-
git log --oneline --decorate --graph --all 查看完整的分支图(没删除前)
-
git config --global alias.lol ‘log --oneline --decorate --graph --all’ 配置别名
-
git branch test hash 新建一个test分支到hash所对应的提交对象上去 很重要
-
git checkout -b test 创建分支并且切换过去
-
git checkout name 切换分支的时候一定要提交完的时候再切否则会出现问题
每次切换分支前当前分支一定要是已提交状态 否则会污染主分支 如果第一次提交了再修改的时候没有提交他就不让切换分支了 -
git switch -c = git checkout -b
-
git merge hotbug(分支名) 合并分支
-
git branch -m oldBranchName newBranchName 更换分支名
冲突
- git本地操作的冲突
- 典型合并的时候
- git远程协作的时候
- push
- 两个人同时推(更改同一个文件)解决办法只能先把远程仓库拉下来 然后再更改那个 文件然后再add commit push
- pull
- 更改完以后不push 直接pull会报错 远程仓库会覆盖更改的内容建议push 不过push还会出错就是上面那个错误
- push
后悔药-反悔操作
- 工作区撤回在工作目录中的修改
- git checkout – filename/git restore 本质是相当于重置
- 暂存区撤回自己的暂存
- git reset HEAD filename/git restore --staged
- 提交区注释写错了修改注释
- git commit --amend
存储问题
- 解决的问题 不想过多的创建提交比如iss53那个分支
- git stash list 查看存储
- git stash apply 拿出栈顶的元素 但是不会消除
- git stash drop 名字
结论
-
一次完整的项目提交 包括至少一个提交对象 一个树对象 0或多个git对象
-
工作目录中文件只有两种状态 已跟踪(只要第一次add就跟踪上了) 未跟踪
-
已经跟踪的文件还有三种状态 已提交 已修改 已暂存
-
如果一个已经提交的文件再次修改要重新添加到暂存区否则显示已修改状态
-
如果一个文件暂存完了没有提交前还要在修改 这时会出现一个暂存一个已修改的情况需要重新add
-
分支就是为了保护代码方便更改存在的 假如master里面的提交对象完美了就可以在创建一个分支 添加功能如果可以就可以master合并 不行的话就可以删除这个分支 这样对于master没有影响
-
新建一个分支到一个提交对象上面 这样做的好处是实现版本回推但是不改边主仓库的东西 用完 删除这个分支就可以了特别方便
-
合并分支一定要注意顺序 后面的可能会过期还会存在bug 会产生冲突
- 快速合并 一条分支
- 典型合并 多条分支 会有冲突(打开冲突文件看哪里要留 然后暂存提交)
- 同事之间的冲突才是最麻烦的
参加开源项目的步骤 (pull request)
* 如果参加某个项目时,但是没有推送权限,这时候可以通过对这个项目进行fork。这会在
你的空间中创建一个完全属于你的项目副本,且你对其具有推送权限。通过这个方式项目的
管理者不用忙着添加贡献者,人们可以fork这个项目将修改推送到项目副本上,并通过pull
request来将他们的改动进入源版本库
1. 先将源仓库fork到自己的仓库
2. 然后clone到本地仓库
3. 更改后提交到自己的远程仓库
4. pull request
5. 管理人审核 然后merge
* 不重新fork怎么解决
* git 支持同时跟踪多个仓库
git remote add 别名2 地址
<!-- git remote rm 别名1 -->
git fetch 别名2
git branch -u 远程跟踪分支
git merge 对应的远程跟踪分支
git push (这里还是会提交到自己上面)
然后pull request
SSH
* github特有的一种协议 走的不是验证密码的道路而是密匙
* 配置步骤
* ssh -keygen -t rsa -C 邮箱名
* 在c:\users\Adminstor\.ssh下生成公私密匙
* ssh -T git@github.com 测试一下
* 把公共的密匙复制到github账户里面setting下
* 好处是不用每次输密码 而且项目经理不用设置贡献者 直接把他们的公共密匙复制到自己账户 就可以了
.gitnore文件
* 这个文件可以直接从github上下载
* 目的是不在git仓库上传不必要的文件