前言:
跟随大神脚步,廖雪峰 Git 教程
学好Git,早日掌握代码托管利器
环境与版本库
环境
安装
windows版本 Git
打包好的模拟环境及git: msysgit
验证
开始菜单,Git–Git Bash
配置
命令:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
说明:
git config –global 参数表示当前机器所有用户都是使用该配置
版本库
进入版本库 :cd e:/learngit
1.创建版本库(仓库)
选择合适位置创建空目录,Windows环境要确保路径不包含中文:
进入目标盘符
命令:cd e:/
确认进入,查看文件
命令:ls
创建仓库
命令:mkdir <repo-name>
cd <repo-name>
pwd
显示为:/路径/
注:pwd显示当前目录路径
2.将空目录变成Git可以管理的仓库
命令:git init
提示:Initialized empty Git repository in /路径/
.git目录:Git用来跟踪管理版本库,勿动;默认隐藏, ls -ah查看路径
3.将文件添加提交到仓库,无提示即为成功
注:文件放入仓库目录,否则Git无法找到
命令:
git add <file>
作用:添加文件到仓库
命令:
git commit -m "infomation"
作用:将文件提交到仓库
注:-m后必须跟随本次提交的说明,否则将无法继续操作!!!!
扩展:
1.add <file>
可反复使用,添加多个文件
commit可以一次提交很多文件
如: git add file1.java
git add file2.xml
git add flie3.png
……
git commit -m “add many files”
2.add.
:提交当前工作区未被配置为忽略的所有文件到暂存区(更喜欢存储区这个称呼)
状态
命令:git status
作用:时刻掌握仓库当期状态
diff信息
命令:git diff
作用:查看difference,以unix通用diff格式显示
历史记录
命令:git log
作用:查看提交历史,从最近到最远,可确定回退版本,会进入log界面
扩展:git log --pretty=oneline
–pretty==oneline 单行显示重要信息,包含:commit-id ,commit information
版本号commit id HASH值 以16进制表示
版本回退
命令:git reset --hard HEAD^
作用:回退到上一个版本
注:HEAD指向当前版本 HEAD^上个版本 HEAD^^上两个版本,上100个版本 HEAD~100
命令: git reset --hard commit-id
作用:回退到指定版本:
注:id不需要写全,也不要太短,git会自动查找
命令:cat <file>
作用:查看文件
查看命令历史
命令: git reflog
作用:查看命令历史,可用于查看commit-id及HEAD版本, 用于版本回退
工作区与暂存区
一些简单说明
工作区包含隐藏目录.git ,是Git版本库
创建版本库时,Git默认创建第一个分支master,并包含暂存区stage
git add <file>
:添加文件,实际上是将文件修改添加到暂存区
git commit <file>
:提交更改,实际上是把暂存区的所有内容提交到当前分支
Git 跟踪修改,若没有add添加到暂存区,就不会加入到commit 队列
版本比对
命令:git diff HEAD --<file>
作用:查看工作区和版本库里最新版本的区别
撤销修改
命令:git checkout -- <file>
作用:撤销工作区修改,让文件回到最近一次git commit 或git add时的状态,”–”很重要,没有则为切换分支;已添加到缓存区的无法直接撤销,需先重置缓存区,配合git reset使用
重置
命令:git reset
作用:既可以回退版本,也可以把暂存区的修改,非删除的回退到工作区
命令:git reset HEAD <file>
作用:撤换暂存区的修改unstage,重新放回工作区
注:
1.直接丢弃工作区,非缓存区的修改checkout -- <file>
2.修改了工作区内容,且添加进缓存区,想丢弃修改,先git reset HEAD <file>
或git rest
再git checkout -- <file>
3.工作区修改已提交版本库,恢复只能通过版本回退!
删除文件 rm
命令:git rm <file>
作用:从版本库删除文件
注:删除后需commit提交,否则工作区与版本库不一致
命令: git checkout -- <file>
作用:工作区删除但未提交,可以用版本库版本替换工作区版本,无论工作区是修改还是删除;若已提交,则无法恢复,除非回退版本
远程仓库
1.使用免费开放的GitHub
2.搭建Linux服务器
GitHub
检查用户主目录下,是否有.ssh目录id_rsa和id_rsa.pub两个文件
1.创建SSH Key
windows下打开Git Bash
命令:ssh-keygen -t rsa -C "youremail@example.com"
默认值即可,无需设置密码
2.添加用户到远程仓库
登陆GitHub,“Account settings”,“SSH Keys”页:
“Add SSH Key”,任意Title,Key文本框里粘贴id_rsa.pub文件的内容
SSH Key,GitHub需识别出推送的提交确实是本人推送,而非他人冒充。
Git支持SSH协议
GitHub允许添加多个key
1.添加远程仓库
GitHub: Create a new repo按钮创建一个新的仓库
Repository name填入仓库名repo-name,其他默认,“Create repository
2.关联一个远程库
命令:git remote add origin git@server-name:path/<repo-name>.git
如:git remote add origin git@github.com:GitHub帐户名/repo-name.git
添加后,远程库的名字就是 origin,此为Git默认名称,可以更改
3.关联后推送master分支所有内容
命令:git push -u origin <branch-name>
注:-u 关联本地库内分支与远程库内分支
命令:git push origin branch-name
每次提交本地版本库后,只要有必要,推送最新修改
也可使用: git push
直接推送到当前分支关联的远程分支,未关联时使用此命令会提示
fatal: The current branch <branch> has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin <branch>
4.推送并关联远程分支:
git push --set-upstream origin <branch>
此后便可直接使用git push
完成提交
注:
第一次使用Git的clone或push命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。
克隆
命令:git clone git@github.com: 路径/<repo-name>.git
作用:从远程库克隆git clone
注:
必须知道仓库的地址
git支持多种协议 包括https
通过ssh支持原生git协议速度最快
分支管理
分支创建及切换
命令:git checkout -b <branch-name>
作用: 创建并切换分支
开发分支 假设为:dev分支
如:git checkout -b dev
相当于:
git branch
git checkout
命令:git branch
作用: 列出所有分支,当前分支前会标有星号
命令:git checkout <branch-name>
作用: 切换回当前分支
命令:git merge <branch-name>
作用: 合并指定分支到当前分支,直接将当前分支指向指定分支的提交内容,可理解为快速模式
git merge --no-ff -m"infomation" <branch>
作用:非快速模式,可保留分支信息
命令:git branch -d <branch-name>
作用: 删除分支
解决冲突
多分支同时修改相同文件,合并时可能会出现冲突提示:
Automatic merge failed; fix conflicts and then commit the result.
此时需手动解决冲突,再add ,commit
题外话:android studio中:右键冲突文件—>解决冲突—>apply
查看分支合并图
命令:git log --grahp
作用:显示多行分支信息
命令:git log --graph --pretty=oneline --abbrev-commit
作用:单行显示分支信息
分支管理策略
git merge <branch>
快速模式合并分支,会丢失分支信息
git merge --no-ff -m"infomation" <branch>
普通模式,禁用Fast forward 模式
git log
日志查看:普通模式下,合并后可以看到曾经做过合并,有历史分支信息;
分支管理策略
master分支应该是最稳定的,仅用来发布新版本,平时不能操作,在dev分支开发,发布时再合并到master分支
说明:
master分支是主分支,需要时刻与远程同步
dev 是开发分支,团队所有成员都在上面工作,也需要与远程同步
bug分支 只用于本地修复bug,没必要推送到远程
feature分支是否推送到远程,取决于是否和小伙伴合作开发
克隆远程库默认只可见master分支
本地新建的分支如果不推送到远程,对其他人是不可见的。
本地工作分支提交修改
建立本地分支与远程分支链接
本地创建和 远程库分支 对应的分支,名称最好一致:
远程分支:origin/branch-namegit checkout -b <branch-name> origin/<branch-name>
建立本地与远程分支的连接git branch --set-upstream-to branch-name origin/branch-name
从远程仓库克隆时,Git自动把本地master分支和远程master分支对应,远程仓库默认名称是origin,以创建为准
强行删除分支:git branch -D <branch-name>
本地未完成的修改临时存储
列出已有存储git stash list
临时存储工作现场,保存未完成的工作,确保工作区干净,以便切分支,完成其他任务
git stash
恢复工作现场
git stash apply
提交恢复git stash drop
删除stash内容
批量删除可以使用git stash clear
git stash pop
恢复的同时删除stash内容
当有多次stash时:
可先 git stash list查看id,然后恢复指定stash
git stash apply <stash-id>
如:git stash apply stash@{0}
查看远程仓库信息
git remote
显示更详细信息
git remote -v
注:若没有推送权限,将看不到push地址
远程修改抓取
推送本地修改之前必须要先做的
抓取分支git pull
注:建立本地与远程对应分支连接后再拉取,无需任何分支名称。
推送分支
指定本地分支推送到远程库
git push origin
如:dev分支
git push origin dev
注:若推送失败,先用git pull抓取远程的新提交
git push
注:从指定远程库分支抓取最新提交,若有冲突,先手动解决冲突,再push
多人协作的工作模式通常是这样:
- 试图用 git push origin bracn-name 推送自己的修改
- 如果推送失败,先用 git pull试图合并
- 如果合并有冲突,则解决冲突,并在本地提交
- 没有或解决掉冲突后,再用git push origin branch-name推送就可以成功
标签管理
tag与commit-id绑定,便于查找
查看标签
git tag
查看所有标签
打新标签
切换到需要打标签的分支
先查看分支信息
git branch
切换指定分支
git checkout <branch>
git tag
新标签默认打在HEAD,既最新提交的commit上
指定提交记录打标签:
- 查找历史提交commit id
git log --pretty=oneline --abbrev-commit
- 再打标签
git tag <tagname> commit-id
标签默认按字母排序,不按时间
查看标签信息
git show <tagname>
创建带有说明的标签
-a指定标签名,-m指定说明文字git tag -a <tagname> -m "infomation" commit id
用私钥签名标签 -sgit tag -s <tagname> -m "infomation" commit id
说明:
签名采用PGP,必须先安装gpg(GnuPG),若没找多或没有gpg密钥对,就会报错
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag
如果报错,请参考GnuPG帮助文档配置Key。
git show
删除标签
git tag -d
将标签推送到远程
git push origin
一次性推送全部尚未推送到远程的本地标签
git push origin –tags
删除远程标签
1.先删除本地
git tag -d
2.从远程删除,push命令
git push origin :refs/tags/
3.检查远程删除结果,登录GitHub查看
Git 配置
自定义Git
让Git显示颜色
git config –global color.ui true
忽略特殊文件
1.编写.gitignore
在Git工作区根目录创建特殊的.gitignore文件,添加要忽略的文件名
2..gitignore 文件要放入版本库,并且可以对.gitignore做版本管理
检验.gitignore的标准是git status命令是不是说working directory clean
检查规则是否有误,是否忽略了指定具体文件:
git check-ignore -v
添加被.gitignore忽略的文件到版本库,强制性
git add -f
忽略文件的原则是:
1. 忽略操作系统自动生成的文件,比如缩略图等;
2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
命令别名
git config --global alias.
如 :st表示status git config –global alias.st status
co表示checkout
ci 表示commit
br 表示branch
撤销更改别名配置:unstage
原命令: git reset HEAD file
git config –global alias.unstage ‘rest HEAD’
更改后:git unstage <file>
显示最后一次提交的信息 git last
git config --global alias.last 'log -1'
更改后:git last
配置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 lg
注:–global针对当前用户起作用,不加只对当前仓库起作用
每个仓库的配置文件位置:.git/config
查看:cat .git/config
配置的别名在[alias]后
当前用户的Git配置文件在用户主目录下的一个隐藏文件.gitconfig
查看:cat .gitconfig
使用GitHub
GitHub 可以任意Fork开源仓库
自由拥有Fork后的自己帐号下的仓库的读写权限
自由从自己帐号下clone仓库才能推送修改
克隆
如git clone git@github.com: michaelliao/bookstrap.git
可以推送pull request 给官方仓库贡献代码,官方决定是否接受
删除已有的GitHub远程库
git remote rm origin
关联远程库
git remote add origin git@gitee.com:path/<name>.git
码云
国内Git 托管服务 gitee.com
同时关联多个远程库
git的远程库默认名称是origin ,多个远程库需要不同的名称标识
使用
已关联了GitHub远程库的情况下:
1.先删除已关联的名为origin的远程库
git remote rm origin
2.关联GitHub远程库
git remote add github git@github.com:路径/<name>.git
3.关联码云远程库
git remote add gitee git@gitee.com:路径/<name>.git
此时查看远程库信息,可以看到两个远程库
git remote -v
推送到GitHub
git push github master
推送到码云
git push gitee master
搭建Git服务器
使用Linux机器。推荐Ubuntu 或Debian
假设有sudo权限的用户帐号
1.安装git sudo apt-get install git
2.创建git用户,运行git服务 sudo adduser git
3.创建证书登录
收集所有需要登录的用户的公钥,.id_ras.pub文件,导入到/home/git/.ssh/authorized_keys文件,一行一个
4.初始化Git仓库,选定一个目录作为Git仓库,假设为/srv/sample.git
在/srv目录下输入 sudo git init –bare sample.git
会创建一个裸仓库,没有工作区,通常以.git结尾,将owner改为git
sudo chown -R git:git sample.git
5.禁用shell登录,出于安全考虑,git用户不允许登录shell,通过编辑/ect/passwd文件完成
git:x:1001:1001:,,,:/home/git:/bin/bash
改为
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
git用户可以正常通过ssh使用git,因为我们为git用户指定的git-shell每次一登录就自动退出
克隆远程仓库
git clone git@server:/srv/sample.git
* 搭建Git服务器非常简单,通常10分钟即可完成;
* 要方便管理公钥,用Gitosis;
* 要像SVN那样变态地控制权限,用Gitolite。
扩展:
Git 与Android studio 的关联
日常工作中可以通过studio的命令行来操作,减少窗口切换,省时省力
安装完git后,将git路径添加进studio:
studio —setting—Version Control—Git—>
Test之后显示Successfully表明成功
Terminal窗口内测试一下:输入git
搞定