引言
git是一个优秀的版本控制系统。如果没有实际的应用场景,初学者只是学习git的相关命令可能会感觉到很吃力。因此整理一篇指导教程,介绍不同场景下,git的基本使用流程。
一: 可以在本地做熟练的管理代码。
小明是个程序猿,很喜欢参加各种编程比赛。在参加比赛的过程中, 小明写了大量的代码,都保存在集成开发环境中。 随着比赛的进行,小明遇到了几个头疼的问题:
- 问题一:为了提高比赛的排名,小明尝试了三种不同的算法,每次只需要调用一个算法,通过不同的函数调用来执行相应的算法,随着代码量越来越多,代码也越来越臃肿,想把这三种方案独立放在三个项目中,可是这样又太麻烦了。。
- 问题二: 小明发现这几天的代码得到的分数,还没有一周前提交的代码效果好,可是代码已经改动了这么多了,如何才能回到一周之前的代码呢?
- 问题三: 小明每天都在辛辛苦苦的写代码,却没有地方记录每天代码的改进,这样下来,忙了好几天,都不好总结反思了。。。
小明在百度搜了一圈, 终于发现了一个强大的工具 – Git; 从此,小明便开始了探索Git的奇妙之旅。
Git简介:
Git 是一个开源的分布式版本控制系统,可是小明不懂这些,只要这个工具能管理好自己的代码就行了。
通过在网上查资料,小明终于安装上了git工具。
小明开始初始化了自己的第一个git仓库, 创建了一个文件夹,并执行
git init
小明往git 仓库里面放了两个代码文件,a.c, b.c;
虽然文件是放到git 目录下面了,可是还没有纳入git的版本控制, 执行
git add a.c
git add b.c
git commit -m "This is xiaoming's frist git !!!"
- 场景:小明苦思冥想,在比赛中又想出了一套新的方案, 想要从头开始搭建代码,这种情况下, 需要重建个工程项目吗?不需要,因为小明使用了git。
于是小明创建了一个新的分支
git checkout -b testing
# 等同于下面
git branch testing
git checkout testing
# 如果想删除分支
git branch –d 分支名
- 场景:小明提交了几次commit, 后悔了,想回退自己的提交记录:
git log 命令,查看分支提交历史,确认需要回退的版本
git reset --hard commit_id 命令,进行版本回退
git push origin 命令,推送至远程分支
如果想直接回退到上个版本,可以使用快捷命令
git reset --hard HEAD^
小明还搜到了, 回退代码有两种方式: reset
和revert
,在这里整理了一下区别:
其实要回退代码,这两个都可以使用,可以根据需求选取不同的命令。
-
如果想把代码回滚到某个时间点的commit, 其实reset 和revert都可以, 只不过reset方便一些
-
如果想只回滚中间某一个commit,这时需要是使用revert, d
git log 查看历史提交的记录
git revert -n 97ea0f9
git commit -m "恢复第三次修改"
- 场景: 小明想在所有的分支里,都加一个日志
log_info "XiaoMing is very clever!"
这种情况下,小明应该可以切换到每一个分支,然后手工的加日志,不过,因为小明使用了git,所有使用了其强大的cherry pick的功能 。
# 先切到要修改的分支
git log 查询历史提交记录
git cherry-pick <HashA> <HashB>
- 场景: 小明在分支提交了大量的不错的commit,觉得这些代码可以合入到master分支了。这时可以使用merge的方式(这个是不是和cherry-pick有点像?)
git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master
二: 开始有一个远程的仓库
小明使用git已经可以熟练的管理自己的代码了,不过用着用着,小明就在想,我的代码现在也只是保存在本地,要是可以把自己写的代码提交到网上保存,就不怕电脑挂掉导致自己的代码丢失了, 于是小明开始行动了。
首先需要配置一下git 全局用户名和用户邮箱(其实小明也不知为啥要配置这个)
git config --global user.name "your username"
git config --global user.email "your Email"
推送仓库之前,还需要添加SSH秘钥
ssh-keygen -t rsa -C "您的email"
cat ~/.ssh/id_rsa.pub
然后把这个秘钥复制到远程的SSH秘钥中即可。
添加远程的仓库:
git remote add origin ${小明的远程仓库}
小明把代码推送到远端
git push -u origin master
# 上面的命令, 加了-u 参数,会做一个关联, 后续push或pull会方便许多。
删除分支的命令总结
随着分支的不断增加,小明发现有的分支不需要了, 想清理一下,就进行了如下的操作:
# 看一下一共有哪些分支的
git branch -a
# 删除远程仓库的分支,则执行如下所示的命令:
git push origin -- delete 分支名
# 删除本地的分支
git branch –d 分支名
# 举个例子:
git branch -d 1.5.3-issue-exporter
git push origin --delete 1.5.3-issue-exporter
git push origin --delete 1.5.3-issue-wsr
三:使用git 协同开发代码
小明在比赛的过程中,小张也加入了进来, 于是两个人一起写代码,分工合作。 可是两个人写的代码如何才能合并到一起呢?手工把函数一个一个的复制吗?其实不需要,因为他们使用了git。
小张把小明的代码pull下来了:
git clone 小明的git地址
然后小张commit了好几次代码
小张把clone的代码上传到自己的远程库
git push -u origin master
场景:小张把自己的代码merge到小明的代码库
这一步的操作,好像不能通过git的命令解决, 需要先登录到小张的远程操作中,在前台页面点击合并请求的按钮,选择源分支
和目标分支
,确定后即可建立合并请求。
场景: 小张把小明的最新提交,下载到本地来
# 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master:brantest