Git命令行操作
本地库初始化
进入文件夹
1 | git init |
设置签名
这里设置的签名和GitHub中的用户,密码没有关系。
项目(仓库)级别
仅在当前本地库有效
1
2git config user.name tom #设置用户名tom
git config user.email liu@qq.com #设置用户邮箱系统用户级别
仅在当前登录的操作系统用户有效
1
2git config --global user.name tom
git config --global user.email liu@qq.com
仅仅加了一个
--global
优先级别:
项目级别
>系统级别
项目级别的作用范围更小,类似于局部变量 > 全局变量。二者必须要有其一。
信息保存位置:
~/.gitconfig 文件
查看方式:
cat .git/config
查看当前用户(global)配置
git config --global --list
查看当前仓库配置信息git config --local --list
基本操作
状态查看
1 | git status #查看工作区、暂存区状态 |
添加
1 | git add fileName #指定文件 |
提交
1 | git commit -m 'commit message' fileName |
查看历史记录
1 | git log |
前进后退
基于索引值
推荐
1
2git reset --hard 指针位置
例子:git reset --hard a6ace91 #回到这个状态使用 ^ 符号
只能后退
1
git reset --hard HEAD^例子:git reset --hard HEAD^^注意:几个 ^ 表示后退几步
使用 ~ 符号
只能后退
1
git reset --hard HEAD~n例子:git reset --hard HEAD~3
reset的三个参数比较
1 | soft: - 仅本地库移动HEAD 指针 |
删除文件并找回
相当于建立一个快照,虽然删除了,但只要添加到暂存区,就能找回
如果文件删除之后已经commit了,那么在log里就有有一条记录,这时,使用
git reset --hard 指针位置
来还原。如果删除文件之后只是add,没有commit,那么log中没有新的记录,使用
git reset --hard HEAD
来刷新工作区。
文件差异比较
1 | git diff 文件名 #工作区文件和暂存区比较 |
分支管理
什么是分支管理
- 在版本控制中,使用推进多个任务
分支的好处
同时并行推进多个功能开发,提高开发效率
某一分支开发失败,不会对其它分支有任何影响
分支操作
- 创建分支
1 | git branch 分支名 |
- 查看分支
1 | git branch |
- 切换分支
1 | git checkout 分支名 |
合并分支
相当于把修改了的文件拉过来
第一步:切换到接收修改的分支名上
git checkout [分支名]
第二步:执行merge命令
git merge [分支名]
- 删除分支
1 | git branch -d 分支名 |
解决冲突
冲突的表现
冲突的解决
- 第一步:编辑,删除特殊标记
<<<
===
- 第二步:修改到满意位置,保存退出
- 第三步:添加到缓存区
git add 文件名
- 第四步:提交到本地库
git commit -m '日志信息'
- 注意:后面一定不能带文件名
- 第一步:编辑,删除特殊标记
Git 结合Github
创建远程库地址别名
1 | git remote -v |
推送
开发修改完把本地库的文件推送到远程仓库
前提是提交到了本地库才可以推送
1 | git push 别名 分支名 |
克隆
完整的把远程库克隆到本地`克隆下来后不要在主分支里面做开发
`clone进行一次,从无到有的过程,更新用pull
1 | git clone 远程地址 |
常见建立仓库方式
- 建立仓库 —> 打开空文件夹(还没有项目) —> 克隆下来
- 建立仓库 —> 打开项目文件夹(已经有项目)—> 初始化仓库 —> 设置remote仓库链接
拉取
pull = fetch + merge
把远程库中的内容拉取到本地库,但是在本地库没有 被更新,这个时候当前分支(本地库)是看不到变化的,只有进入origin/分支名
才能看到变化。这个时候在本地的分支执行merge命令之后才能在本地的分支看到变化。
本地存在clone下来的文件 就用pull更新
1 | pull = fetch + merge |
解决冲突
注意:解决冲突后的提交是不能带文件名的
- 如果不是基于GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
- 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
rebase
提交记录简洁不分叉
没学懂,感觉有点鸡肋
混眼熟
1 | git rebase -i 索引号git rebase -i HEAD~3 #合并最近三条记录说明:在vim编辑里面改成s |
beyond compare
用软件解决冲突
1 | 1.安装 : beyond compare 2.配置: git config --local merge.tool bc3 #合并名称 git config --local mergetool.path '/usr/local/bin/bcomp' #软件路径 git config --local mergetool.keepBackup false #False不用保存备份3.应用: git mergetool说明:--local指只在当前操作系统有效 |
跨团队合作
代码review之后合并
适用于个人
邀请成员:
Settings
—>Collaborators
—>填写用户名
—>打开链接接受邀请
企业
创建一个组织
方便管理
review
组织做review
通过Pull request
给开源社区共享代码
点击别人仓库的fork 到自己的仓库
— >然后clone下来 修改后推送到远程库
—>点击Pull Request请求
—>Create pull request发消息
Tag标签
为了清晰的版本管理,公司一般不会直接使用commit提交
1 | git tag -a v1.0 -m '版本介绍' #创建本地tag信息git tag -d v1.0 #删除taggit push origin --tags #将本地tag信息推送到远程库git pull origin --tags #拉取到本地git checkout v.10 #切换taggit clone -b v0.1 地址 #指定tag下载代码 |
SSH 免密登录
进入当前的家目录
1
$ cd ~
删除
.ssh
目录1
$ rm -rvf .ssh
运行命令生成SSH密钥目录
1
2
3$ ssh-keygen -t rsa -C [Github邮箱]
或者
$ ssh-keygen (会让你设置SSH的登录密码,可以不输入,一直Enter)进入.ssh目录查看文件列表
1
2$ cd .ssh
$ ls -la查看
id_rsa.pub
的内容1
$ cat id_rsa.pub
在GitHub上建立SSH Key, 把刚刚生成的ssh密钥填进去。
保证本地库对应的远程库是SSH方式的。
如果没有:
1
git add remote origin_ssh[(这是别名) [SSH地址]
然后就可以愉快的push啦~~
1
2
3git push [别名] [分支名]
# 这里要注意,如果你在本地库只建立了一个远程地址,
# 那么不用使用[别名]和[分支名]。如果有多个才要使用。
Git工作流
概念
1 | 在项目开发过程中使用Git的方式 |
分类
集中式工作流
像SVN一样,集中式工作流有一个中央仓库,所有的修改都提交到了Master分支上
GitFlow工作流 *
主干分支master
开发分支develop
修复分支hotfix
预发布分支release
功能分支feature
GitFlow 有独立的分支,让发布迭代过程更流畅。
Forking 工作流
在 GitFlow 基础上, 充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。 安全可靠地管理大团队的开发者