回顾Jungle写硕士论文时,虽不至于“披阅十载,增删五次”,但也费心思修改了很多次。每修改一次都得把之前的复制备份保存,下图是部分修改版本的截图。如果修改20次,那么本地计算机里就得保存20个版本的论文!不但占据本地空间,而且要查找某一次修改点时及其不方便。软件代码也是一样,如何管理日渐庞大的软件项目,Git和Github就是重要的版本控制和管理工具。
1.Git和Github
1.1.Git
Git 是一个免费并且开源的分布式版本控制系统,被设计用来快速、高效的管理一切从小到大的项目。
说分布式之前先了解下集中式。集中式版本控制系统的版本库存放在中央服务器,开发人员在开发前得从中央服务器获取最新的代码到自己电脑上,然后才可以工作。工作完了,再把新代码传到中央服务器去。缺点在于:
- 必须联网,否则不能访问中央服务器。而且如果网速慢,下载和上传代码会非常慢。
- 如果中央服务器出故障,不但开发人员无法工作,甚至服务器上的代码可能会丢失。
分布式版本控制系统,没有所谓的 “中央服务器” 。每一台电脑都有一个完整的版本库,每一台电脑都可以作为“中央服务器”。工作时并不需要联网。如果是团队协作的话,只需要把修改的文件推送给对方即可。
1.2.Github
GitHub 是一个利用 Git 进行版本控制、专门用于存放软件代码与内容的共享虚拟主机服务。
Github 社区地址: https://github.com
1.3.两者之间的关系
Github 是利用 Git 来进行版本控制的。所以 Git 对于 Github 来说只是一个用来管理项目的工具。但Github的功能远不止于此。
1.4.注册Github账号,本地安装git
登录https://github.com可以注册Github账号,在Git官网下载Git( http://git-scm.com/download/win)并安装。安装完成后鼠标右键单击,菜单中可出现Git bash,即安装成功。
安装完 Git ,设置用户名称与邮件地址。 这一步是必须的,每一个 Git 的提交都会使用这些信息,不可更改:
$ git config --global user.name "FengJungle"
$ git config --global user.email [email protected]
输入命令git config --list 可以查看所有配置。
2.Git常用操作实践
2.1.本地分支关联远程仓库
首先,登录Github账号,在Github上创建了一个新的仓库HelloWorld,这是一个新仓库,附带一个README.md文档。
然后,在本地创建了一个文件夹Git,如何让本地文件夹和远程仓库关联起来呢?两种办法:
(1)本地通过Git bash从远程上clone,这样本地就会有一个HelloWorld的文件夹,包含一个README.md文档。
(2)本地有仓库或代码,让本地和远程仓库关联:
$ git init
$ git remote add origin https://github.com/FengJungle/HelloWorld
这个时候可以通过下列命令查看远程地址:
$ git remote -v
origin https://github.com/FengJungle/HelloWorld (fetch)
origin https://github.com/FengJungle/HelloWorld (push)
但此时,本地和远程还没有关联起来,还需要进行下面的步骤,否则不能pull或push:
$ git branch --set-upstream-to=origin/master master
如果运行这一行命令后提示
fatal: branch 'master' does not exist
那么需要运行
$ git pull origin master --allow-unrelated-histories
或者可能是本地仓库不在master分支上,则checkout回本地分支
$ git checkout master
此时即可以pull代码了。
2.2. pull代码
$ git pull
2.3.管理本地代码
本地写了个打印Hello World功能的代码,保存在HelloWorld.c文件里。如何将其push到远程仓库呢?首先要了解下工作区和暂存区。本地代码(工作区)通过git add加入到暂存区(staged),暂存区代码通过git commit添加到本地仓库里。当然,暂存区的文件可以通过git reset HEAD <file>返回到本地工作区。通过git status可以查看每一个文件的状态。
总结如下:
加入修改了一个文件hello.c
$ git add hello.c # 将本地工作区的hello.c添加到暂存区
$ git reset HEAD hello.c # 将暂存区的hello.c撤销,返回到本地工作区
$ git status # 查看文件状态
$ git commit # 将暂存区的hello.c提交到本地仓库
修改了本地工作区的文件Hello.c,下列命令可以撤销该修改
$ git checkout Hello.c
2.4.push代码到远程仓库
$ git push
接下来在Github上就可以看到本地已经修改的代码了。
2.5.其他常用命令
$ git log # 查看历史提交
$ git reflog # 查看历史命令
3.学习网站
- 廖雪峰的官方网站:https://www.liaoxuefeng.com/wiki/896043488029600
- Learn Git Branching:https://learngitbranching.js.org/
- Pro Git book:https://git-scm.com/book/zh/v2
4.Git常见异常处理
Updates were rejected because the tip of your current branch is behind
在push的时候报“Updates were rejected because the tip of your current branch is behind”
这是由于远程repository和我本地的repository冲突造成。解决办法有两个:
1.强制push
git push -u origin master -f
但既然是强制的,就可能有风险,比如破坏远程的修改。
2.先pull,修改后再push
git pull
## 修改后
git push