以下内容根据廖雪峰大神分享Git教程整理,感谢大神
详见:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
安装:windows版本 https://git-for-windows.github.io 打包好的模拟环境及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
/路径/<repo-name>
注:pwd显示当前目录路径
2.将空目录变成Git可以管理的仓库
命令:git init
将提示:Initialized empty Git repository in /路径/<repo-name>/.git/
.git目录:Git用来跟踪管理版本库,勿动;默认隐藏, ls -ah查看路径
3.将文件添加提交到仓库,无提示即为成功
注:文件放入仓库目录,否则Git无法找到
命令:git add <file>
作用:添加文件到仓库
命令: git commit -m "infomation"
作用:将文件提交到仓库
注:-m后必须跟随本次提交的说明,否则将无法继续操作!!!!
扩展:
add <file> 可反复使用,添加多个文件
commit可以一次提交很多文件
如:git add file1.java
git add file2.xml
git add flie3.png
......
git commit -m "add two files"
状态
命令: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 rest使用
重置
命令: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的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协议速度最快
分支管理
开发分支 dev分支
命令:git checkout -b <branch-name>
如:git checkout -b dev
作用: 创建并切换分支
相当于:git branch <branch-name>
git checkout <branch-name>
命令:git branch
作用: 列出所有分支,当前分支前会标有星号
命令:git checkout <branch-name>
作用: 切换回当前分支
命令:git merge <branch-name>
作用: 合并指定分支到当前分支,直接将当前分支指向指定分支的提交内容
命令:git branch -d <branch-name>
作用: 删除分支
解决冲突
多分支同时修改相同文件,合并时可能会出现冲突提示:Automatic merge failed; fix conflicts and then commit the result. 此时需手动解决冲突,再add ,commit
查看分支合并图:
git log --grahp
git log --graph --pretty=oneline --abbrev-commit
分支管理策略
快速模式合并分支,会丢失分支信息
git merge <branch>
普通模式,禁用Fast forward 模式:
git merge --no-ff -m"infomation" <branch>
日志查看:普通模式下,合并后可以看到曾经做过合并,有历史分支信息;
策略:master分支应该是最稳定的,仅用来发布新版本,平时不能操作,在dev分支开发,发布时再合并到master分支
修改bug issue 分支
临时存储工作现场,保存未完成的工作,确保工作区干净,以便切分支完成其他任务
git stash
列出存储
git stash list
恢复工作现场
1.git stash apply 提交恢复, git stash drop删除stash内容
批量删除可以使用git stash clear
2.git stash pop 恢复的同时删除stash内容
多次stash
可先 git stash list,然后恢复指定stash
git stash apply <stash-id>
如:git stash apply stash@{0}
开发新功能时 feature分支
强行删除分支:
git branch -D <branch-name>
从远程仓库克隆时,Git自动把本地master分支和远程master分支对应,远程仓库默认名称是origin,以创建为准
查看远程仓库信息
git remote
显示更详细信息
git remote -v
注:若没有推送权限,将看不到push地址
推送分支
说明:
master分支是主分支,需要时刻与远程同步
dev 是开发分支,团队所有成员都在上面工作,也需要与远程同步
bug分支 只用于本地修复bug,没必要推送到远程
feature分支是否推送到远程,取决于是否和小伙伴合作开发
克隆远程库默认只可见master分支
本地新建的分支如果不推送到远程,对其他人是不可见的。
指定本地分支推送到远程库
git push origin <branch-name>
如:dev分支
git push origin dev
注:若推送失败,先用git pull抓取远程的新提交
本地创建和 远程库分支 对应的分支,名称最好一致:
远程分支:origin/branch-name
git checkout -b <branch-name> origin/<branch-name>
建立本地与远程分支的连接
git branch --set-upstream-to branch-name origin/branch-name
抓取分支
git pull
注:建立本地与远程对应分支连接后再拉取,无需任何分支名称。
git push
注:从指定远程库分支抓取最新提交,若有冲突,先手动解决冲突,再push
多人协作的工作模式通常是这样:
1.试图用 git push origin bracn-name 推送自己的修改
2.如果推送失败,先用 git pull试图合并
3.如果合并有冲突,则解决冲突,并在本地提交
4.没有或解决掉冲突后,再用git push origin branch-name推送就可以成功
标签管理
tag与commit-id绑定,便于查找
git tag
查看所有标签
打新标签
1.切换到需要打标签的分支
先查看分支信息git branch
切换指定分支git checkout <branch>
2.git tag <tagname>
新标签默认打在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
用私钥签名标签 -s
git 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 <tagname> 可以看到GPG签名信息
查看所有标签
git tag
删除标签
git tag -d <tagname>
将标签推送到远程
git push origin <tagname>
一次性推送全部尚未推送到远程的本地标签
git push origin --tags
删除远程标签
1.先删除本地
git tag -d <tagname>
2.从远程删除,push命令
git push origin :refs/tags/<tagname>
3.检查远程删除结果,登录GitHub查看
使用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
让Git显示颜色
git config --global color.ui true
忽略特殊文件
1.编写.gitignore
在Git工作区根目录创建特殊的.gitignore文件,添加要忽略的文件名
2..gitignore 文件要放入版本库,并且可以对.gitignore做版本管理
检验.gitignore的标准是git status命令是不是说working directory clean
检查规则是否有误,是否忽略了指定具体文件:
git check-ignore -v <file>
添加被.gitignore忽略的文件到版本库,强制性
git add -f <file>
忽略文件的原则是:
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
搭建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。