Git 日常操作

573 阅读7分钟

集中式和分布式版本控制工具的区别

先说说集中式版本控制,它是有一台版本控制服务器作为仓库,当用户拉取的时候,下载的是最新的版本仓库,相当于只对最新的版本做了一个镜像拷贝。

再来说说分布式版本控制,它也是一个仓库,当用户拉取的时候,下载的是整个版本仓库的一个镜像拷贝,相当于你本地的仓库和服务器仓库都是完成的版本信息。

这样架构的话集中式和分布式会造成什么影响和差异呢

  1. 集中式版本控制当服务器本仓库删除或者发生意外,数据难以恢复,而分布式相当于,每一个用户都有一个完整的版本库,重新上传版本到线上即可
  2. 当集中式的仓库宕机后或者本地无法联网的时候,git还是可以继续把需要提交的版本存放到本地仓库,等待联网或服务器恢复后推送本地仓库到远程仓库做同步,这是集中式版本控制很难完成的

Git 命名规范

  • master(主分支,永远是可用的、稳定的、可直接发布的版本,不能直接在该分支上开发)
  • develop(开发主分支,代码永远是最新,所有新功能以这个分支来创建自己的开发分支,该分支只做只合并操作,不能直接在该分支上开发)
  • feature-xxx(功能开发分支,在develop上创建分支,以自己开发功能模块命名,功能测试正常后合并到develop分支)
  • release(预分布分支,在合并好feature分支的develop分支上创建,主要是用来测试bug的分支,修改好bug并确定稳定之后合并到develop和master分支,然后发布master分支)
  • release-fix(功能bug修复分支,在release上创建分支修复,修复好测试出来的bug之后合并回release分支。)
  • hotfix-xxx(紧急bug修改分支,项目上线之后可以会遇到一些环境问题需要紧急修复,在master分支上创建,流程跟release分支相似,修复完成后合并到develop和master分支)

注意事项:

一个分支尽量开发一个功能模块,不要多个功能模块在一个分支上开发。 开发过程中,如果组员A开发的功能依赖组员B正在开发的功能,可以待组员B开发好相关功能之后,组员A直接pull组员B的分支下来开发,不需要先将组员B的分支 merge 到develop分支。
feature 分支在申请合并之前,最好是先 pull 一下 develop 主分支下来,看一下有没有冲突,如果有就先解决冲突后再申请合并。

SSH

ssh-keygen -o -t rsa -b 4096 -C "email@ccb.com"
cat ~/.ssh/id_rsa.pub

把 ssh 公钥复制到 git SSH Keys 上做一个互信

git help

查看git指定命令的帮助文档

git help [command]

git init

git 初始化

git init

git remote

添加远程仓库

git remote add origin https://gitee.com/Emlice/whistle-bos
git remote add [仓库名] [仓库地址]

git config

修复gitk图形界面中文乱码

git config --global gui.encoding utf-8

查看 git 用户设置

git config --list

存在多个相同的常量,取最下面的

修改用户名配置

系统用户配置

git config --system user.name "Emlice"
git config --system user.email "xiaomozyw@sina.com"

全局用户配置

git config --global user.name "Emlice"
git config --global user.email "xiaomozyw@sina.com"

项目用户配置

git config user.name "Emlice"
git config user.email "xiaomozyw@sina.com"

优先级:项目->全局->系统

设置记住密码 (默认15分钟)

git config --global credential.helper cache

设置记住密码的实效

git config credential.helper 'cache --timeout=3600'

长期存储密码

git config --global credential.helper store

git clone

拉取指定分支或tag点的项目于 [renameDir] 文件夹

git clone -b [branch/tags] [url] [renameDir]

git branch

新建本地分支

git branch XXX

删除本地分支

git branch -d XXX

重命名本地分支

git branch -m oldName newName

删除本地分支

git branch -d xxx

git checkout

丢弃工作区的所有修改

git checkout .

丢弃工作区某个文件的修改

git checkout -- [file]

切换分支

git checkout XXX

新建分支并切换

git checkout -b XXX

新建本地开发分支并关联远程分支

git checkout -b XXX origin/XXX

创建本地分支并把线上分支拉下来

