关于版本控制
什么是版本控制?我为什么要关心它呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。我们除了可以对软件代码作版本控制管理之外,还可以在其他方面也实行版本控制,可以对任何类型的文件进行版本控制,例如多人协作完成大型的文学作品的时候。
版本控制又分为:
- 本地版本控制系统
- 集中式版本控制系统
- 分布式版本控制系统
为什么使用版本控制(好处)
使用版本控制,方便多人协作开发时的代码合并;
可以使我们对文件,代码等的修改情况有一个清晰的记录,当新的修改不满意时,可以准确的回滚到先前的版本;
当本地代码因各种原因损坏时,可以迅速的从仓库还原至本地;
同时当多人协作的时候,可以明确成员各自做了什么修改,当代码/文本等产生bug的时候便于追根溯源.
常用工具
- SVN(集中式)
- Git(分布式)
注意 git ≠ GitHub,一个是工具,一个是平台
Git的安装
在 Linux 上安装
在Linux安装,以CentOS 上为例,一般使用 yum的方式:
$ sudo yum install git
其他Linux版本参考Git 官方网站上的各种系统的安装步骤,网址为 http://git-scm.com/download/linux。
在 Mac 上安装
在 Mac 上安装 Git 有多种方式。 最简单的方法是安装 Xcode Command Line Tools。 Mavericks (10.9) 或更高版本的系统中,在 Terminal 里尝试首次运行 git 命令即可。 如果没有安装过命令行开发者工具,将会提示你安装。
或者前往下载相关安装包:http://git-scm.com/download/mac。
在 Windows 上安装
在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开 http://git-scm.com/download/win,下载会自动开始。 要注意这是一个名为 Git for Windows的项目(也叫做 msysGit),和 Git 是分别独立的项目;更多信息请访问 http://msysgit.github.io/。
另一个简单的方法是安装 GitHub for Windows。 该安装程序包含图形化和命令行版本的 Git。 它也能支持 Powershell,提供了稳定的凭证缓存和健全的 CRLF 设置。 稍后我们会对这方面有更多了解,现在只要一句话就够了,这些都是你所需要的。 你可以在 GitHub for Windows 网站下载,网址为 http://windows.github.com。
配置
用户配置
如下配置一次,避免后面每次操作都需要输入用户信息
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
安装完成后,使用Git还需要做一些配置用于向远程仓库拉取和推送代码,其中需要在本地生成私钥和公钥文件,以Mac为例,执行以下命令:
ssh-keygen -t rsa -C "xxx@hauxi100.com"
最后可以在 ~/.ssh
目录下找到生成的 id_rsa
和 id_rsa.pub
文件,即相应的私钥和公钥,用编辑器打开查看id_rsa.pub 复制其中内容到GitHub或者GitLab用户中心相关的设置中,就可以开始使用Git了.
开始使用
1.对本地现有项目进行Git管理
进入项目根目录并使用如下命令进行初始化:
git init
这样会在项目根目录生成.git目录,其中含有相关的文件
接下来需要将项目中的全部文件加入版本控制
git add *.c
并提交到第一个版本,加入说明
git commit -m '第一次提交初始化版本'
2.从仓库获取项目
此时需要知晓仓库地址并进行git clone
操作,仓库地址在GitHub/Gitlab网站上可以看到 例如成都范儿项目:
git clone git@**.***.***:****/***.git
等待项目克隆完毕即可开始开发,上述命令后跟上自定义目录名可以将项目克隆到指定目录中
使用git remote -v
列出远程仓库
使用git remote show origin
查看远程仓库更多信息
3.提交第一次修改
每次当对项目进行修改,删除,新增后需要提交新版本时,需要执行以下命令:
git status
用于查看有何变化,这会列出当前项目的变化情况,包含较于上一版本有变化的文件信息
On branch production
Your branch is up to date with 'origin/production'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: ../****/***/***/VoteController.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
../***/***/****/laravel-debugbar/
no changes added to commit (use "git add" and/or "git commit -a")
此时我们应该将状态为modified
的文件加入新版本中执行:
git add ../****/***/***/VoteController.php
git commit -m "这是一次提交,修改了某某文件...."
此时完成了一次提交,但是并没有推送到远程仓库中,还需要:
git push
这样这个版本的代码已经推送到远程仓库,其他用户执行git pull
(相当于fetch => merge)即可拉取到刚刚推送的修改(也可使用git push origin xxxx
来推送到指定分支)
4.进一步操作
每次需要向仓库做操作时应该先执行git status
查看当前项目有哪些发生变化;
查看尚未add
的文件相比之前发生什么变化,使用git diff
命令(这个命令本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动);
需要查看最近提交过哪些版本时,使用git log
查看版本信息(包含版本号,提交者,提交时间等),其中git log -p -2
可以查看最近两次提交的内容差异
合并
git merge xxx
解决冲突
有时候合并会遇到文件冲突,需要先git status
查看冲突情况,并且手动去解决冲突文件,然后使用git add
文件
当把错误代码提交到commit时,需要使用git reset --hard xxxx
来撤销这条commit
当错误代码已经push到仓库,使用git revert xxxx
来撤销push
- 如果出错内容在私有 branch:在本地把内容修正后,强制 push (push -f)一次就可以解决;
- 如果出错内容在 master:不要强制 push,而要用 revert 把写错的 commit 撤销。
5.在IDE中使用Git(PHPstorm)
项目中右键->git->各个详细操作
其他
在 Git 中有一个特殊的文本文件:.gitignore
。这个文本文件记录了所有你希望被 Git 忽略的目录和文件。
常用命令
git checkout ##检出 (用于创建/切换分支),**慎重使用**
git status ##查看当前项目状态(修改,新增,删除等)
git checkout -b ##检出(指定分支)
git commit ##提交版本
git diff ##比较文件差异
git add ##提交指定文件到版本
git clean ##删除所有没有被版本控制过的文件
git fetch --prune ##从仓库获取内容
git pull --ff-only ##获取内容并且合并
git branch ##查看当前分支名
git branch -d xxx ##删除分支
git push ##推送
git merge xx ##合并分支
git rm ##删除文件
git mv ##移动文件 相当于mv => rm => add操作
git rebase ##高级合并
git reset ##撤销commit
git revert ##撤销push
git push origin :yourbranch ##推送到指定分支
部分内容参考出处 Git 原理详解及实用指南