几个基本操作
-
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage)
- 执行
git commit
就可以一次性把暂存区的所有修改提交到分支
管理修改
Git跟踪并管理的是修改,而非文件
什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
每次修改,如果不add
到暂存区,那就不会加入到commit
中。撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。删除文件
一般情况下,你通常直接在文件管理器中把没用的文件删了,这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了。
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
现在,文件就从版本库中被删除了。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
远程仓库
- Github是个提供Git仓库托管服务的网站,本地Git仓库和Github仓库之间传输通过SSH加密。
- git clone 是把Github远程仓库克到自己电脑上的本地仓库
- $ git remote add origin git@github.com:michaelliao/learngit.git 用于将远程仓库和自己本地已存在的仓库关联
- git push命令,把当前分支master推送到远程
- 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
$ git push -u origin master
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub
分支管理
- 每次提交(commit),Git都把它们串成一条时间线,这条时间线就是一个分支。默认master一个分支。
- 当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
$ git checkout -b dev
Switched to a new branch 'dev'
这条命令等价于
$ git branch dev$ git checkout devSwitched to branch 'dev'
转换完成后,可以用命令查看当前处于哪个分支
$ git branch* dev master
从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
$ git add readme.txt
$ git commit -m "branch test"
[dev fec145a] branch test 1 file changed, 1 insertion(+)
假如我们在dev上的工作完成了,就可以把dev
合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
$ git checkout master
Switched to branch 'master'
$ git merge dev
Updating d17efd8..fec145a
Fast-forward readme.txt | 1 +
1 file changed, 1 insertion(+)
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
$ git branch -d dev
Deleted branch dev (was fec145a).