GIT-study(一)

版本控制系统:

VCS,version control system 记录文件内容变化,查阅特定版本修订情况的系统

某个文件或者整个项目回溯到之前的状态,减少恢复项目的工作量
比较文件变化细节
记录何时,为何,谁提交了修改

本地版本控制:

复制整个项目目录加备份时间;
使用数据库记录文件更新差异 version database;
RCS reversion control system 在硬盘上保存补丁集
在这里插入图片描述

集中化的版本控制系统:SVN

CVCS centralize version control system 单一集中管理服务器,保存所有文件修订版本,协同工作通过客户端连接服务器,方便管理,服务器单点故障会导致无法提交更新,丢失项目所有变更历史
在这里插入图片描述

分布式版本控制系统:git

DVCS distributed version control system 客户端包括最新版本的文件快照,代码仓库,完整的历史记录,每一次克隆操作都是对代码仓库的完整备份在这里插入图片描述

Git

  1. 快照流

其他cvs以文件变更列表的方式存储信息
git 对当时的全部文件创建一个快照并保存快照的索引,而非文件差异,未修改的文件只保存链接指向之前存储的文件。

  1. 本地执行操作

在本地磁盘上就有项目的完整历史,绝大数操作只要访问本地文件和资源,速度快
浏览项目历史:从本地数据库中读取
查看修改:查找之前文件做一次本地差异计算
提交本地副本

  1. 校验和保证完整性

所有数据存储前都计算校验和
保存信息以文件内容的哈希值索引
SHA-1散列,有40个十六进制字符组成的字符串

  1. 一般只添加数据,不删除数据
  2. 三种状态

已修改:已修改,没保存数据库中。在工作区
已暂存:对已修改文件的当前版本做了标记,加入下次提交的快照。在暂存区
已提交:安全保存在本地数据库,在git目录

工作区:对项目的某个版本独立提取出来的内容,在磁盘上供使用和修改
暂存区:保存下次提交的文件列表信息的文件
git仓库目录:保存项目元数据和对象数据库的地方,克隆源

  1. 配置git

获取最新的git:
git clone git://git.kernel.org/pub/scm/git/git.git

git config

git config --system 访问/etc/gitconfig修改系统配置
git config --global 访问~/.gitconfig或 ~/.config/git/.gitconfig修改当前用户配置,对所有仓库生效
git config --local 访问.git/config当前仓库的git目录的config
最小范围的配置优先级最高

git config --global user.name “John Doe”
git config --global user.email johndoe@example.com
git config --global core.editor emacs设置文本编辑器
git config --global core.editor "‘C:/Program
Files/Notepad++/notepad++.exe’ -multiInst -notabbar -nosession -noPlugin"在windows上指定文本编辑器需要指定可执行文件的完整路径
git config --list --show-origin 查看配置及所在的文件
重复的变量表示从不同的文件中读取同一个配置,以最后一个为准
git config user.name检查某一项配置比如用户名
git config --show-origin rerere.autoUpdate查询某一变量的原始值及生效的配置文件

git config --global alias.ci commit 给命令设置别名
设置之后git commit 可以用git ci
git config --global alias.unstage ‘reset HEAD --’
git config --global alias.last ‘log -1 HEAD’

git config --global alias.visual '!gitk’给非git子命令的外部命令设置别名,需要加!

  1. 获取git仓库

本地目录转换为仓库
cd /home/user/my_project
git init
git add .
git commit -m ‘initial project version’
从其他服务器克隆一个已存在的仓库
git clone https://github.com/libgit2/libgit2 拷贝
git clone https://github.com/libgit2/libgit2 mylibgit拷贝并改名
clone默认仓库名为origin

git status

已跟踪:在上一次快照时有他们的记录或暂存区
未跟踪:除已跟踪以外的文件,新增文件未暂存和提交
在这里插入图片描述
在这里插入图片描述
nothing to commit, working directory clean:工作区无更新
Untracked files:未跟踪
Changes to be committed:暂存待提交
Changes not staged for commit:已修改未暂存

git add

只会把当前版本文件加入暂存区,再修改之后会同时出现在"已修改未暂存"和"暂存待提交",需要重新运行git add把最新版本暂存

git diff

通过文件补丁的格式具体显示未暂存的改动
git diff --staged 已暂存等待提交的更新
git difftool调用软件分析diff结果

git commit

提交暂存区,未暂存的仍然保持已修改状态
git commit -m ‘mark’ 提交并设置修改点提示
git commit -a -m ‘mark’ 暂存并提交所有已跟踪的文件
git config --global core.editor设置喜欢的编辑器
默认提交消息包含最后一次运行status的输出
git commit --amend 会讲暂存区的文件提交,覆盖原来的提交信息,代替第一次提交的结果

git rm

1、
rm project.md 单纯移除某个文件 会显示更新未暂存
git add project.md把这次删除放入暂存区
2、
git rm project.md 移除本地的未修改文件,把这次删除放入暂存区,下次提交之后就不会跟踪该文件

git rm -f project.md 强制移除已修改或已暂存的文件
git rm --cached README 移除仓库的文件,保留本地文件
git rm -r 递归删除

