git学习笔记
2019-03-25 10:17:53 0 举报
AI智能生成
git学习比较
作者其他创作
大纲/内容
版本控制
什么是版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制的好处
没有使用版本控制
如果你是位作家,可能会需要不断修改小说不同的修订版本,在没有版本控制的时候很可能是这样
使用版本控制
有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。
版本控制的方式
集中式
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
缺点
必须联网才能工作,非局域网情况下依赖传输速度,效率低下
安全性低,集中式版本控制系统的中央服务器要是出了问题,就无法干活
优点
每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限
子主题
分布式
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
优点
分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库
分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改。
子主题
git 概述
git安装和配置
配置全局用户名和邮箱
git config --global user.name "[name]"
git config --global user.email "[email address]"
若是个人开发机可以这样配置,若是公共编译机则不能这样配置
配置当前仓库用户名和邮箱
git config user.name "[name]"
git config user.email "[email address]"
查看当前仓库的所有配置信息
git config --list
git 特性
git 使用分布式管理
git 直接记录快照,而非差异比较
git 近乎所有操作都是本地执行
Git 保证完整性
Git 一般只添加数据
git 架构
本地仓库结构
工作区,版本库(暂存区,历史库)组成了本地仓库
本地仓库(版本库)
版本库存放了项目的所有分支.图中蓝色部分展示的就是当前分支【HEAD指针指向的分支被称作为当前分支】master在版本库中的结构,这里版本库是一本书,我们把项目中每一页看做这个项目的某一个分支。HEAD就好比书签指示我现在正在操作的分支。
每一个分支在版本库中都会存在一个暂存区目录(index)和历史库(master)
暂存区
暂存区保存了待提交到历史库中数据,在初始状态下 暂存区中的数据和到历史库中的数据是一致的,我们会把工作目录修改会不断通过add命令提交覆盖暂存区数据,等到确认无误后通过commit 命令提交到历史库中
暂存区的撤销
如果是在暂存区中文件不存在于历史库中,可以使用rm --cached 命令从暂存区清理该文件。
如果是在暂存区中文件存在于历史库中,可以使用 reset --HEAD 使用历史库中文件覆盖暂存区
历史库
历史库表示已经提交到版本库中文件
暂存区和历史库中的数据存储结构都是逻辑上存储结构,使用git objects对象来存储
工作目录
当我们切换分支时,会把历史库中逻辑数据结构数据写入到我们的物理磁盘上。让磁盘上得数据和历史库中结构数据保持一致,当我们需要对分支文件信息做变更时,可以先添加或修改工作区的数据,使用add命令提交到暂存区中,最后提交变更到历史库中。
工作区的撤销
我们可以使用 git checkout --file 命令将工作区的修改撤销
如果文件被提交到暂存区则会使用暂存区的数据覆盖工作区
如果文件未被提交到暂存区则使用分支目录的数据覆盖工作区
我们也可以使用git chekout HEAD
强制使用分支目录数据覆盖工作区
git 数据逻辑结构
git 逻辑结构使用三种对象保存
blob object
git 中每一个文件信息内容会用一个blob object 对象来保存,当我们新建修改文件提交到暂存区内时,git会为我们创建一个blob object
demo1
- 添加一个新文件到暂存区
- 查看.git/object 中所有对象,获取新对象的SHA-1
find .git/objects -type f
- 使用命令查看新添加blob object内容
git cat-file -p 3f90bb79db0d6f5848bc0ddb17bfbc78968a6a64
demo2
使用底层命令创建一个blob object对象
-w 选项指示 hash-object 命令存储数据对象;若不指定此选项,则该命令仅返回对应的键值
--stdin 选项则指示该命令从标准输入读取内容;若不指定此选项,则须在命令尾部给出待存储文件的路径
该命令输出一个长度为 40 个字符的校验和。 这是一个 SHA-1 哈希值——一个将待存储的数据外加一个头部信息(header)一起做 SHA-1 校验运算而得的校验和
demo3
我们可以使用命令将对象中的信息写入到某个文件
tree object
git 中暂存区和历史库中的数据目录结构会使用一个tree object对象来保存.它是一个树状结构,其内部子节点可能是一个tree object,也可能是一个blob object.git在提交暂存区中数据到历史库时会创建一个tree对象。这里我们也可以把tree对象看着一次提交的数据映像.
树状结构
demo1
我们可以将 blob object demo1 中的文件提交到git历史库中会产生一个tree对象和一个commit对象,每一个commit对象需要和一个tree对象相关联,当提交后我们发现出现了2个新的对象,分别对应tree对象和commit对象。我们找到并查看tree object 内容显示为内部存储了一个 blob object
demo2
使用底层命令创建一个tree object对象
创建一个空文件,指定blob对象SHA-1作为文件内容添加到暂存区
我们指定的文件模式为 100644,表明这是一个普通文件。 其他选择包括:100755,表示一个可执行文件;120000,表示一个符号链
添加一个tree对象到暂存区
git read-tree --prefix=bak d8329fc1cc938780ffdd9f94e0d364e0ea74f579
--prefix 选项,将一个已有的树对象作为子树读入暂存区:
添加一个文件到暂存区
git update-index --add new.txt
将暂存区中的数据生成为一个tree 对象
git write-tree
commit object
git 中每一次提交都会保存为一个commit对象,这个commit对象仅仅只是一个指针,真正的数据是和提交时创建的一个tree对象相关联,每一个commit对象除了第一次提交都会存在一个父commit对象,这样一次次提交组成了链式结构
demo1
我们可以将 blob object demo1 中的文件提交到git历史库中会产生一个tree对象和一个commit对象,每一个commit对象需要和一个tree对象相关联,当提交后我们发现出现了2个新的对象,分别对应tree对象和commit对象。我们找到并查看tree object 内容显示为内部存储了一个 tree object
demo2
使用底层命令创建一个tree object对象
commit-tree 指定关联tree 对象的SHA-1
-p 指定父提交对象
相关命令
git cat-file -p SHA-1
cat-file 命令从 Git 那里取回对象的数据, -p 选项可指示该命令自动判断内容的类型,并为我们显示格式友好的内容
对象为 blob
对象为 tree
对象为 commit
find .git/objects -type f
查看 Git对象列表
.git目录结构如下
hooks
不同操作时执行的hook脚本
logs/refs/heads
各个本地分支的版本log记录
logs/refs/remotes
各个远程分支cache的log记录
logs/refs/stash
储藏区数据
logs/HEAD
gitHEAND指针操作记录
objects
2级文件索引(把SHA-1哈希值拆成了:2位+38位),存储commit数据对象、blob文件数据对象和tree目录数据对象
objects/pack
pack文件为存储commit、tree目录及blob文件的压缩数据
objects/info/packs
该文件记录所有git库的pack文件列表
refs/heads
本地分支列表
refs/remotes
远程仓库远程分支列表
refs/tags
各个附注标签的信息
COMMIT_EDITMSG
上一次提交的注释
config
版本库相关的配置信息
description
仓库描述信息,供gitweb程序使用
index
暂存区相关的信息
HEAD
指向当前分支的最近提交(如:ref: refs/heads/master)
ORIG_HEAD
执行git merge/git pull/git reset操作时,会把调整为新值之前的先前版本的HEAD记录到OERG_HEAD中,用于恢复或回滚之前的状态
FETCH_HEAD
git fetch将所有抓取分支的HEAD记录到.git/FETCH_HEAD中
MERGEHEAD
正在合并进HEAD的commit id
packed-refs
远程版本库cache和远程标签cache
git版本控制
常用指令
创建 Git 仓库
Git 仓库文件中存在一个.git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干
命令
git init
在当前目录下创建git仓库
git init xxx
在当前目录下创建一个子文件夹xxx,在这子文件xxx中创建git仓库
场景
如果你是打算开发一个新项目那么你需要使用此种方式创建git仓库
撤销工作区的变更
git checkout -- <file>
如果文件被提交到暂存区则会使用暂存区的数据覆盖工作区(当前状态是这种情况,在此回退文件first.txt,执行后文件信息为first commit)
如果文件未被提交到暂存区则使用分支目录的数据覆盖工作区
选项
HEAD
我们也可以使用git chekout HEAD 强制使用历史库最新提交的数据覆盖工作区和暂存区
HEAD~
我们也可以使用git chekout HEAD~ 强制使用历史库中某个提交的数据覆盖工作区暂存区
demo
子主题
提交工作区到暂存区
git add <files...>
将文件添加到暂存区
git add .
将当前目录下(递归子目录)所有文件加入到暂存区
git add -u
将当前目录下(递归子目录)所有已经存在过历史库的文件加入到暂存区
git add Doc/\*.txt
将当前目录的Doc文件夹下(递归子目录)所有txt后缀的文件加入到暂存区
撤销暂存区的变更
git reset HEAD <file>... 可以将提交到暂存区中文件修改撤销,使用历史库中最新提交数据覆盖暂存区
git reset HEAD~ <file>... 可以将提交到暂存区中文件修改撤销,使用历史库中某一次提交数据覆盖暂存区
删除暂存区中的文件
git rm README.md
当暂存区中未跟踪该文件,执行命令失败,提示没有匹配的文件
当暂存区中已跟踪该文件,则给出如何删除的提示信息
选项
git rm --cached <file>
将暂存区中已被跟踪的文件删除,本地文件依旧被保留
git rm -f <file>
强制删除工作区和暂存区文件,并且将这次删除操作放入暂存区(即使README.md在工作区或暂存区中有修改,也会执行删除操作)
提交到历史库
提交暂存区所有文件到历史库
git commit -m "xxxx"
git 对master分支做出了一个提交
每一个提交会将暂存区的数据写入到历史库,这里会创建一个tree对象,tree对象是一个指针指向了真实数据,同时会创建一个commitobject【f0cec】来指向这个tree对象,新创建commitobject【f0cec】的父提交对象指向上一次提交的 commitobject【ed489】,将master指针和【HEAD】指针移动到新创建的commitobject【f0cec】。
git 对master 父提交节点maint分支做出了一个提交
这里和master提交不同的是创建的commitobject对象【1800b】父commitobject对象是maint分支指向commitobject【a47c3】
提交暂存区部分文件提交到历史库
git commit README.md -m "desc"
提交工作区所有变更添加到暂存区后直接提交到历史库
git commit -m -a "xxxx"
选项
-m
指定提交的备注
--amend
撤销上次提交,将暂存区的数据和上次提交的数据合并成一次新的提交
这里会将暂存区数据和上次提交的commitobject【ed489】合并成一个新的commitobject【4ca87】
-a
添加工作区和暂存区中的所有修改提交到本地仓库
回退分支到某次父提交,做回退操作
测试DEMO
git reset [commit | HEAD~]
reset命令可以移动HEAD指针和当前分支指针到某一个提交的位置,并且有选择的改变工作区和暂存区的数据
demo
git reset HEAD^
回退到上一个版本,仅仅只是改变指针的位置,不改变工作区和暂存区的数据
选项
--soft
git reset --soft HEAD^
回退到上一个版本,仅仅只是改变指针的位置,不改变工作区,仅同步历史库中的数据到暂存区
demo
--hard
git --hard --soft HEAD^
回退到上一个版本,仅仅只是改变指针的位置,同步历史库数据同步改变到工作区和暂存区的数据
demo
git reflog
当使用reset命令将HEAD和当前分支切换到父提交某个提交上,git log无法查看到回退前的分支,这里使用reflog查看“未来”某个时刻的提交记录
查看版本库状态
git status 命令的默认会输出十分详细,但其用语有些繁琐。
git status -s 输出简单状态
新添加到暂存区中的文件前面有 A 标记
修改过的文件前面有 M 标记
出现在右边的 M 表示该文件被修改了但是还没放入暂存区
出现在靠左边的 M 表示该文件被修改了并放入了暂存区
新添加的未添加到暂存区 ??标记
查看历史库信息
git log
显示当前分支的历史提交信息
选项
--oneline
历史提交信息以单行显示
-n3
显示最近的3次提交信息
--all
显示所有分支的提示信息
查看不同区域的改变
git diff
比较当前文件和暂存区中文件的差异
git diff
比较暂存区中的文件和上次提交时的差异
git diff --staged
git diff --cached
比较当前文件和上次提交时的差异
git diff HEAD
查看从指定的版本之后改动的内容
git diff <commit ID>
比较两此提交之间的差异
git diff <commit ID> <commit ID>
比较两个分支之间的差异
git diff <分支名称> <分支名称>
DEMO
记录每次更新到提交到仓库
创建一个新文件提交到版本库
1 初始化仓库
$ git init git
检查当前文件状态
表示说明你现在的工作目录相当干净。所有已跟踪文件在上次提交后都未被更改过。
2 工作目录中创建一个文件
$ echo 'first commit' > first.txt
检查当前文件状态
Untracked files 表示未跟踪的文件,即工作区中新添加文件【并未受git版本控制】
提示使用 "git add <file>..." 命令可以将Untracked files列表中的文件添加到 “will be committed” 列表中 【也就是暂存区中】
3 新文件添加到暂存区
$ git add first.txt
检查当前文件状态
Changes to be committed 表示 将要提交到分支的文件,代表文件存在于暂存区中。
提示使用 “git rm --cached <file>” 命令对工作区中新添加文件【并未受git版本控制】从暂存区清理,回退到“Untracked files” 列表状态中
git add .
添加所有文件
4 将暂存区中数据提交到版本库
$ git commit -m "first commit"
检查当前文件状态
修改被存在于版本库中的文件,重新提交到版本库
5 修改已经被存在于版本库中的文件
$ echo "update first commit" > first.txt
检查当前文件状态
”Changes not staged for commit” 表示修改了工作区中文件列表,需要使用add将文件加入都暂存区中后,将修改提交到本地分支上
提示使用 "git add <file>..." 命令可以将”Changes not staged for commit”列表中的文件添加到 “will be committed” 列表中 【也就是暂存区中】
提示使用 "git checkout -- <file>..." 命令可以将文件在工作区的修改全部撤销,
如果文件被提交到暂存区则会使用暂存区的数据覆盖工作区(当前状态是这种情况,在此回退文件first.txt,执行后文件信息为first commit)
如果文件未被提交到暂存区则使用分支目录的数据覆盖工作区
我们也可以使用git chekout HEAD 强制使用分支目录数据覆盖工作区
6 将工作区修改的文件添加到缓冲区
$ git add first.txt
检查当前文件状态
”Changes to be committed ” 表示”将要提交到分支的文件,代表文件存在于暂存区中。
提示使用 "git reset HEAD <file>..." 可以将提交到暂存区中文件修改撤销,使用历史库中数据覆盖暂存区,并回退到 ”Changes not staged for commit” 列表中状态中,此时工作区中数据并非撤销仅仅是指撤销暂存区中逻辑数据结构。
7 修改已经添加到缓冲区未提交的文件
$ echo "update new first commit" > first.txt
检查当前文件状态
当前文件first.txt会同时存在于“Changes to be committed”和“Changes not staged for commit” 中,如果提交只会将暂存区中的文件信息“update first commit”提交到分支,还未到暂存区的文件不会被提交。
提示使用 "git add <file>..." 命令可以将”Changes not staged for commit”列表中的文件添加到 “will be committed” 列表中 【也就是暂存区中】,此时暂存区中first.txt中文件内容更新为“update new first commit”.
提示使用 "git checkout -- <file>..." 命令可以将文件在工作区的修改全部撤销,
如果文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态。
如果文件已经添加到暂存区后,又在工作区中进行了修改,撤销修改就回到添加到暂存区后的状态。(当前状态是这种情况,在此回退文件first.txt,执行后文件信息为 "update first commit")
不要少了 --
提示使用 "git reset HEAD <file>..." 可以将提交到暂存区中文件做清理,并回退到 ”Changes not staged for commit” 列表中状态中,此时工作区中first.txt文件内容为"update new first commit"
8 将暂存区中修改的文件提交到版本库中
$ git commit -m "update first.txt commit"
检测文件当前状态
9 将工作区修改的文件直接提交到版本库(跳过暂存区)
$ git commit -a -m "update new first.txt commit"
检查当前文件状态
给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
修改被存在于版本库中的文件名,提交到版本库
10 修改文件名称
$ git mv first.txt mv.txt
检查当前文件状态
其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
$ mv README.md README
$ git rm README.md
$ git add README
11 将暂存区中修改的文件提交到版本库中
$ git commit -m "update file name"
检测文件当前状态
删除版本库中的文件,提交到本地仓库分支
12 删除版本库中的文件
$ git rm mv.txt
检测文件当前状态
13 将暂存区中修改的文件提交到版本库中
$ git commit -m "delete mv.txt"
检测文件当前状态
忽略的文件
通过git仓库下的.gitignore文件屏蔽某些中间文件/生成文件
git 标签管理
概述
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针
特点
本质上跟分支很像,区别在于分支指向可以在commit对象间移动,而标签不能移动
1、查看tag
查看tag列表
查看本地所有标签
git tag
查看本地仓库标签列表,按照guan
git tag -l 'v*'
列出所有v开头的标签
查看所有远程仓库的标签
git ls-remote --tags
查看单个tag信息
git show tag
2、操作tag
本地仓库操作
添加tag
添加附注标签
给历史库中最新一次提交添加tag
git tag -a 标签名 -m 标签备注
给历史库中指定一次提交添加tag
git tag -a 标签名 commitid -m 标签备注
添加轻量标签
给历史库中最新一次提交添加tag
git tag 标签名
给历史库中指定一次提交添加tag
git tag 标签名 commitid
删除tag
删除本地仓库标签
git tag -d 标签名
删除远程仓库标签
git push origin -d 标签名
远程仓库
推送本地仓库tag推送到远端仓库
git push origin 标签名
推送所有未提交的tag
git push origin --tags
拉取远程仓库tag更新到本地仓库
git pull origin --tags
git 分支管理
分支概述
什么是分支
分支就是科幻电影里面的平行宇宙,对于一个人来说我们不可能同时开发A功能或者B功能,但对于一个git项目而言我们可以通过创建多个分支交给多个人来同时开发。在未来某个时间点,两个分支合并了让你的项目即完成了A功能又完成了B功能。
分支作用
使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
分支的本质
Git 的分支其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master, 在多次提交操作之后,其实是一个指向commit对象指针不断向前移动的过程。创建一个分支就是新建一个指针指向某一个指定的commit对象。图i中v1.0则是一个标签,它同样是一个指针,不 一样的是它无法移动。
什么是当前分支
HEAD指针指向的分支就是当前分支
什么是本地分支
本地仓库管理的分支被称为本地分支
什么是本次仓库远程分支镜像
就是远程仓库分支的快照,我们通过同步远程仓库的变更到本地仓库远程分支镜像中来和远程分支进行交互
什么是远程分支
远程分支时保存在网络上另外一个远程仓库的分支
本地分支,远程仓库分支,本次仓库远程分支镜像关系
当我们需要和网络上远程仓库交互时,我们需要自己仓库中变更推送给对象,那么需要在本地创建对象分支的镜像快照【也就是本次仓库远程分支镜像】,我们会将对方的数据拉取到这个远程仓库镜像中。之后在查看远程仓库镜像对方的改变。合并到自己本地分支后。将整合的变更推送给远程分支。
远程仓库镜像物理上保存在.git\refs\remotes\origin(版本仓库别名)文件夹中,逻辑上远程仓库分支名称为origin(版本仓库别名)\远程分支名称
当我们在执行某些指令时,git会将三者建立联系
操作分支
创建本地分支
什么是创建分支
创建一个分支就创建一个指针指向指定的commit对象
命令
git branch 分支名称
创建一个分支,分支指向commit对象是当前分支指针(HEAD)指向的分支(master)历史库中最新提交的对象f30ab
git branch 分支名称 commitId
创建一个分支,指定某个commit对象ID
git branch 分支名称 远程仓库/分支名称
创建一个本地分支,分支指向本地仓库远程分支镜像指向commit对象
将本地分支和本地仓库远程分支镜像关联,同时也就和远程分支关联
git branch 新分支名称 已有的分支名称
创建一个分支,分支指向来源分支的commit对象
切换分支
什么是切换分支
切换分支的本质就是移动HEAD指针,指向要切换的分支对象。如果切换的分支和当前分支指向的commit对象不是同一个,需要覆盖工作区和暂存区中的数据
切换分支就是使 HEAD 就指向 testing 分支
切换到maint分支是使HEAD指向了maint分支,同时覆盖更新暂存区和工作区中数据为a47c3提交对象的数据
对切换分支后续操作
对切换的分支提交
切换到testing分支,HEAD指向切换到的testing分支,重新在testing分支上提交新的数据,testing分支指针会移动新的提交对象87ab2,HEAD分支会伴随着testing分支指向的移动而移动。
重新切换到原来master分支
切换分支到master,HEAD指针移动指向到master分支
对master分支提交
切换到master分支,HEAD指向切换到的testing分支,重新在master分支上提交新的数据,master分支指针会移动新的提交对象c2b94,HEAD分支会伴随着master分支指向的移动而移动。
命令
git checkout 分支名称
切换到指定分支(分支不存在则命令执行失败)
git checkout -b 分支名称
创建并切换到指定分支上(指定分支存在则命令执行失败)
git checkout -B 分支名称
创建并切换到指定分支上(指定分支存在则覆盖原始分支指向的commitID)
git checkout -t 远程仓库名称/分支名称
基于一个远程分支创建一个本地分支,将这两个分支关联,并切换到创建的本地分支上
git checkout -f 分支名称
强制切换到分支,强制切换将丢弃掉工作区和暂存区的变更
git checkout -
切换到上一次分支
切换分支的条件
切换分支前,必须处理工作区(未追踪的文件不用处理)和暂存区的变更才能切换成功。除非强制切换,强制切换将丢弃掉工作区和暂存区的变更
切换到匿名分支
什么是切换到匿名分支
切换匿名分支就是切换到一个分支的某一个commit对象,我们称作为切换匿名分支。
对匿名分支操作
对匿名提交操作可以正常进行,但是不会更新任何已命名的分支
一旦此后你切换到别的分支,比如说master,那么这个提交节点(可能)再也不会被引用到,然后就会被丢弃掉了
如果你想保存这个状态,可以用命令git checkout -b name来创建一个新的分支。
和分支回退 reset区别
git reset 不仅会将当期分支对象移动指向到提交对象,同时HEAD指向分支对象,让分支回退,而切换分支仅仅移动HEAD指向提交对象。
命令
git chekout master~3
git checkout commitID
git checkout 远程仓库名称/远程分支名称
切换到一个远程仓库镜像,本质是切换到远程分支镜像指向的commit对象
分支的重命名
git branch -m 分支名称 分支名称
分支的合并
分支合并方式
git merge 合并分支就是将不同分支指向的commit对象数据对象合并,移动被合并分支对象指针移动。
如果被合并的分支指向的commit对象【a47c3】是合并分支指向commit对象【4d489】的父节点则直接移动HEAD到合并分支的commit对象,并将合并分支指向的commit对象【4d489】数据覆盖暂存区和工作区数据。此种合并被称为fast-forward
如果被合并的分支指向的commit对象【ed489】和合并分支指向commit对象【33104】不存在父子关系,那么分支合并分支将让他们共同的父commit对象【b325c】,合并分支commit对象【33104】,被合并分支commit对象【ed489】数据合并,产生一个新的commit对象【f8bc5】,移动被合并分支指向新创建commit对象,并覆盖工作区和暂存区数据。
git rebase 衍合 衍合在当前分支上的提交在被合并分支上重演一次,提交历史是线性的。 本质上,这是线性化的自动的 cherry-pick
--onto 表示可以限制从哪个commit对象开始的变更开始在被合并分支重演
git cherry-pick commitId 复制"一个提交节点并在当前分支做一次完全一样的新提交
复制"一个提交节点并在当前分支做一次完全一样的新提交
解除冲突
1 合并冲突会在发送冲突的文件出现
<<<<<<< HEAD
3.22 01
=======
3.22 02
>>>>>>> dev
3.22 01
=======
3.22 02
>>>>>>> dev
2 编辑文件解决冲突
3 将提交的文件添加到暂存区
4 提交文件到历史库
命令
git merge 合并分支名称
使用分支来合并当前分支
git cherry-pick commitId
复制"一个提交节点并在当前分支做一次完全一样的新提交
git rebase master 被合并的分支名称
在当前分支上的提交在被合并分支上重演一次,提交历史是线性的。 本质上,这是线性化的自动的 cherry-pick
git merge/rebase/cherry-pick --abort
撤销当前merge,rebase,cherry-pick操作
git merge/rebase --skip
强制使用合并分支的内容
git merge origin/master
合并远程分支
git merge --no-commit 合并分支名称
合并分支不提交
删除本地仓库分支
git branch -d 分支名称
删除名本地分支
git branch -D 分支名称
强制删除本地分支
git branch -dr 远程仓库名称/远程分支镜像名称
删除本地仓库远程仓库镜像
删除远程仓库
git push origin -d 远程分支
删除远程仓库分支,同时会删除本地仓库远程仓库镜像
推送本地分支到远程仓库
子主题
查看分支
git branch
列出所有本地分支
git branch -r
列出所有远程分支镜像
git branch -a
列出所有本地分支和远程分支镜像
git branch -v -a
列出所有本地分支和远程分支镜像(含简单说明)
git branch --merged
列出合并的分支
git branch --no-merged
列出未合并的分支
git 远程仓库
概述
什么是远程仓库
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。每一个项目存在多个版本库,每一个版本库又可以存在多个分支。当我们需要和其他版本库进行交互时,我们需要在本地仓库创建一个远程仓库的镜像,我们可以使用命令去将远程仓库的变更同步到本地远程仓库的镜像中或者提交本地分支的变更到指定的远程仓库分支中。远程仓库镜像物理上保存在.git\refs\remotes\origin(版本仓库别名)文件夹中,逻辑上远程仓库分支名称为origin(版本仓库别名)\远程分支名称
操作命令
创建一个远程仓库
git remote add <shortname> <url>
运行 git remote add <shortname> <url> 添加一个新的远程 Git 仓库,<shortname> 表示远程仓库的别名,url表示远程仓库的路径
DEMO
查看远程仓库
查看远程仓库列表名称
git remote
git remote可以查看你已经配置的远程仓库服务器
DEMO
选项
选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
DEMO
显示远程仓库的信息
git remote show origin
从远程仓库中同步变更到本地远程仓库镜像
git fetch 概述
这个命令会访问远程仓库,从中拉取所有的数据更新同步到本地的远程仓库镜像。这里数据包含远程仓库所有分支的数据。同步执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
git fetch 命令详解
将远程仓库所有分支的最新数据全部取回到本地远程仓库分支镜像中
git fetch <远程仓库的别名>
将远程仓库指定分支的最新数据全部取回到本地远程仓库分支镜像中
git fetch <远程主机名> <分支名>
选项
--tags
仅仅只拉取将远程仓库中分支中tag数据同步到远程仓库分支镜像中
-p
如果远程仓库某个分支被删除,-p会同时删除本地远程仓库的分支数据,和分支tag数据
DEMO
远程仓库origin/master数据有更新,我们想要同步远程仓库分支origin/master到本地仓库。
1 我们需要使用git fetch origin命令同步远程仓库数据到本地仓库的镜像。
2 如果我们想查看远程仓库某个分支的变更。我们只能通过远程仓库的分支创建一个本地仓库分支,在切换到这个刚刚创建本地分支去查看变更信息(git无法直接切换到远程分支),当然我们也可以使用命令git fetch origin master:origin_master 该命令将步骤1-2一起执行了
3 比较本地master分支和origin_master不同
4 将origin_master分支合并到master
5 删除origin_master分支
从远程仓库中同步变更到本地远程仓库镜像,并合并本地仓库分支
git pull 概述
git pull 命令如下命令的集合命令
git fetch origin master:tmp
git diff tmp
git merge tmp
git branch -d tmp
子主题
git pull命令详解
DEMO
当出现如上命令表示本地分支未和本次仓库中远程分支做关联提示使用下面两种方式
git pull origin master
1 指定需要自动合并到本地分支的远程仓库分支
git branch --set-upstream-to=origin/master master
2 是用命令让本地仓库的本地分支和远程仓库的映像分支关联
git pull origin v1.0:master
指定远程origin/v1.0分支合并到指定的本地master分支
本地分支推送到远程仓库某个分支
git push origin master
origin 表示你要提交远程仓库的名称
master 表示远程仓库的分支
每次提交之前需要 git pull 后再提交
远程仓库的名称变更
git remote rename origin test
远程仓库的删除
git remote rm origin
远程仓库url变更
git remote set-url origin https://github.com/kekec/Test.git
克隆现有的仓库
命令
git clone https://github.com/libgit2/libgit2
这会在当前目录下创建一个名为 “libgit2” 的目录,从远程仓库拉取下所有数据放入此文件夹中,并创建git仓库
git clone https://github.com/libgit2/libgit2 mylibgit
这将执行与上一个命令相同的操作,不过在本地创建的仓库名字变为 mylibgit。
注意
Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
场景
如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,你想为某个开源项目贡献自己的一份力,这时就要用到 git clone 命令
git日志管理
git log
默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
git log -- README.md
查看README.md文件的本地版本库提交记录
git log 选项
提交日志过滤相关的选项
git log -2
-2 来仅显示最近两次提交
git log --since, --after
仅显示指定时间之后的提交。
git log --author
仅显示指定作者相关的提交。
git log --until, --before
仅显示指定时间之前的提交。
git log --grep
仅显示含指定关键字的提交
git log --committer
仅显示指定提交者相关的提交
-S
仅显示添加或移除了某个关键字的提交
DEMO
查看 Git 仓库中,2008 年 10 月期间,Junio Hamano 提交的但未合并的测试文件,可以用下面的查询命令
提交内容相关的选项
git log -p
用来显示每次提交的内容差异。
提交统计相关的选项
git log --stat
每次提交的简略的统计信息,--stat 选项在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结。
提交日志格式相关的选项
git log --pretty
这个选项可以指定使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用
git log --pretty=oneline
git log --pretty=format:"%h - %an, %ar : %s"
format,可以定制要显示的记录格式。 这样的输出对后期提取分析格外有用 — 因为你知道输出的格式不会随着 Git 的更新而发生改变
选项
git log --graph
显示 ASCII 图形表示的分支合并历史。
0 条评论
下一页