一、谁赠予我们的
很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。
二、故事
Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。
Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了
三、常用命令
1、查看配置,创建关联
git init 初始化 git版本库
git config -l 查看 git 配置
// 本地 建立关联 远程仓
git remote add origin xxxx '自己在gitlab上构建项目的地址'
// 本地 删除关联 远程仓
git remote remove origin
'大部分情况下会 reject push origin master 首次push时';
// 需要建立一个 feat-xxx 开发分支。
// push origin feat-xxx 开发分支。
// 然后再 merge 到 master上 即可。
// 拉取原有项目
git clone
2、更换git 凭证
git credential -manager uninstall
git credential -manager install
3、依据远程稳定的master创建一个分支,跟本地没有关系,无冲突!
git checkout -b xxxx分支名
// 依据本地现有的分支,创建一个新的分支,跟远程没有任何关系 有可能冲突!
git checkout -b xxxx分支名 origin/master
// 依据远程稳定的master创建一个分支,跟本地没有关系,无冲突!
4、拉取更新
git fetch
git merge xxxx本地
git merge origin/远程仓名称
git pull origin xxx 等同于上面两个
5、修改上传
git add xxx
git add .
git commit -m “”
git commit —amend 合并最近的commit
git checkout — xxxx 撤销文件修改
git push origin xxxx
git push origin xxxx -f 强制上传
6、查看状态
git status
git diff
git log
git reflog
7、版本回退
git log
git reflog
git reset --hard 3628164
git revert 是生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留
git reset 是回到某次提交,提交及之前的commit都会被保留,但是此次之后的修改都会被退回到暂存区
8、防止过多的commit出现
git commit —amend -m”可选的是否改变你上次的提交信息!”
git push origin xxxxxx -f
9、分支管理
git checkout xxx
git checkout -b xxxx
git branch 查看
git branch xxx 创建
git branch -a
git branch -d xxx
10、让分支提交更好看
git pull —rebase origin master
git rebase -i HEAD^^(个数)
git rebase —continue //继续rebase
git rebase —skip //跳过本次
git rebase —abort //取消rebase
四、实际案例
2020年4月9日19:45
处理不能master 回滚的 代码回滚
方案一
git reset --hard xxx 版本回退
git push origin master -f
因为 我们的 -f 命令被禁用 。导致 覆盖不了 master ,回滚失败
方案二
step1:重新 提交 commit 修改远端 master,去掉 多添加的内容
1.1、 master reset 到 原先 的 commit
1.2、 本地修改一下 造成 冲突 卡住 MERGEING
1.3、git pull origin master --allow-unrelated-histories 造成冲突。
1.4、vscode 工具,处理冲突,并将新增的内容。全部回退。
1.5、以上操作 变成 删减 master 的 commit 提交到远端master 即可。
step2:步骤一情况 会导致 本地的 功能分支拉取 master,master 分支会删掉本地内容。处理方法
2.1、本地功能分支修改一下, 造成 冲突 卡住 MERGEING
2.2、git pull origin master --allow-unrelated-histories 造成冲突。
2.3、vscode 工具,处理冲突,并将删减的内容。全部回退。
2.4、以上操作 变成 去除删减 功能分支 的 commit 提交到远端功能分支 即可。
2020年5月22日09:40 处理分支合并master问题
4、问题来了,本地仓库在想做同步远程仓库到本地为之后本地仓库推送到远程仓库做准备时报错了,错误如下:
fatal: refusing to merge unrelated histories
(拒绝合并不相关的历史)
解决
出现这个问题的最主要原因还是在于本地仓库和远程仓库实际上是独立的两个仓库。假如我之前是直接clone的方式在本地建立起远程github仓库的克隆本地仓库就不会有这问题了。
查阅了一下资料,发现可以在pull命令后紧接着使用--allow-unrelated-history选项来解决问题(该选项可以合并两个独立启动仓库的历史)。
$git pull origin master --allow-unrelated-histories
五、Commit 通用标注
[feat] 添加了新功能
[refactor] 重构
[test] 测试
[fix] 修复了某个bug
[perf] 性能方面的优化
[chore] 构建过程、打包、或辅助工具的变动
[style] 修改了样式
[typo] 手误
[docs] 文档
[localize] 多语言等
六、Git 修改已提交的commit注释
两种情况
这两种情况下的修改大体相同,只是第一种情况最后会多一步下面来说怎么修改
先搞清楚你要修改哪次的提交注释或者哪几次的提交注释
1.修改最后一次注释
如果你只想修改最后一次注释(就是最新的一次提交),那好办:
1、git commit --amend出现有注释的界面(你的注释应该显示在第一行),
2、输入i进入修改模式,修改好注释后,
3、按Esc键 退出编辑模式,
4、输入:wq保存并退出。
ok,修改完成。例如修改时编辑界面的图:
2.未push远程仓,还在本地仓
2.1、修改之前的某次注释
1、输入:git rebase -i HEAD~2 最后的数字2指的是显示到倒数第几次
比如这个输入的2就会显示倒数的两次注释(最上面两行)
2、你想修改哪条注释 就把哪条注释前面的pick换成edit。方法就是上面说的编辑方式:i---编辑,把pick换成edit---Esc---:wq.
3、然后:(接下来的步骤Terminal会提示)git commit --amend
4、修改注释,保存并退出后,输入:git rebase --continue
其实这个原理我的理解就是先版本回退到你想修改的某次版本,然后修改当前的commit注释,然后再回到本地最新的版本
2.2、修改之前的某几次注释
1、同上
2、你可以将多个想修改的commit注释前面的pick换成edit
3、依次修改你的注释(顺序是从旧到新),Terminal基本都会提示你接下来的操作,每修改一个注释都要重复上面的3和4步,直到修改完你所选择的所有注释
3.已push到远程仓
1、首先,你把最新的版本从远程仓库先pull下来,
2、修改的方法都如上,最后修改完成后,
3、强制push到远程仓库:git push --force origin master
注:很重要的一点是,你最好保证在你强制push之前没有人提交代码,如果在你push之前有人提交了新的代码到远程仓库,然后你又强制push,那么会被你的强制更新覆盖!!!
最后,可以检查一下远程的提交记录~~