git mv

git mv file_from file_to 文件更名
相当于
mv README.md README
git rm README.md
git add README

git log

不传参默认按照时间先后顺序列出所有提交历史
git log -p -2以补丁的格式显示每次提交引入的差异,显示最近两条
git log --stat 显示每次提交的简略差异
git log --pretty=oneline 使用不同格式显示提交历史,例如一行内显示一个提交
git log --pretty=format:“%h - %an, %ar : %s"定制记录的显示格式
在这里插入图片描述git log --pretty=format:”%h %s" --graph (graph参数)ASCII图形结构展示分支和合并历史
在这里插入图片描述
git log --since=2.weeks列出最近两周的提交
git log -S function_name 显示添加或删除该字符串的提交
git log --pretty=“%h - %s” --author=‘Junio C Hamano’ --since=“2008-10-01” --before=“2008-11-01” --no-merges – t (–no-merges)不显示合并提交
git log path显示某些文件或目录的历史提交
在这里插入图片描述git log --oneline --decorate查看各个分支当前所指的对象
git log --oneline --decorate --graph
–all 查看提交历史分支指向及分支分叉情况

git tag

列出已有标签

可以给某一个历史提交打标签,标记发布节点
git tag -l "v1.8.5*"按照特定的模式查找标签

git tag -a v1.2 9fceb02 给过去的某一个提交打标签

git tag -a v1.4 -m "my version 1.4"创建附注标签(-m)指定存储在标签中的信息
git show v1.4显示标签信息和对应的提交信息

git tag v1.4-lw 将提交校验和存储到一个文件的轻量标签
git show v1.4-lw 不会看到额外的标签信息,只会显示提交信息

git tag -d < tagname > 删除本地仓库的某一个标签

git push origin < tagname > 必须显示提交标签到远程服务器
git push origin --tags 提交所有新标签

删除远程标签
git push < remote > :refs/tags/< tagname >
git push origin --delete < tagname >

git checkout 2.0.0 查看某个标签指向的文件版本,会使仓库处于分离头指针状态,此时新提交不属于任何分支
git checkout -b version2 v2.0.0用某一标签指向的文件版本创建新分支

撤销操作

git commit --amend 代替上一次提交的结果。
git reset HEAD somefile取消暂存某文件,文件处于已修改未暂存状态
git checkout – somefile 撤销某文件的修改,处于未修改状态,会用最近提交的版本覆盖本地文件

  1. 远程仓库
    可以在本机或网络服务器,可以有若干个远程仓库,根据需求管理,推送,拉取数据
    git clone https://github.com/schacon/ticgit从远程仓库克隆
    cd ticgit
    git remote 列出远程仓库的简写
    git remote -v 显示远程仓库简写与其对应的 URL
    git remote show < remote > 列出远程仓库URL和跟踪分支的信息,列出哪些远程分支不在本地,git push会自动推送到哪一个远程分支,git pull哪些本地分支可以和跟踪的远程分支合并

git remote add < shortname > < url >添加一个远程仓库及指定简写,eg:git remote add pb https://github.com/paulboone/ticgit
git remote rename pb paul 把远程分支pb重命名为paul
git remote remove paul移除远程仓库及相关的远程跟踪分支及配置信息

git fetch pb 拉取pb仓库在克隆或者上一次拉取之后更新的部分
git pull自动抓取并合并该远程分支到当前分支
git clone
git push origin serverfix把本地的serverfix分支推送到origin远程仓库的serverfix分支

  1. 分支

提交会保存提交对象,提交对象会包括指向暂存内容快照的指针以及指向他父对象的指针
首次提交对象没有父对象,普通提交对象有一个父对象,多个分支合并提交对象会有多个父对象

blob对象:保存文件快照
树对象:记录目录结构和blob对象索引
提交对象:包含所有提交信息(blob+树)及上一个提交对象(父对象)的指针
在这里插入图片描述
在这里插入图片描述默认分支名为master
有新提交之后当前分支会自动向前移动指向最新的
HEAD指针指向当前所在的本地分支

一般在master上保留稳定的,已发布的代码
在develop或者next分支用来做后续开发,稳定测试之后合并到master
实现单一特性或其相关工作的主题分支,方便查看相关改动,可重用,成熟之后再合并到主分支

git branch

git branch 返回分支列表及当前分支
git branch -v 每个分支最后一次提交
git branch --merged 过滤已合并分支,可删除无*号分支
git branch --no-merged查看未合并分支
git branch --no-merged master未合并到master的分支

git branch testing创建一个新分支,即可以移动的新指针,此时head依然指向原分支
git checkout testing切换到已存在的分支,head指向新分支,之后的提交会自动更新新分支,旧分支保持不变

切换分支时会同时修改本地目录的文件,恢复到该分支最后一次提交的样子,切换之前必须没有已修改和已暂存的文件

git checkout -b testing 创建并切换到新分支

git branch -d hotfix删除分支

git merge

