git的使用
git 基本使用
git 分为 3 个区
- 工作区 —— 存放文件
- 暂存区 —— 工作区变更,提交到暂存区
- 版本库 —— 暂存区的内容,提交到版本库
status 颜色
- 红: 工作区变更了,但是没有提交到暂存区,此时
git checkout .
会撤回变更无法找回 - 绿: 已经提交到暂存区
- 无: 都被 git 管理起来了
1 | git status # 查看文件状态(红) |
1 | git commit -m '注释' # 暂存区 -> 版本库 |
空文件夹不会被 git 管理
git 忽略文件
- 根目录下新建
.gitignore
文件 - 在里面写需要忽略的文件
1
2
3mode_models # 直接忽略该目录
.idea # 忽略 该文件
*.log # 忽略 以.log结尾的文件
git 多分支
小公司常用方案: master 分支、dev 分支、bug 分支 、个人分支
以前默认 master 是主分支, 现在默认 main 分支
常用分支操作
1 | git branch #查看已建立的分支 |
git pull:
- 暂存区 工作区 版本库 都会被替换成远程仓库分支的版本。
git 搭建远程仓库
github:
创建一个空仓库
本地:
1 | git init |
origin: 在本地仓库中对远程仓库起的别名, 一般叫 origin
1 | git clone 仓库地址 |
拉取远程仓库到本地
1 | git fetch <remote> [place] # 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你磁盘上的文件。 |
推送本地到远程仓库
1 | git push <remote> [place] # 本地的远程分支同步改变 |
git push origin main
则是,把main分支推送到origin仓库里
git push origin main --force
强制推送
跟踪本地的远程分支
1 | git branch -u origin/main foo |
git push origin :foo
删除远程仓库的foo分支
git fetch origin :bar
在本地创建一个bar分支
回退
1 | git reset --hard 版本号/分支名 #本地版本回退, 版本号可以git log 看到 |
整理提交记录 git cherry-pick
git cherry-pick 版本号
指定某些提交记录复制到当前所在的位置(HEAD
)下面的话
- 例如
git cherry-pick c1 c2 c3
标签 tag
唯一标记一个节点,不可移动
git tag <tagname> 节点
不过不带节点,默认标记HEAD所指节点
git describe 节点
- 查找距离这个节点最近的tag
- 节点省略默认是HEAD
- 输出格式
<tagName>_<step>_g<hash>
公司常见git使用情况
- 每个人在仓库里有自己的分支
- 每个人先fork到自己仓库
push不上 – 冲突
- 没有权限
- 本地版本比线上落后
- 解决:先
git pull
一下 - 解决:变基 rebase
1
2git checkout feature #切换到feature分支
git rebase master #
- 解决:先
rebase
执行上面两行代码后
原理:当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向主分支的最新提交,最后将刚才提取的修改应用到主分支的最新提交的后面。
如果B后面没有M git rebase
就与git merge
没有区别
冲突情况
- 多人开发同一分支
- 不同分支同一文件被修改,然后 merge
解决: 多 pull
情况一
远程已经更新到新版本,而自己基于旧版本的新代码怎么发布
解决方法1
1 | git fetch |
解决方法2
1 | git fetch |
情况二
远程服务器拒绝 可能是main被锁定了, 需要一些
Pull Request
来合并修改。如果你直接提交(commit)到本地main, 然后试图推送(push)修改, 你将会收到这样类似的信息:
1 ! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)
解决方法
创建一个新分支