创建版本库,首先,选择一个合适的地方,创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
pwd命令用于显示当前目录。
$ rm test.txt
rm命令表示删除文件
也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。
第二步,通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
如果没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
把文件添加到版本库
第一步,用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
第二步,用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容
commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
git status命令可以让我们时刻掌握仓库当前的状态
$ git status
用git diff这个命令看具体修改了什么内容
$ git diff readme.txt
用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别。
在Git中,我们用git log命令查看提交历史记录,显示从最近到最远的提交日志:
$ git log
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
$ git log --pretty=oneline
在Git中,用HEAD表示当前版本,我们要把当前版本回退到上一个版本,就可以使用git reset命令:
$ git reset --hard HEAD^
cat命令查看文件内容
$ cat readme.txt
此时最新的那个版本已经看不到了,如果想回到最新的版本,只要上面的命令行窗口没有被关掉,就可以顺着往上找,找到最新版本的commit id是1094adb...,于是就可以指定回到未来的某个版本,版本号没必要写全,只要写前几位就可以了。
$ git reset --hard 1094a
但是如果回退到某个版本后关掉了电脑,想恢复到新版本,但是找不到新版本的commit id,使用git reflog查看历史命令,以便确定要回到未来的哪个版本。
$ git reflog
git checkout -- file可以丢弃工作区的修改:
$ git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD readme.txt
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
如果确定要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
$ git rm test.txt
$ git commit -m "remove test.txt"
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
在GitHub上创建一个名为learngit的空仓库,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
关联一个远程库
$ git remote add origin git@github.com:michaelliao/learngit.git
把上面的michaelliao替换成自己的GitHub账户名,你在本地关联的就是别人的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在别人的账户列表中。远程库的名字就是origin,这是Git默认的叫法。
$ git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
推送最新修改
$ git push origin master
把本地master分支的最新修改推送至GitHub,
如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm 命令。使用前,建议先用git remote -v查看远程库信息:
$ git remote -v
然后,根据名字删除,比如删除origin:
$ git remote rm origin
用命令git clone克隆一个本地库
$ git clone git@github.com:michaelliao/gitskills.git
**创建dev分支,然后切换dev分支 **
$ git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
git branch命令会列出所有分支,当前分支前面会标一个*号。
把dev分支的工作成果合并到master分支上,需要先切换到master分支再合并:
$ git checkout master
$ git merge dev
git merge命令用于合并指定分支到当前分支
合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
为了避免混淆撤销修改的命令,最新版本的Git提供了新的git switch命令来切换分支:创建并切换到新的dev分支,可以使用:
**$ git switch -c dev**
直接切换到已有的master分支,可以使用:
$ git switch master
通常,合并分支时,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:
$ git merge --no-ff -m "merge with no-ff" dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
用git stash list命令查看工作现场
$ git stash list
Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
$ git stash pop
次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:
$ git cherry-pick 4c805e2
Git自动给dev分支做了一次提交,注意这次提交的commit是1d4b803,它并不同于master的4c805e2,因为这两个commit只是改动相同,但确实是两个不同的commit。用git cherry-pick,我们就不需要在dev分支上手动再把修bug的过程重复一遍。
开发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
$ git branch -D feature-vulcan
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
$ git rebase
命令git tag 就可以打(新建)一个新标签,默认为HEAD,也可以指定一个commit id:
$ git tag v1.0
命令git tag -a -m "blablabla..."可以指定标签信息,用-a指定标签名,-m指定说明文字:;
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
可以用命令git tag查看所有标签:
$ git tag
可以用git show 查看标签信息:
$ git show v0.1
如果标签打错了,也可以删除:
$ git tag -d v0.1
如果要推送某个标签到远程,使用命令git push origin :
$ git push origin v1.0
或者,一次性推送全部尚未推送到远程的本地标签:
$ git push origin --tags
命令git push origin :refs/tags/可以删除一个远程标签,但是要现在本地删除,再push。
如果我们希望体验Git飞一般的速度,可以使用国内的Git托管服务——Gitee(gitee.com)。