创建版本库
mkdir learngit
cd learngit
pwd
pwd命令用于显示当前目录,在我的电脑中,这个仓库位于/users/michael/learngit
若是window系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文
仓库初始化
git init
通过这个命令把目录变成git可以管理的仓库
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
文件添加到暂存区
git add <file>
把文件添加到暂存区
提交到版本库
git commit -m "message"
简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
执行后输出:
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)
git status
git status命令可以让我们时刻掌握暂存区当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
git diff
git diff顾名思义就是查看difference,知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步
git log
git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数
你看到的一大串类似1094adb...的是commit id(版本号)
git reset --hard HEAD^
回退到上一个版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^
最新的那个版本add disbributed已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个add disbributed的commit id是 2bfef3b...,于是就可以指定回到未来的某个版本:
git reflog
查找每一次命令的记录
git checkout -- file
前提,还没有git add到暂存区,撤销修改就回到和版本库一模一样的状态
git reset HEAD <file>
git checkout -- file
已提交到暂存区,需通过以上命令撤销修改
删除
rm test.txt
在本地删除文件
git status
查看状态
git rm test.txt
把版本库中的test.txt删除
删除错误,恢复
git checkout -- file
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
远程仓库
1.创建SSH Key
ssh-keygen -t rsa -C "youre-mail@qq.com"
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
2.登录github,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
3.在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
我们根据GitHub的提示,在本地的learngit仓库下运行命令
git remote add origin git@github.com:michaelliao/learngit.git
请千万注意,把上面的michaelliao替换成你自己的GitHub账户名,添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库
git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
从现在起,只要本地作了提交,就可以通过命令
git push origin master
先建设远程库,再建设本地库
首先,登陆GitHub,创建一个新的仓库,名字叫gitskills:
我们勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件:
现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:
git clone git@github.com:michaelliao/gitskills.git
注意把Git库的地址换成你自己的,然后进入gitskills目录看看,已经有README.md文件了:
$ cd gitskills
$ ls
README.md
非常重要的分支管理
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。
如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
git checkout -b dev
创建dev分支,然后切换到dev分支
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev
Switched to branch 'dev'
查看当前分支
git branch
切换分支
git checkout master
删除分支
git branch -d dev
当有冲突的时候,修改冲突,选择要保留下来的语句,然后git add 和 git commit.
查看一下readme.txt中的内容
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:
Creating a new branch is quick and simple.
在普通模式下合并分支
git merge --no-ff -m "merge with no-ff" dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit也加进去
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash
git查看工作现场列表
git stash list
恢复stash且把stash内容删除
git stash pop
相当于
git stash apply //恢复
git stash drop //删除
强行删除分支
git branch -D <branch name>
查看远程库信息:
git remote -v
若是有一个小伙伴要与你在相同分支下开发,这时,你开发完成后,他也开发完成,你们修改了同个地方,这时候就会冲突,你要先把它拉取下来:
git pull
这时候有可能出现拉取失败并提示:
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
git branch --set-upstream-to=origin/dev dev
再pull:
git pull
把分叉的提交历史“整理”成一条直线,看上去更直观
git rebase
标签管理
发版本的时候,这个版本会有一个tag,这个tag对应的是某一个commit-id,但是有了commit-id为什么还要有tag,原因是commit-id太长太冗余,是一串长长的数字,若有某个tag例如v1.2,简短好识别
新建标签:
git tag <name>
查看所有标签:
git tag
为特定的commit打上标签:
git tag v0.9 f52c633
查看标签信息:
git show <tagname>
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a v0.1 -m "version 0.1 released" 1094adb
如果标签打错了,还可以删除
git tag -d v0.1
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要推送某个标签到远程,使用命令
git push origin <tagname>
一次性推送全部尚未推送到远程的本地标签:
git push origin --tag
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.1
git push origin :refs/tags/v0.9
同时使用github和gitee
要建立两个远程库,我们可以删除已有的GitHub远程库:
git remote rm origin
关联码云的远程库:
git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
再关联github的远程库
git remote add github git@github.com:michaelliao/learngit.git
现在,我们用git remote -v查看远程库信息,可以看到两个远程库
git remote -v
gitee git@gitee.com:liaoxuefeng/learngit.git (fetch)
gitee git@gitee.com:liaoxuefeng/learngit.git (push)
github git@github.com:michaelliao/learngit.git (fetch)
github git@github.com:michaelliao/learngit.git (push)码
如果要推送到GitHub,使用命令:
git push github master
如果要推送到码云,使用命令:
git push gitee master
配置别名
如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。
我们只需要敲一行命令,告诉Git,以后st就表示status:
git config --global alias.st status
当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
配置输出log的优质显示
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
此文章参考:廖雪峰老师的git教程,欢迎大家前往查看
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。