文档标识:[C-180108-M-20200106]
知识来源:廖雪峰 Git教程
内容链接均来源于互联网,如有侵权,请联系删除。
创建git 用户
- 设置用户名称
git config --global user.name "Name"
- 设置用户邮箱
git config --global user.email "email@example.com"
创建git 仓库
- 创建文件夹
mkdir folder
- 初始化仓库
git init
添加文件至仓库
- 添加文件至暂存区(stage)
git add files
- 提交修改至版本库
git commit -m "it's a example"
- 已跟踪文件跳过暂存直接提交修改
git commit -a -m "ignore submit stage"
版本回退与文件比对
- 查看仓库状态
git status
- 查看工作区与暂存区之间的修改内容
git diff
- 查看暂存区与版本库之间的修改内容
git diff -cached
- 查看工作区与版本库之间的修改内容
git diff HEAD
- 查看提交详细日志
git log
- 回退至以前的版本
git reset --hard HEAD^
-- HEAD 表示最新版本
-- ^ 表示上一个版本,可多次叠加
-- HEAD~10 表示最新版本往上10个版本
git reset --hard commit id
-- 可以回到指定的commit id 的版本
- 查看版本提交或回退的日志
git reflog
- 撤销对文件做的修改
git checkout --file
- 撤销已经提交到暂存区的文件
git reset HEAD file
- 提交一个删除文件到暂存区
git rm file
- 已暂存的文件使用强制删除
git rm -f file
- 将文件添加到忽略文件中
git rm --cached file
远程仓库
- 创建SSH密钥
ssh-keygen -t rsa -C "email@example.com"
- 登录GitHub后把生成的公钥添加到账户设置
- 在本地添加与远程仓库的关联
git remote add origin git@github.com:****/LearnGit.git
origin 表示远程仓库的名称
git@... 表示远程仓库的地址
- 添加关联后,将本地仓库推送至远程仓库
git push -u origin master
首次连接提示警告信息,确认指纹信息是否来自GitHub.com
The authenticity of host 'github.com (192.*.*.*)' can't be established.
RSA key fingerprint is SHA256:nThbg6*****WGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?
- 本地仓库修改后,直接推送
git push origin master
- 从远程仓库复制(下载)一份完整项目
mkdir clonedemo
cd clonedemo
git clone git@github.com:****/LearnGit.git
这样在clonedemo文件夹下生成了 LearnGit 的完整项目文件
仓库分支
- 创建和合并分支
git branch dev
- 创建dev的分支
git checkout dev
- 切换到dev分支
git checkout -b dev
- 创建并切换到dev分支
git branch
可查看当前所有分支,当前分支为带*的
- 合并分支
git merge dev
把dev 分支合并到当前分支
- 删除分支
git brach -d dev
删除dev 分支
当分支没有被合并时,需要强制删除
git branch -D dev
冲突解决
在执行git merge
时会出现CONFLICT的警告,当master 分支需要合并其他分支时,需要解决冲突后才可以合并,无切换至冲突的分支。分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
Bug分支
当分支工作未提交,需要暂时保存已暂存的文件,不影响其他分支的操作。
- 隐藏当前工作
git stash
可以将已经暂存的文件隐藏起来。
当文件已修改,未暂存则无法使用stash不能隐藏。如果不使用stash,那么已修改的文件会影响其他分支的操作。
- 恢复已隐藏的工作
查看已保存的stash列表
git stash list
选择需要恢复的工作
git stash apply stash@{0}
多人协作
- 查看远程库信息
git remote
或者
git remote -v
显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
- 推送分支
git push origin master
并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要?
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- 抓取分支
当多人协作时,对同一分支的推送产生冲突,需要先解决冲突。使用以下命令获取远程仓库的数据:
git pull
多人协作的工作模式通常是这样:
首先,可以试图用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的标签本质是版本库的快照,与分支一样,但是分支可以进行移动,标签创建后无法移动,为了代替版本的commit号码,方便记忆。
- 创建标签
快速创建标签
git tag name
显示所有标签,标签按字母顺序进行排序。
git tag
一般标签的创建默认是在最新的版本,当需要补创建标签则需要把版本commit号码加上,可使用git log --oneline
查看,例如:
git tag v1.0 332a1d3
- 查看标签的详细信息
git show v1.0
- 创建带说明的标签
git tag -a v1.1 -m "version 1.0" 24d123f
- 创建带有私钥签名的标签,签名采用PGP签名
git tag -s v1.1 -m "version 1.0" 24d123f
- 删除标签
git tag -d v1.0
- 远程推送某个标签到远程仓库
git push origin v1.0
- 远程推送所有标签到远程仓库
git push origin --tags
- 远程删除标签,需要先删除本地标签后,在执行以下命令:
git push origin:refs/tags/v1.0
删除后显示如下:
To github.com:****/LearnGit.git
- [deleted] v1.0
注意:这里的标签一般指的就是版本,在github上的可以看到标签被放在releases一般。
自定义git
- 忽略不需要提交的文件
在git工作区下面创建.gitignore文件,把需要忽略的文件名填入。
忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
在github上有适合各类语言环境的gitignore文件,可以下载使用:
https://github.com/github/gitignore
例如python工作环境下的配置:
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
...
#符号开头的为注释,可以在文件内填入文件夹或指定后缀的文件名。
如果在忽略文件内的文件,使用git add
命令添加,那么会提示文件被忽略不被提交。如果确实需要添加,则需要使用以下命令:
git add -f file
检查某类文件是否在忽略文件内,则可以使用以下命令检查:
git check-ignore -v file
- 配置别名
git config --global alias.st status
这样使用git st
就可以代替git status
使用。
当使用git config
时,加了--global
指的是对当前所有仓库生效,如果不加则对当前仓库生效。
- 查看仓库配置
cat .git/config
当前用户的Git配置放在用户主目录的隐藏文件.gitconfig文件内,windows系统下放在用户目录(“文档” 文件夹的上一级)里。
搭建git服务器
第一步,安装git:
sudo apt-get install git
第二步,创建一个git用户,用来运行git服务:
sudo adduser git
第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
sudo chown -R git:git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
第六步,克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.