Git基本操作
安装Git:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置。
安装版本库:
$ mkdir learngit //当前位置创建learngit文件夹
$ cd learngit //跳转到learngit
$ pwd //显示当前目录
$ git init //把这个目录变成Git可以管理的仓库
ls -ah//用来打印出当前目录的清单,-a包含以.开头的隐含文件,-h列出文件大小
把文件添加到版本库:
将textname.TXT文件放入learngit文件
$ git add textname.txt //添加到暂存库
$ git commit -m "note"//-m 后面输入的是本次提交的说明
时光机穿梭:
$ git status //查看仓库当前的状态
$ git diff readme.txt //查看仓库的变化
版本回退:
$ git log //版本历史记录,所有的
$ git log --pretty=oneline //数字为版本号
$ git reset --hard HEAD~n //回退n个版本,或者HEAD^...
$ git reset --hard number //回到未来的某个版本号number
$ cat readme.txt//查看当前版本的内容
$ git reflog//记录你的每一次命令
版本库=stage(暂存区)+master(分支)
仓库=工作区
Untrack files://某个文件没有被添加过
管理修改:
git diff HEAD -- readme.txt//可以查看工作区和版本库里面最新版本的区别
撤销修改:
$ git checkout -- readme.txt//撤销工作区的全部修改。用版本库里的最新版本替换工作区的版本,“一键还原”。
$ git reset HEAD file//可以把暂存区的修改撤销掉(unstage),重新放回工作区。
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
删除文件:
$ rm test.txt //删除仓库文件
$ git rm test.txt
$ git commit -m "remove test.txt"//删除版本库文件
远程仓库:
第1步:$ ssh-keygen -t rsa -C "youremail@example.com"//创建SSH Key
可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
添加远程库:
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
在本地的learngit仓库下运行命令(关联):$ git remote add origin git@github.com:yourgithubid/learngit.git
添加后,远程库的名字就是origin,这是Git默认的叫法
下一步,就可以把本地库的所有内容推送到远程库上:$ git push -u origin master//第一次使用将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。
之后就用:$ git push origin master
SSH警告:
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
这个警告只会出现一次,后面的操作就不会有任何警告了。
从远程库克隆:
首先,登陆GitHub,创建一个新的仓库,名字叫gitskills:
我们勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件:
下一步是用命令git clone克隆一个本地库:$ git clone git@github.com:yourgithubid/gitskills.git
$ cd gitskills //进入子目录
$ ls //显示
分支管理:
创建与合并分支:
$ git checkout -b dev //创建dev分支,并切换到dev分支
$ git branch //列出所有分支,当前分支前面会标一个*号
$ git checkout master //切换到master分支
$ git merge dev //合并指定分支到当前分支,Fast forward
$ git branch -d dev //删除dev分支,-D强制删除
$ git log --graph --pretty=oneline --abbrev-commit //查看分支合并情况
$ vi text.txt //进入某个文件
分支管理策略:
$ git merge --no-ff -m "merge with no-ff" dev //普通合并,--no-ff参数,表示禁用Fast forward,(可查看历史)并且提交了一个commit
Bug分支:
$ git stash //把当前工作现场(工作区)“储藏”起来
$ git stash list //查看工作现场
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
$ git stash apply stash@{0} //恢复到制定stash
多人合作:
推送分支:
$ git remote //查看远程库 -v表示详细信息
$ git push origin master //推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
抓取分支:
(在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆)
默认情况下,你的小伙伴只能看到本地的master分支
$ git clone git@github.com:YourID/learngit.git
现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev
推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
$ git branch --set-upstream dev origin/dev //本地dev分支与远程origin/dev分支的链接
$ git pull
创建标签:(只存储在本地,不会自动推送到远程)
$ git tag v1.0 //切换到需要打标签的分支上后,默认标签是打在最新提交的commit上的。
$ git tag //查看所有标签
$ git log --pretty=oneline --abbrev-commit
$ git tag v0.9 commitid //找到历史提交的commit id,然后打上
标签不是按时间顺序列出,而是按字母排序的
$ git show v0.9 //查看标签信息
$ git tag -a v0.1 -m "version 0.1 released" commitid //创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -s v0.2 -m "signed version 0.2 released" commit //通过-s用私钥签名一个标签:签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错
操作标签:
$ git tag -d v0.1 //删除标签
$ git push origin v1.0 //送某个标签到远程
$ git push origin --tags //推送全部
如果标签已经推送到远程,先从本地删除:$ git tag -d v0.9
从远程删除。删除命令也是push:$ git push origin :refs/tags/v0.9