阅读目录
安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序.,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址,用来做一个标识。
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
常用命令
创建版本库
$ git init #初始化本地版本库
添加文件到仓库
$ git add file.txt #把file.txt文件添加到仓库
$ git commit -m "wrote a file" #把文件提交到仓库,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录
查看状态
$ git status #掌握仓库当前的状态
$ git diff file.txt #查看文件具体修改了什么内容
版本回退
$ git log #历史记录,显示从最近到最远的提交日志
$ git log --pretty=oneline #查看记录,显示版本号和提交说明
$ git reset --hard HEAD^ #回退到上一个版本,HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本可以写成HEAD~100
$ git reset --hard 1094a #指定回到未来的某个版本,版本号没必要写全,前几位就可以了,Git会自动去找。
$ git reflog #记录你的每一次命令
管理修改
$ git diff HEAD -- file.txt #查看工作区和版本库里面最新版本的区别
撤销修改
$ git checkout -- file.txt #丢弃工作区的修改,把readme.txt文件在工作区的修改全部撤销,让这个文件回到最近一次git commit或git add时的状态
$ git reset HEAD readme.txt #把暂存区的修改撤销掉(unstage),重新放回工作区
删除文件
$ git rm test.txt #删除文件
远程仓库
打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com" #把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码
登录GitHub,点击右上角头像处,选择Settings,点击左边导航栏SSH and GPG keys,点击New SSH key,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容(在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人):
点“Add SSH Key”,你就应该看到已经添加的Key。
GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
登陆GitHub,然后,在右上角“+”找到“New repository”按钮,创建一个新的仓库:
添加远程库
刚创建的仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
根据GitHub的提示,在本地的仓库下运行命令:
$ git remote add origin git@github.com:sixrope/learngit.git #把sixrope替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样.
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
从远程库克隆
登陆GitHub,创建一个新的仓库,名字叫gitskill:
勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。
用命令git clone克隆一个本地库:
$ git clone git@github.com:sixrope/gitskill.git #注意把Git库的地址换成你自己的
分支管理
创建与合并分支
#创建dev分支,然后切换到dev分支:
$ git checkout -b dev
#git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
$ git branch #查看当前分支,会列出所有分支,当前分支前面会标一个*号
$ git checkout master #切换回master分支
$ git merge dev #合并指定分支到当前分支
$ git branch -d dev #删除dev分支
切换分支这个动作,用switch更科学,因此最新版本的Git提供了新的git switch命令来切换分支
$ git switch -c dev #创建并切换到新的dev分支
$ git switch master #直接切换到已有的master分支
分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
$ git merge --no-ff -m "merge with no-ff" dev #合并dev分支,请注意--no-ff参数,表示禁用Fast forward
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
Bug分支
$ git stash #把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stash list #查看工作现场
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
$ git stash apply #恢复后,stash内容并不删除
$ git stash pop #恢复的同时把stash内容也删了
$ git cherry-pick 4c805e2 #复制一个特定的提交到当前分支
多人协作
$ git remote #查看远程库的信息
$ git remote -v #显示更详细的远程信息
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
哪些分支需要推送,哪些不需要呢?
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
推送失败,可能你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
$ git pull
多人协作的工作模式通常是这样:
- 首先,可以试图用git push origin 推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。
Rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
$ git rebase
标签管理
$ git tag v1.0 #打一个新标签v1.0
$ git tag #查看所有标签
$ git show v1.0 #查看标签信息
$ git tag -a v0.1 -m "version 0.1 released" bff47be #创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -d v0.1 #删除标签
$ git push origin v1.0 #推送v1.0标签到远程
$ git push origin --tags #一次性推送全部尚未推送到远程的本地标签
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
配置别名
$ git config --global alias.st status #以后st就表示status
本篇文章只是对我学习的Git时做一些简单的命令笔记,这里推荐一个比较好的学习教程:传送门