创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
编写一个readme.txt文件,内容如下:
Git is a version control system.
Git is free software.
放到learngit目录下(子目录也行) 放到Git仓库只需要两步。
第一步,用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
第二步,用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
git status
命令可以让我们时刻掌握仓库当前的状态
$ git diff readme.txt
查看具体修改了什么内容
查看log
$ git log
$ git log --pretty=oneline
版本回退
HEAD表示当前版本,,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
$ git reset --hard HEAD^
$ git reset --hard 3628164
查看所有版本和log
git reflog
查看工作区和版本库里面最新版本的区别
git diff HEAD -- readme.txt
场景1 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时
git checkout -- file
场景2 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD file
就回到了场景1,第二步按场景1操作。
删除文件 分两步
$ git rm test.txt
$ git commit -m "remove test.txt"
添加所有
git add -A
提交所有
git commit -am "log"
本地仓库和远程仓库关联
$ git remote add origin git@github.com:michaelliao/learngit.git
移除远程仓库
git remote remove origin
把本地库的所有内容推送到远程库上:第一次要加-u
参数,以后可不加
$ git push -u origin master
从远程仓库克隆文件到本地库:
$ git clone git@github.com:michaelliao/gitskills.git
分支
查看分支:
git branch
创建分支:
git branch <name>
切换分支:
git checkout <name>
创建+切换分支:
git checkout -b <name>
合并某分支到当前分支:
git merge <name>
合并分支时,加上--no-ff
参数就可以用普通模式合并,Git就会在merge时生成一个新的commit,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
$ git merge --no-ff -m "merge with no-ff" dev
解决冲突方法 :修改内容,再添加到缓冲区,再提交
删除分支:
git branch -d <name>
用带参数的git log也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
标签 tag
查看tag
git tag
添加tag
git tag -a v2.3.0 -m "log"
删除tag
git tag -d v2.3.0
推送远程
git push origin v1.0
git push origin --tags 推送所有tag
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.9
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
编辑指定tag
git checkout -b branch_name tag_name
工作现场
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
保存工作现场:
$ git stash
查看保存的工作现场:
$ git stash list
恢复工作现场:
$ git stash apply 恢复后,stash内容并不删除
$ git stash drop 删除
或者
$ git stash pop 恢复的同时把stash内容也删了