git merge testing把testing分支合并到当前分支
如果待合并的两个分支只需移动指针,无合并冲突,即为快进
如果待合并分支间有分叉,会使用两个分支及两个分支的公共祖先做三方合并,合并会产生一个新的快照和新的提交,被称为合并提交,有若干个父提交
针对同一部分的修改,会产生合并冲突,会暂停等待解决合并冲突,unmerged,打开文件手动解决冲突,之后使用git add 标记为冲突已解决,全部完成之后再commit

git mergetool图形化合并工具

git rebase

变基,将提交到某一分支上的所有修改移到另一分支上,可以保证提交历史的整洁,有风险 P98,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行
变基操作
git checkout experiment
git rebase master
切换到experiment分支,把当前分支基于最近共同祖先的修改提取为临时文件,切换到目标分支,依序修改
在这里插入图片描述
git checkout master
git merge experiment快进合并

git rebase --onto master server client取出 client 分支,找出它从 server 分支分歧之后的补丁, 然后把这些补丁在
master 分支上重放一遍,让 client 看起来像直接基于 master 修改一样
在这里插入图片描述git rebase master server
在这里插入图片描述

  1. 远程分支

远程引用是对远程仓库的引用,包括分支、标签
远程跟踪分支是远程分支状态的引用,无法移动的本地引用,可以移动以精确反映远程仓库的状态,可以显示最后一次连接远程仓库的位置
跟踪分支是与远程分支有直接关系的本地分支

origin/master 远程仓库origin的master分支
拉取origin/master时本地有origin/master分支做远程跟踪,有master做(本地)跟踪分支

在跟踪分支上git pull时会自动识别远程仓库地址和远程分支
在这里插入图片描述git ls-remote < remote >显示远程引用
git remote show < remote >显示远程分支完整信息
git remote add origin1 git://git.team1.ourcompany.com添加远程仓库引用,并设置别名

git fetch < remote >抓取本地没有的数据,更新本地数据库,但不会更新工作目录,移动origin/master指针到更新之后的位置;
远程仓库增加分支,更新之后本地仓库也会更新分支,且存在remote/branch分支,不会有新的branch本地跟踪分支,需要在远程跟踪分支基础上再创建一个

git pull 会查找当前分支所跟踪的服务器与分支, 从服务器上抓取数据然后尝试合并入那个远程分支,相当于git fetch 和 git merge

git checkout -b serverfix origin/serverfix 根据远程跟踪分建立新本地跟踪分支
git checkout --track origin/serverfix
git checkout serverfix 检出的分支不存在且只有一个匹配的远程分支

git branch -u origin/serverfix设置已有本地分支跟踪一个刚刚拉取下来的远程分支,或修改上游分支
git branch -vv查看设置的所有跟踪分支
git fetch --all; git branch -vv 统计最新的领先与落后数字,需要抓取所有的远程仓库
在这里插入图片描述

git push

git push origin serverfix把本地的serverfix分支推送到origin远程仓库的serverfix分支,必须有origin的读写权限,且没有其他人更新推送,如果其他人先推送,需要合并更新之后再尝试推送
git push origin serverfix:serverfix
git push origin serverfix:awesomebranch把本地的serverfix分支推送到origin远程仓库的awesomebranch分支

git push origin --delete serverfix删除远程分支

git push origin < tagname > 必须显示提交标签到远程服务器
git push origin --tags 提交所有新标签

删除远程标签
git push < remote > :refs/tags/< tagname >
git push origin --delete < tagname >

.gitignore

列出要忽略的文件模式
所有空行或以#开头的行都会忽略
glob模式(简化的正则表达式)匹配,递归应用在整个工作区
模式以/开头防止递归,只包括当前目录
以/结尾指定目录
要忽略指定模式以外的文件或目录,在模式前加!
*匹配0或多个任意字符
[abc]匹配任意一个在方括号内的字符,a或b或c
?匹配一个字符
[0-9]方括号使用短划线分割表示两个字符范围内任意
a/**/z匹配任意中间目录

eg:
doc/.txt 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/**/
.pdf 忽略 doc/ 目录及其所有子目录下的 .pdf 文件

服务器

一个远程仓库通常是裸仓库,没有工作目录
git clone --bare my_project my_project.git把现有仓库导出为裸仓库,裸仓库的目录名以 .git 结尾
相当于cp -Rf my_project/.git my_project.git
scp -r my_project.git user@git.example.com:/srv/git 把裸仓库复制到服务器指定目录
git clone user@git.example.com:/srv/git/my_project.git 其他可以通过SSH读取该目录的用户,可克隆该仓库,只要用户可读写该目录,均可访问修改该仓库

ssh user@git.example.com
cd /srv/git/my_project.git
git init --bare --shared 会自动修改仓库目录的组权限为可写

控制权限:
1、给用户创建账号,并设置密码
2、在主机建立git账户,让用户发送SSH公钥,将其添加到git账户的~/.ssh/authorized_keys文件
3、SSH集中授权
用户的SSH密钥在~/.ssh目录下,公钥.pub,对应的为私钥
ssh-keygen -o 生成密钥,-o以更能抗暴力破解的格式保存私钥

配置服务器
P111

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值