官方文档
GUI客户端
GitHub Desktop
安装Git
Git-2.25.1-64-bit
TortoiseGit-2.11.0.0-64bit
TortoiseGit-LanguagePack-2.11.0.0-64bit-zh_CN
本地仓库
| |
---|
设置 | |
git config user.name | 查看用户名 |
git config user.email | 查看邮箱地址 |
git config --global user.name “username” | 修改用户名 |
git config --global user.email “email” | 修改邮箱地址 |
git config -l | 查看Git全局设置信息 |
创建版本库 | |
git init | 把当前目录变成Git可以管理的仓库,会在当前目录下生成.git目录如果.git目录是藏隐的,可用 ls -ah 命令显示 |
查看仓库的状态 | |
git status | 查看当前仓库的状态 |
git diff | 工作区(workdict)和暂存区(stage)的比较 |
git diff commit_id | 工作区(workdict)和指定版本的比较 |
git diff commit_id – file | 工作区(workdict)和指定版本中的指定文件的比较 |
git diff --cached | 暂存区(stage)和分支(master)的比较 |
添加文件 | |
git add file | 把文件添加到仓库(暂存区) |
git commit -m “comments” | 把文件提交到仓库(分支),-m后面是备注注释 |
git add . | 添加目录下的所有文件 |
git add folder/ | 添加目录下的指定文件夹 |
查看日志 | |
git log | 查看提交历史 |
git log -pretty=oneline | 查看提交历史,并使内容单行显示 |
git reflog | 查看命令历史 |
删除文件 | |
rm file | 删除工作区文件,不提交到暂存区 |
git rm file | 删除工作区文件,自动提交到暂存区 |
版本回退 | |
git reset --hard commit_id | 回退到指定版本,版本号没必要写全,前几位就可以了 |
git reset commit_id file | 指定文件回退到指定版本 |
git reset | 用来撤销所有暂存区域文件 |
git reset – file | 用来撤销最后一次git add file |
git reset HEAD file | 把暂存区的修改撤销掉(unstage),不还原工作区 |
git checkout – file | 把file文件在工作区的修改全部撤销,工作区被还原成和暂存区一致可以用 * 指定这次修改的所有文件名称 |
在Git中,commit_id(版本号),和SVN不一样,Git的commit_id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示
在Git中,也用HEAD表示当前版本号,上一个版本就是HEAD^ ,上上一个版本就是HEAD^^,依次类推,上100个版本也可以写成HEAD~100
远程仓库
| |
---|
SSH Key | |
ssh-keygen -t rsa -C “email” | 创建SSH Key |
cd ~/.sshpwd | 查询SSH Key目录~ 代表 C:/user/xxx/ |
ssh -T git@gitee.comssh -T -v git@gitee.com | 检查SSH连接状态 |
代理 | |
git config --global http.proxy http://127.0.0.1:1080git config --global https.proxy ‘socks5://127.0.0.1:1080’ | 设置代理 |
git config --global --unset http.proxygit config --global --unset https.proxy | 取消代理 |
git config --global --get http.proxygit config --global --get https.proxy | 查看当前已设置的代理查询的时候没有打印任何东西证明没有设置代理 |
关联远程库 | |
git remote add origin xxx | 关联远程库,远程库的名字就是origin这是Git默认的叫法,也可以改成别的 |
从远程仓库克隆 | |
git clone xxx | Git支持多种协议默认的git://使用ssh,也可以使用https等其他协议 |
推送 | |
git push origin master | 将本地库推送至远程库 |
git push -u origin master | 加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支还会把本地的master分支和远程的master分支关联起来 |
抓取 | |
git pull | 抓取 |
git pull --rebase origin master | 如果远程库不为空必须做这一步,否则后面的提交会失败 |
分支
| |
---|
git branch dev | 创建分支dev |
git branch -d dev | 删除分支dev |
git checkout dev | 切换到分支dev |
git checkout -b dev | 加上-b参数表示创建并切换dev分支 |
git branch | 查看当前分支,会列出所有分支,当前分支前面会标示*号 |
git merge dev | 合并指定分支到当前分支 |
git merge --no-ff -m “merge with no-ff” dev | –no-ff参数,表示禁用Fast forward |
git log --graphgit log --graph --pretty=oneline --abbrev-commit | 查看分支合并图 |
合并分支时,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理
- master分支应该是非常稳定的,仅用来发布新版本,平时不能在上面干活
- 干活都在dev分支上,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本
- 每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并
Bug分支
| |
---|
git stash | 把当前工作现场"储藏"起来,等以后恢复现场后继续工作 |
git stash list | 查看"储藏"的工作现场 |
git stash apply stash@{0} | 恢复但stash内容并不删除,要用git stash drop来删除 |
git stash pop stash@{0} | 恢复的同时把stash内容也删了 |
git stash drop stash@{0} | 删除stash内容 |
git cherry-pick 4c805e2 | 查看"储藏"的工作现场 |
Feature分支
| |
---|
git branch -D feature-vulcan | 强行删除没有合并的分支 |
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
标签管理
| |
---|
git tag v1.0 | 创建标签,默认标签是打在最新提交的commit上的即HEAD |
git tag v1.0 commit_id | 给指定的commit_id创建标签 |
git tag -a v1.0 -m “Comments” commit_id | 创建带有说明的标签 |
git tag | 查询所有标签,按字母排序 |
git tag show v1.0 | 查看标签信息 |
git tag -d v1.0 | 删除标签 |
git push origin v1.0 | 推送某个标签到远程 |
git push origin --tags | 推送全部尚未推送到远程的本地标签 |
git tag -d v1.0 | 本地删除 |
git push origin :refs/tags/v1.0 | 本地删除 |
如果标签已经推送到远程,需要先从本地删除,再从远程删除
多人协作
| |
---|
git remote | 查看远程库的信息 |
git remote -v | 显示远程库更详细的信息 |
git remote rm origin | 删除关联的origin远程库 |
| |
git fetch origin | 查看远程库的信息 |
git diff branch origin/branch | 查看远程库分支与本地分支的对比 |
git diff branchA branchB | 查看本地分支的对比 |
推送分支
| |
---|
git push origin master | 把本地分支上的所有本地提交推送到远程库对应的远程分支上 |
git push origin master -f | 表示舍弃线上的文件,强制推送 |
- master分支是主分支,因此要时刻与远程同步
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发
抓取分支
| |
---|
git pull | 抓取分支 |
git branch --set-upstream dev origin/dev | 抓取必须指定本地分支与远程分支的链接 |
git checkout -b dev origin/dev | 创建远程origin的dev分支到本地 |
多人协作的工作模式通常是这样
- 首先,可以试图用git push origin branch-name推送自己的修改
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
- 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
自定义Git
| |
---|
git config --global color.ui true | 让Git显示颜色,会让命令输出看起来更醒目 |
忽略特殊文件
| |
---|
touch .gitignore | 创建.gitignore文件 |
git add -f file | 用-f可以强制添加 |
git check-ignore -v file | 显示忽略规则的位置 |
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等
- 忽略编译生成的中间文件、可执行文件等,比如Java编译产生的.class文件
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
配置别名
| |
---|
git config --global alias.st status | 用st代替status–global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用 |
git config --global alias.unstage ‘reset HEAD’ | |
git config --global alias.last ‘log -1’ | |
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配置文件都放在.git/config文件中
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中
配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置
| |
---|
config | 定义项目特有的配置选项 |
description | 仅供git web程序使用 |
info/ | 包含一个全局排除文件(exclude文件),用于配置不在.gitignore中的忽略模式 |
hooks/ | 包含git钩子文件 |
HEAD | 指示当前被检出的分支 |
objects/ | 存放所有数据内容,有info和pack两个子文件夹 |
refs/ | 存放指向数据(分支)的提交对象的指针 |
index文件 | 保存暂存区信息,在执行git init的时候,这个文件还没有 |