概念
所有的版本控制系统,其实只能跟踪文本文件的改动,比如 TXT 文件、网页、所有的程序代码等等。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从 100KB 改成了 120KB。Microsoft 的 Word 格式是二进制格式,因此,版本控制系统是没法跟踪 Word 文件的改动的。
工作区:就是你在电脑里能看到的目录。
版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区。
还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。
配置姓名和邮箱
|
|
--global
参数表示这台机器上所有的 Git 仓库都会使用这个配置。当然也可以对某个仓库指定不同的用户名和 Email 地址。
本地仓库
命令 | 说明 |
---|---|
git init | 在当前目录下会自动生成 .git 隐藏文件夹,该隐藏文件夹就是 git 版本库。 |
git add <file> | 将文件添加到暂存区(将目标文件加入跟踪列表)。 |
git add -A | 将所有文件添加到存储区。 |
git add -f App.class | 强制添加。被 git 忽略的文件也可以强制添加。 |
git commit –m "message" | 将暂存区文件提交到版本库。-m 参数为提交说明。 |
git status | 显示工作目录和暂存区的状态。 |
git log --pretty=oneline | 显示提交日志。--pretty=oneline 只显示 commit id 和描述。 |
git reflog | 查看命令历史。 |
git diff <file> | 比较当前文件和暂存区文件差异。 |
git diff HEAD [<path>...] | 比较工作区与最新本地版本库。 |
git reset --hard HEAD^ | 将当前 HEAD 复位到指定状态。HEAD 表示当前版本,HEAD^ 表示上一个版本,HEAD^^ 表示上上一个版本,HEAD~100 表示前 100 个版本。Git 的版本回退速度非常快,因为 Git 在内部有个指向当前版本的 HEAD 指针。当你回退版本的时候,Git 仅仅是改变 HEAD 指向。 |
git reset HEAD <file> | 把暂存区的修改撤销掉,重新放回工作区。 |
git checkout --file | 文件在工作区的修改全部撤销。文件没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;文件已经添加到暂存区后,撤销修改就回到添加到暂存区后的状态。 |
git rm file | 删除文件,同时还会将这个删除操作记录放到缓存区。 |
分支管理
命令 | 说明 |
---|---|
git checkout master | 切换分支。 |
git branch | 查看当前有哪些分支。当前分支前面有个星号。 |
git branch dev | 创建分支 dev。 |
git branch -d dev | 删除 dev 分支。 |
git branch -D dev | 强制删除 dev 分支。 |
git branch dev origin/dev | 创建远程 origin 的 dev 分支到本地。默认克隆只有master分支。 |
git checkout -b dev | 创建并切换到 dev 分支。 |
git merge dev | 将当前分支合并到 dev 分支。 |
git merge --no-ff -m "merge with no-ff" dev | 将当前分支合并到 dev 分支。--no-ff 参数,表示禁用快速模式。普通模式:当前分支合并时会提交到版本库,不是简单的变更指针指向。 快速模式:把当前分支指向指定分支。 |
git log –graph | 查看分支合并图。 |
分支策略
master 分支称为主分支,HEAD 表示指向当前分支。
master 分支应该是非常稳定的,dev 分支是不稳定的。1.0 版本发布时,再把 dev 分支合并到 master 上,在 master 分支发布 1.0 版本。每个人都在 dev 分支上干活,每个人都有自己的分支,时不时地往 dev 分支上合并。
在 master 分支修复 bug,必须新建 bug 分支,修复完切换到 master 分支合并 bug 分支。
在 dev 分支上开发新功能,新建 Feature 分支,新功能开发完毕切换到 dev 分支合并,如果不想合并必须强制删除。
总结:
- master 分支是主分支,因此要时刻与远程同步。
- dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步。
- bug 分支只用于在本地修复 bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个 bug。
- feature 分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
status
命令 | 说明 |
---|---|
git stash | 会把所有未提交的修改(包括暂存的和非暂存的)都保存起来。便于切换其他分支,修改其它分支的代码。 |
git stash list | 列出通过 stash 储藏的修改。 |
git stash apply stash@{0} | 恢复 stash@{0}。 |
git stash drop stash@{0} | 删除 stash@{0}。 |
git stash pop | 恢复的同时把stash内容删除。 |
标签管理
命令 | 说明 |
---|---|
git tag <name> | 给最近的 commit 打上标签。tag 就是一个让人容易记住的有意义的名字,它跟某个 commit 绑在一起。 |
git tag v0.9 f52c633 | 给指定 commit id 打上标签。 |
git tag | 显示所有标签。 |
远程仓库
命令 | 说明 |
---|---|
git remote add [shortname] [url] | 添加远程仓库关联。shortname 只能对应一个 url。 注意:推送代码前必须先关联远程仓库。 |
git remote | 不带参数,列出已经存在的远程连接。 |
git remote –v | 列出远程连接,并显示对应 url。 |
git remote remove <name> | 删除远程仓库。 |
git push <远程主机名> <本地分支名>:<远程分支名> | 将本地分支的更新,推送到远程主机。 |
git push origin master | 将本地的 master 分支推送到 origin 主机的 master 分支。如果 master 不存在,则会被新建。 |
git push -u origin master | -u 选项指定一个默认主机,这样后面就可以不加任何参数使用 git push。 |
git push origin :master | 删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。 |
git push –all origin | 推送所有分支。 |
git push -f origin dev:master | 强制推送。 |
git clone <版本库的网址> | 本地主机生成一个目录,与远程主机的版本库同名。 |
git clone <版本库的网址> <本地目录名> | 如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。 |
git pull <远程主机名> <远程分支名>:<本地分支名> | 拉取远程主机某个分支的更新,再与本地的指定分支合并。 |
git fetch <远程主机名> <远程分支名>:<本地分支名> | git fetch 和 git pull 类似,但不会自动合并当前分支。 |
git branch --set-upstream debug origin/debug | 将本地 bug 分支与远程的 bug 分支关联。解决拉取时 git 提示 no tracking information 的问题。 |
克隆和拉取
clone 是本地没有 repository 时,将远程 repository 整个下载过来
pull 是本地有 repository 时,将远程 repository 里新的 commit 数据(如有的话)下载过来,并且与本地代码 merge。