阅读完廖雪峰《Git 教程》一文后的一些记录,便于日后复习与查阅。
一、简介
Git 是什么?
Git是目前世界上最先进的分布式版本控制系统。
二、命令
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到(stage)暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
初始化一个 Git 仓库
1 | git init |
查看仓库当前状态
1 | git status |
添加修改至暂存区
1 | git add file |
查看文件修改内容
1 | git diff readme.txt |
添加修改至分支
1 | git commit -m "xxx" |
修改 commit message
1 | git commit --amend |
丢弃工作区的修改
1 | git checkout -- file |
查看 commit 历史记录
1 | git log --graph --pretty=oneline --abbrev-commit |
版本回退
1 | // 回退至上N个版本 |
版本回退后恢复
1 | // 查看历史命令 |
删除文件
1 | git rm file |
把当前工作现场“储藏”起来
1 | git stash |
恢复现场后继续工作
1 | git stash list |
github 仓库
全局设置
1 | git config --global user.name "wenj" |
初始化一个已存在的文件夹
1 | git init |
把一个已有的本地仓库与之关联
1 | git remote rename origin old-origin |
创建并切换至分支
1 | git checkout -b "dev" |
查看分支
1 | git branch |
删除分支
1 | git branch -d dev |
合并分支
1 | // Fast-forward “快进模式” |
查看远程库信息
1 | git remote -v |
在本地创建和远程分支对应的分支
1 | git checkout -b branch-name origin/branch-name |
建立本地分支和远程分支的关联
1 | git branch --set-upstream branch-name origin/branch-name |
解决冲突
现在,master分支和feature1分支各自都分别有新的提交,变成了这样:
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,
解决冲突后,master分支和feature1分支变成了下图所示
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样
rebase操作
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
特点: 把分叉的提交历史“整理”成一条直线,看上去更直观。
缺点: 是本地的分叉提交已经被修改过了。1
2
3git rebase
git log --graph --pretty=oneline --abbrev-commit
原本分叉的提交现在变成一条直线了!这种神奇的操作是怎么实现的?其实原理非常简单。我们注意观察,发现Git把我们本地的提交“挪动”了位置,放到了f005ed4 (origin/master) set exit=1之后,这样,整个提交历史就成了一条直线。rebase操作前后,最终的提交内容是一致的,但是,我们本地的commit修改内容已经变化了,它们的修改不再基于d1be385 init hello,而是基于f005ed4 (origin/master) set exit=1,但最后的提交7e61ed4内容是一致的。
创建标签
1 | git tag v1.0 |
删除标签
1 | git tag -d v0.1 |
推送标签到远程仓库
1 | git push origin v1.0 |