git checkout -t XXX

git merge

把本地xxx分支合并到当前分支

git merge xxx

把远程xxx分支合并到当前分支

git merge origin/xxx

git fetch

拉取远程origin仓库到本地仓库,工作区并不会改变

git fetch origin

git push

新建远程分支并将本地分支推送到该分支

git push origin dev:dev

删除远程分支

git push origin :XXX

上传本地仓库并产生关联

git push origin dev -u

git stash

将工作区的修改储存起来

git stash

将工作区的修改释放出来

git stash pop

git tag

给历史版本打标签

git tag -a v1.0 [sha1:ID]

分享本地所有标签

git push origin --tags

参数解析:
-a 表示要建立带有附注的标签
-m 类似于普通提交让你输入附注信息, 如果省略则弹出 VIM

git archive

导出仓库某个时间点的代码,可设置导出格式(zip/tar/gz.tar)

git archive -v --format=zip v0.1 > v0.1.zip

--format 表示导出的格式
-v 表示对应的tag

git 功能片段

  1. 新建远程分支

git checkout -b aaa

git push origin aaa(本地分支):bbb(远程分支) / git push origin aaa

  1. 新建一个本地跟踪分支(即可以直接通过git push 和 git pull 操作)
git checkout -b xxx origin/xxx / git checkout --track origin/xxx
  1. 发布一个版本标签
git tag -a v1.0 -m "xxxx"
git push origin v1.0
  1. 修剪远程仓库已删除,本地仍旧存在的远程分支(git branch --all)
# 显示所有远程分支情况
git remote show origin
# 修剪远程仓库已删除的分支
git remote prune origin
  1. git clone 指定分支代码并切换到该分支
git clone -b [分支名/tags] [远程仓库地址]
  1. git 清除未跟踪的文件
# 清除未跟踪的文件
git clean -f
# 清除未跟踪的文件夹
git clean -d
# 查看将要清除的文件文件夹
git clean -nfd
  1. 修改远程仓库地址

方法一

# 先清除本地远程仓库, 再重新添加
# 删除
git remote rm [远程仓库简称/默认的是 origin]
# 新增
git remote add [远程仓库简称] [详细地址]

方法二

直接修改 config 文件
进入本地仓库配置目录.git找到config文件,修改关键字

注意

注意不要用git remote set-url去改动,会造成pullfetch地址不一致

  1. 给历史版本打tag
# 查看版本日志 | 单行查看
git log --oneline

# 获取版本comit 
git tag v1.0 abcdef

# 查看版本记录是否在对应 commit 打上 tag 点
git log --oneline
  1. 重写 commit
git commit --amend

git 知识点

merge 和 rebase(衍合)

merge是a分支和b分支还有a和b分支的第一个祖先版本做一个三方合并。而rebase是把a分支的东西在b分支上重打一遍,相当于补丁。

合并和衍合最大的区别在于,衍合能得到干净的历史记录,看起来就像是从头到尾都在一条线上开发的一样,并且衍合是重演了一次修改动作,而合并只是把结果合在一起。

merge
rebase

特别注意:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。

# 衍合操作
git rebase [主分支] [特性分支]

友情提示:当你发现命令无效的甚至报错的时候,可能是你的git版本太低了!!!

远程仓库宕掉或误删除, 如何恢复

先将本地仓库推送至新仓库

  1. 首先新建一个空的远程仓库
  2. vi .git/config修改原远程仓库的地址更正为新地址
  3. git push origin --all把本地所有分支推送到远程仓库
  4. git push origin --tags把本地所有 tag 点推送到远程仓库

再尝试还原不是自己的开发的分支, 从 fetch 中还原(只是原仓库的历史版本, 不能保证最新)

  1. git branch -r查看原远程仓库镜像, 看是否有可还原的的分支
  2. git checkout -b xxx origin/xxx 把原远程仓库的分支基础上创建本地新分支
  3. git push origin xxx把这个分支推送到新的仓库去

注意

这次操作告诉我们,要把git pullgit fetch当做一种习惯去同步远程仓库和本地仓库的代码

拓展

你不一定知道的几个很有用的 Git 命令