标签:git
Git :分布式版本控制系统
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
1.git简介
--安装Git:
# yum install -y git
--配置属性
# git config --global user.name "Your Name" #设置名字和email,为全局设置,会影响此用户建立的每个项目
# git config --global user.email "email@example.com"
--创建版本库
# mkdir dr_name # 版本库名自定义
# cd dr_name
# git init # 创建一个空的git仓库或者重新初始化一个已存在的
2.时光机穿梭
--添加文件到Git仓库
# git add file1 file2 file3 # 将修改内容从工作区添加到暂存区
# git commit -m ‘Save file1-3‘ # 将暂存区所有内容提交到当前分支,-m添加本次提交的注释信息
ps: 文件必须得保存在git仓库中,工作目录也得为git仓库路径
--查看版本库状态
# git status
--查看已做修改但没被添加到索引的修改
# git diff
--查看提交历史
# git log --pretty=oneline # 按每行格式化日志输出
--版本回退
# git reset --hard arg
arg:
(1) HEAD: 表示当前版本
HEAD^:表示上个版本
HEAD^^:表示上上个版本
HEAD~30:表示往上30个版本
# git reset --hard HEAD^:回复到上个版本
(2) commit_id
# git reset --hard 3628164
--查看命令历史
# git reflog
--工作区和暂存区
工作区:当前git工作目录 如learngit
暂存区:工作区里有个版本库即.git,版本库里有暂存区,每次git add都是将文件提交到暂存区,git commit则是将文件从暂存区提交到分支上
--查看当前工作目录下file_name与上次提交之间的差别
# git diff HEAD -- file_name
--Git跟踪的是内容不是文件
3.撤销修改操作
--file_name自修改后还没有被放到暂存区(即未git add)
# git checkout -- file_name # 丢弃工作区的修改,实现版本库的版本替换工作区的版本,回到最近一次git add 或git commit的状态
--file_name已经添加到暂存区后,又作了修改(即已git add但未git commit)
# git reset HEAD file_name # 丢弃暂存区的修改
# git checkout -- file_name # 丢弃工作区的修改,实现版本库的版本替换工作区的版本,回到最近一次git add 或git commit的状态
--file_name已经加入到当前分支中
# git reflog # 先查询命令历史
# git reset --hard commit_id # 执行版本回退
4.删除文件
--删除文件后不想恢复文件
# git rm file_name
# git commit
ps:使用rm删除文件之后,使用git commit -m "Message" -a也可提交
--删除之后想恢复文件
# git rm file_name
# git checkout HEAD file_name
5.远程仓库
--添加远程库
# git remote add origin https://github.com/github_username/dr_name.git #将本地库与github远程库关联起来,使用https协议
# git remote add origin git@git.com:github_username/dr_name.git # #将本地库与github远程库关联起来,使用https协议
# git push -u origin master #当前master分支内容推送到github远程库,-u为当前本地master分支与远程master关联起来,往后不用加-u
# git push origin master #一旦本地做了修改,执行此条命令即可同步到github
--从远程库克隆
# git clone https://github.com/github_username/dr_name.git #克隆github远程库到本地库
ps:git支持多种协议,如https等,默认为ssh。
6.分支管理
--创建分支
# git branch branch_name
--切换分支
# git checkout branch_name
# git checkout -b develop origin/dev 从远程拉取dev分支到本地,命名为develop,并切换到develop分支
--创建新分支并切换
# git checkout -b branch_name # -b参数为创建的意思,不加此选项就为切换分支,此条命令相当于上两条命令
--查看所有分支,当前分支前会有一个*号
# git branch
--合并制定分支到当前分支
# git merge branch_name
--删除分支
# git branch -d branch_name # -d只能删除已经被当前分支合并过的分支
# git branch -D branch_name # 删除未经合并的分支
--查看合并分支图
# git log --graph --pretty=oneline --abbrev-commit
--解决冲突
# 手动解决冲突,再提交就ok
# git add file_name
# git commit -m "phrase"
--合并分支时禁用Fast Forward(禁用次模式,git log 可以看到合并历史)
# git merge --no-ff -m "merge with no-ff" branch_name
--分支管理策略
# 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
--保存现场
# git stash # 当离开工作区,又不想保存,即可在离开时隐藏这些内容
--查看所有保存现场列表
# git stash list
--恢复现场
# git stash apply [stash@{n}] # 恢复现场的同时,保存现场的记录不会删除掉,需手动删除
# git stash drop [stash@{n}] # 手动删除stash记录
# git stash pop [stash@{n}] # 恢复现场的同时删除掉stash记录
--查看远程库
# git remote # -v参数详细信息
--分支推送策略
# master分支是主分支,因此要时刻与远程同步;
# dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
# bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
# feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
--pull远端到本地
# git branch --set-upstream-to=origin/<remote_branch_name> <local_branch_name> # pull远端分支代码到本地当前分支
--多人协作模式
# 首先,可以试图用git push origin branch-name推送自己的修改
# 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
# 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,git branch --set-upstream branch-name origin/branch-name
# 再进行合并,如果合并有冲突,则解决冲突,并在本地提交
# git push origin branch-name # 推送到远程库
7.标签管理
--创建标签
# git tag tag_name # 为当前所在分支创建标签
# git tag tag_name commit_id # 为过去某一次提交打标签,可先用git log --pretty=oneline --abbrev-commit查看提交历史
ps:-a参数自定义标签名,-m参数添加注释信息,-s使用PGP签名,-u使用另一个Key签名此tag
--查看本地库所有标签
# git tag #仅是列出所有标签列表
--查看某个标签详细信息
# git show tag_name
--删除本地标签
# git tag -d tag_name
--推送标签到远程库
# git push origin <tagname> # 推送某个标签
# git push origin --tags # 推送全部未推送过的本地标签
--删除远程库标签
# git tag -d tag_name # 先删除本地库标签
# git push origin :refs/tags/tag_name # 删除远程库标签
8.自定义git
--修改git显示颜色
# git config --global color.ui true
--忽略某些文件
# touch .gitignore # 在git跟目录创建一个.gitignore的隐藏文件
# echo -e "# My configurations:\nfile_name" > .gitignore # 将忽略的文件名或是类型写入此文件中
# git add .gitignore # 添加到暂存区
# git commit -m "Add gitignore file" # 提交
--配置别名
# git config --global alias.st status # 定义st为status的别名,--global针对当前用户所有仓库生效,不加则只对当前仓库生效
# 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" # 定义lg为log加一串参数的别名
# 全局属性配置文件路径存放位置: .git/config
# 当前仓库配置文件路径存放位置: .gitconfig
--搭建Git服务器(/src/gitdir)
# yum install -y git # 使用yum安装git
# useradd git # 创建一个git用户,用来运行git服务
# 收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
# git init --bare gitdir.git # 创建一个赤裸的git库
# chown -R git:git gitdir.git # 修改git目录属主属组都为git
# sed ‘s@\/bin\/bash@/bin/nologin@g‘ /etc/passwd # 禁止git用户登陆系统
# git clone git@server:/srv/gitdir.git # 在本地克隆git服务器上的远程库
ps:要方便管理公钥,用Gitosis,要像SVN那样变态地控制权限,用Gitolite。
本文为学习廖雪峰官方网站上Git教程后自己整理的笔记
Git官方站点:http://www.git-scm.com/
廖雪峰官方网站Git教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
Git Community Book 中文版:http://gitbook.liuhui998.com/index.html
GitHub Cheat Sheet:https://training.github.com/kit/downloads/github-git-cheat-sheet.pdf
本文出自 “Hello,Linux” 博客,转载请与作者联系!
标签:git
原文地址:http://soysauce93.blog.51cto.com/7589461/1697284