学习建议
廖雪峰Git教程 比较详细,可操作性也比较强,在评论区可以找到勘误
Git官方推荐的《Pro Git》也很不错,推荐掌握了一定Git基础后再看
对于没有Linux基础,或者文字版学起来比较困难的朋友可以看系列视频教程 互联网人都该懂点 Git
注意点
Git 2.23 (2019.8.16)
git checkout 这个命令被拆分成了两个新命令:git switch 和 git restore
创建并切换到dev分支:git checkout -b dev 现在用git switch -c dev 效果相同
初始配置
安装Git Bash后需要做初始配置
- 用户名邮箱
1
2
3
4
5
6
7
8# 任意文件夹右键 点击“ Git Bash Here ”
# ""内替换为自己的用户名和邮箱
git config --global user.name "username"
git config --global user.email "email"
# 查看配置是否成功
git config user.name
git config user.email - SSH 免密登录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# ssh-keygen 用于生成,管理和转换身份验证密钥
# -t:密钥的类型
# -C:用于识别这个密钥的注释(不添加注释直接ssh-keygen -t rsa也不影响使用)
ssh-keygen -t rsa -C "邮箱地址"
# 连续按3次回车
# 将用户目录下.ssh文件夹内的id_rsa.pub的内容粘贴到GitHub的SSH Keys中
# 具体位置:GitHub Settings -> SSH and GPG keys -> SSH keys
# 测试是否成功 Github
# 码云测试命令为:ssh git@gitee.com 反馈的结果与 GitHub 类似
ssh git@github.com
# Are you sure you want to continue connecting (yes/no)?
# 这时需要输入:yes
#成功会提示成功认证你的账户
# Hi aaronlinv! You've successfully authenticated, but GitHub does not provide shell access.
# Connection to github.com closed.
场景0:Git 基本使用
1 | # 新建文件夹,初始化为Git仓库 |
push 是可能会遇到报错:refusing to merge unrelated histories
原因是远程仓库和本地仓库做了不同的改变并commit,导致本地仓库和远程仓库变成了独立的两个仓库,所以不能直接合并,执行以下命令即可推送
1 | git pull origin master --allow-unrelated-histories |
场景1:克隆仓库
1 | # 克隆仓库到本地(可以使用HTTPS或者SSH协议) |
场景2:分支管理
1 | # 已经克隆仓库到本地 |
merge 和 rebase
创建冲突场景
1 | # 新建文件夹,初始化为Git仓库 |
到这c2就产生了分叉,experiment分支推进到了c4,master分支推进到了c3
这个时候如果想把两个分支的修改合并到master分支上,可以使用merge或rebase(变基),两种方式最后合并的结果是一样的,但rebase不会产生分叉,rebase的提交历史也比merge更线性
merge
1 | # 使用merge方式合并分支 |
— merge示意图 引用自《Git Pro》
使用merge合并分支,相当于三方合并,合并c2,c3,c4(未新建experiment分支前的修改c2、新建分支后master分支的修改c3、experiment分支的修改c4)
直接使用git merge <要被merge的分支名> ,没有冲突的情况下默认使用参数:–f 即:Fast-forward(快进式合并)
推荐使用–no-ff 即:git merge –no-ff <要被merge的分支名>
这个参数的意思是禁止快进式合并,合并时会自动创建一次commit提交,保证提交链的完整性
而Fast-forward合并分支会丢掉分支信息
rebase
1 | # 使用rebase方式合并分支 |
— rebase示意图 引用自《Git Pro》
rebase的原理是:找到c3和c4共同的祖先c2,暂存共同祖先c2到当前分支(expriment)的修改内容,然后将分支指向master的c3,并应用之前暂存的修改内容
我们可以这么理解:
rebase就是先把其他分支(master)已经提交的代码(c3)放到前面,把当前分支(experiment)提交的修改(c4)放到后面,这样做的好处就是:自己写代码(experiment分支上的)将出现在master最新的一次commit中,一目了然
rebase:黄金法则:绝对不要在公共分支使用rebase,rebase会重写提交历史
参考资料
ssh-keygen的-C后面的邮箱有什么用?
Git 合并时 –no-ff 的作用
记Git报错-refusing to merge unrelated histories