内容来自廖雪峰大大的个人网站,个人笔记排版稍有不同
版本回退:
- HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
- 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
- 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
工作区,暂存区,版本库:
- git add命令实际上就是把要提交的所有修改(新建或者是修改)放到暂存区(Stage,就像购物车),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
- 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
- 因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改,分支也就是版本库.
- 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
- 第一次修改 -> git add -> 第二次修改 -> git commit
- 你看,我们前面讲了,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
- 现在,你又理解了Git是如何跟踪修改的,每次修改,如果不add到暂存区,那就不会加入到commit中。
撤销修改:
- 命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
- Git同样告诉我们,用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:
- git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
- 总之,就是让这个文件回到最近一次git commit或git add时的状态。
- git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
- 小结:
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
- 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
- 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件:
- 先添加一个新文件test.txt到Git并且提交(add并commit)
- 一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:
- 这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了
- 现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
- 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:$ git checkout -- test.txt
远程库:
- 要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
- 关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
- 此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
- 分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
- git clone
分支管理:
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
一条commit的时间线,每一次commit都是一个点,分支指向commit点,HEAD指向当前分支。
从现在开始,对工作区的修改和提交就是针对
dev
分支了,比如新提交一次后,
dev
指针往前移动一步,而
master
指针不变
假如我们在
dev
上的工作完成了,就可以把
dev
合并到
master
上。Git怎么合并呢?最简单的方法,就是直接把
master
指向
dev
的当前提交,就完成了合并
合并完分支后,甚至可以删除
dev
分支。删除
dev
分支就是把
dev
指针给删掉,删掉后,我们就剩下了一条
master
分支
创建分支:git branch dev
切换分支: git checkout dev
创建并切换:git checkout -b dev
查看当前分支: git branch
切换分支:git checkout
把
dev
分支的工作成果合并到
master
分支上:git merge <name>
删除分支:
git branch -d <name>