Git原理和命令

基本命令

git --version 查看版本
clear 清屏
git config --list 查看已有配置
git config --global user.name “xxx” 项目用户名配置
git config --global --unset user.name:删除配置信息
git cofig --global user.email xx@xx.com 当前项目邮箱配置
配置系统配置:–system,对整个系统都有效
配置用户配置:–global,仅对当前用户有效
配置当前项目配置:不加,只当当前项目有效
每一个级别的配置都会覆盖上层的相同配置

git ls-files -s查看暂存区

Linux通用命令

ll :将当前目录下的子文件&子目录平铺在控制台
echo ‘test content’ 往控制台输出信息
find 目录名: 将对应目录下的子孙文件&子孙目录平铺在控制台
find 目录名 -type f:将对应目录下的文件平铺在控制台
rm 文件名:删除文件
mv 源文件 重命名文件:重命名
cat 文件的url:查看对应文件的内容
vim 文件的url (英文模式下):按i进入插入模式,进入文件的编辑
按esc键&按:键,进行命令的执行
q! 强制退出(不保存)
wq 保存退出
set nu 设置行号

Git目录

初始化新仓库:git init,在需要管理的目录下执行会生成一个.git的隐藏文件
在这里插入图片描述

hooks: 目录包含客户端或服务端的钩子脚本(回调)
info :包含一个全局性排除文件
logs :保存日志信息
objects:目录存储所有数据内容
refs: 目录存储指向数据(分支)的提交对象的指针
config:文件包含项目特有的配置选项
description:用来显示对仓库的描述信息
HEAD:文件指示目前被检出的分支
index :文件保存暂存区信息

git对象:

git的核心部分是一个简单的键值对数据库。你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索该内容。
key是内容对应的hash,value是文件内容
git hash-object -w 文件路径:创建git对象,会出现一个hash值

树对象

树对象,他能解决文件名保存的问题,也允许我们将多个文件组织到一起。Git以一种类似UNIX文静系统的方式存储内容。所有内容均以树对象和Git对象的形式存储,其中树对象对应UNIX中的目录项,Git对象则大致对应文件内容。一个树对象包含了一条或多条记录。一个树对象也可以包含另外一个树对象。
查看树对象命令:git cat-file -p master^{tree}(或者是树对象的hash)
将git对象放入暂存区 git update-index --add --cacheinfo 100644\ 哈希值 文件名
文件模式 100644表明这是个普通文件
100755表示一个可执行文件
120000表示一个符号链接
-add选项:因为此前该文件并不在暂存区,首次需要-add
-cacheinfo选项:因为将要添加的文件位于git数据库中,而不是位于当前目录下,所以需要-cacheinfo
git write -tree将暂存区的git对象生成树对象放入git数据库中

git对象对应着文件的版本
树对象对应项目的版本

树对象代表了项目不同版本的快照。问题是:若想重用这些快照,必须记住所有的树对象的哈希值。并且你也完全不知道谁保存了这些快照,什么时刻保存的以及为什么保存。

提交对象就是保存这些基本信息

提交对象

我们可以通过调用commit-tree命令创建一个提交对象,为此需要指定一个树对象的hash值,以及该提交的父提交对象(如果有的话,第一次将暂存区做快照就没有父对象)
创建提交对象:
echo ‘first commint’ | git commit-tree d8329f

Git过滤文件

在项目的根目录下创建一个.gitignore文件,(通过命令行创建,在git命令下:touch .gitignore)
在这个文件书写要忽略的文件名称,也可以使用通配符
空白行作为空格
#: 将行标记为注释
*: 与 0 个或多个字符匹配
? :与 1 个字符匹配
[abc]: - 与 a、b 或 c 匹配
** : 与嵌套目录匹配,比如 a/**/z 与以下项匹配a/z,a/b/z,a/b/c/z
注意:Git 默认会忽略文件名的大小写,我们可使用命令 git config --get core.ignorecase 来查看我们的设置,当然我们也可以通过命令 git config core.ignorecase false 将其置为 false 。

如果要忽略文件强制推送到git数据库中,加-f
例如:git add -f xx.xx;

git操作命令

git add ./ 首先创建git对象放入数据库中,在写入暂存区中
git add -f ./:跳过过滤文件
git commit -m "开始提交” 将暂存区中git对象生成树对象放入数据库中,在生成提交对象
git commit 进入Vim编辑器下进行提交
git commit -a 跳过暂存区提交
git commit -a -m 注释 跳过暂存区以及Vim下直接提交
-a必须是被跟踪的才能用,没有的还是要先add

git rm 文件路径 将文件删除并添加到暂存区
git mv 原文件名 新文件名:将文件重命名并添加到暂存区
git rm -r --cached . :清除本地git库缓存,用于.gitignore文件不起作用时

文件分为未跟踪和已跟踪状态。已跟踪的文件是指本来纳入版本控制管理的文件,在上次快照中有他们的记录,工作一段时间后,它们的状态可能是已提交,已修改或者已暂存。、
检查当前文件状态:git status
git diff 查看哪些文件还没有暂存
git diff --staged 查看哪些修改以及被暂存了,还没提交
git log --oneline 查看历史提交记录
git log --oneline --decorate --graph --all :查看项目分叉历史,如果太长按q退出
git log --stat:查看当前提交对象的文件增删数量(修改一行记作增加一行)
git shortlog:查看每个提交是谁提交的

分支

分支本质上就是一个指针,指向提交对象
HEAD:指向当前的版本,默认指向master分支,切换分支其实就是让HEAD指向不同的分支,每次有新的提交时,HEAD都会带着当前指向的分支一起往前移动
git branch 分支名 :创建一个可以移动的新的指针。会在当前所在的提交对象上创建一个指针
git branch :得到当前所有分支
git branch -d 分支名:删除分支,如果这个分支有内容会不允许你删除
git branch -D 分支名:强制删除分支
git branch -v 分支名:查看每一个分支的最后一次提交
git branch 分支名 提交对象的Hash:新建一个分支并且使分支指向对应的提交对象
git checkout 分支名:切换分支
git checkout -b 分支名:创建分支并切换分支,
切换分支时,如果有跟踪的文件有修改没有提交,会切换失败。如果当前分支有未跟踪的文件,可以切换成功,但是切换后的分支也会看到这个未跟踪的东西,相当于会污染这个分支。所以切换分支前都要查看当前分支的状态(git status)

git config --global alias.别名 原命令:可以省略原命令太长,取一个短的命令,原命令要去掉
git,并且如果是多个单词的话,用“”包起来

git reflog :查看当前项目的HEAD所有变化
git merge 要合并的分支名:将要合并的分支合并到当前分支。

合并

快进合并。如果当前分支所指向的提交是要合并分支所指向的提交上游,git就会简单的将指针向前移动。也就是说,当你合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么git在合并两者的时候,只会简单的将指针向前移动,因为这种情况下的合并没有需要解决的分歧。
典型合并:当前分支指向的提交并不是要合并的分支指向的提交的直接祖先,也就是在之前很早的时候两个分支分叉了 。这个时候合并分支时,git不得不做一些额外的工作,git会使用两个分支的末端所指向的提交以及两个分支的公共祖先,做一个简单的三方合并。如果两个分支对同一个文件的同一个部分进行了不同的修改,git没法干净的合并它们。这时就会产生冲突,

git merge 合并的分支名 --allow-unrelated-histories:将两个没有关系的分支进行合并,一般用在多远程库中

变基:

git rebase 新基分支A:将当前分支变基到分支A上去
git rebase 新基 目标分支:将目标分支变基到新基上

先找到A分支和当前分支的最近公共祖先,然后对比当前分支相对于该祖先的历次提交,提取相应的修改保存为临时文件,然后以基底分支(A)的最后一个提交对象为新的出发点,逐个应用之前准备好的临时文件,最后会生成一个新的合并提交对象,从而改写当前分支的提交历史,使它成为A分支的直接下游。最后回到当前分支,执行一次快速合并。

.git/refs文件下存放的是分支文件,存放的是指向的提交对象的hash

GIt存储

在当前分支的更改还未完成时,需要切换到另外一分支做别的修改时。然而又不想让这个只做了一半的事而创建一次提交。这时就可以用到git存储。
git stash:将未完成的修改保存到一个栈上,而你可以在任何时候重新应用这些改动(git stash apply)
git stash list:查看存储
git stash apply stash@{2}:如果不指定一个储藏,,git默认指定最近的存储
git stash pop stash@{}:来应用储藏然后立刻从栈上扔掉它
git stash drop stash@{}:加上将要移除的储藏的名字来移除它

解决冲突的方式

可以通过git status查看冲突状态的文件。

通过Vim编辑器

通过Vim进入这个文件,搜索<<<<=====>>>>这样的符号,这个地方就是冲突的地方,删除这些符号即可,然后add在commit即可

放弃本地修改,使远程分支覆盖本地代码

git fetch --all :下载代码到本地
git reset --hard origin/分支名

采用远程

先确定好冲突的文件

通过git reset 远程分支名 冲突文件

保留本地

(1)
git reset 本地分支名 冲突文件

(2)也可以通过存储进行
1,通过git stash先暂存本地产生冲突的修改,
2,在通过git pull拉取远程分支,
3,在还原暂存的内容git stash pop stash@{0}
通过git stash list查看保存的信息
4,解决文件中的冲突部分

最后

解决冲突后,git add 来标记冲突已解决。

Git重置

注意:重置的文件必须是已跟踪的状态,如果是未跟踪的话,只能通过手动删除或者修改成已跟踪来进行重置了
git checkout --文件名字:将工作区的更改撤回,等于对这个文件删除更改,这个文件一定是已跟踪的,如果是未跟踪的话,无法撤回。
git reset HEAD 文件名字:将暂存区中的文件撤回跟踪,等于对这个文件重置保存更改
git revert :返做,将当前回退到某一版本,但HEAD指针位置不变
git commit --amend:将暂存区中的文件提交,如果自上次提交后马上执行了此命令,那么快照保持不变,所修改只是提交信息,相当于修改提交注释。
git reset -soft HEAD~:移动HEAD指向的上一次的提交并将分支指针一同移动过来,往上回撤(等同于git commit --amend),不会动暂存区也不会动工作目录,只是将HEAD和分支一同移动到提交对象上
git reset -soft 提交对象的哈希:将HEAD和当期分支指向指定的提交处
git reset [–mixed] HEAD~ :HEAD回到上一次提交,但会修改暂存区,不会修改工作目录,等同于重置保存更改,[]代表可要不可要,git reset HEAD~等于git reset --mixed HEAD~
git reset --hard HEAD~:HEAD和分支一同移动到指定提交对象处,不但会修改暂存区,也会修改工作目录。
因为暂存区和工作目录都会重置,所以运行前查看一下状态(git status)在进行重置,否则你的更改如果没有提交,那么全部会被丢弃掉。
如果有未跟踪的更改的时候进行重置,这个未跟踪的文件也会跟着过去。但是如果你先提交到暂存中在重置,那么这个文件在重置的时候会被删除掉。

Tag

git可以给历史中的某一个提交打上标签,以示重要。使用这个功能来标记发布节点(v1.0)

git tag:列出分支
git tag ‘v1*’:列出v1开头的所有tag
轻量标签:像一个不会移动的分支,只是一个特定提交的引用
git tag 名字:在当前提交创建tag
git tag 名字 提交哈希:在指定提交创建tag
git show 标签名字:查看标签
git tag -d 标签名:删除标签
git checkout 标签名:签出标签,分支不会过来,会产生头部分离的情况,这种情况下做不了提交,必须在此处新建一个分支才行

远程仓库

git remote add 仓库名 仓库地址(URL):添加一个新的远程Git仓库,同时指定一个简写
git remote -v:显示远程仓库使用的Git别名与其对应的URL
git remote show 远程的别名:查看远程仓库的信息
git remote rm 远程别名:删除远程库
git remote rename 原别名 现在别名:重命名
git push 远程的别名 分支名:将本地分支推送到远程,注意如果远程URL是https的话,需要检查Windows的凭据,如果是SSH的话,需要先生成SSH的公钥添加到远程上
git push:直接推动
git clone 远程仓库地址:克隆仓库
git fetch 远程的别名:访问远程仓库,从中拉取没有的数据。不会自动合并或修改你当前的工作。只会同步本地远程跟踪分支,不会修改本地分支。
本地远程跟踪分支是远程分支状态的引用。它们是你不能移动的本地分支。当你做任何网络通信操作时,它们会自动移动。
git pull:从远程获取代码并合并本地的版本。等同于git fetch和git merge 远程跟踪分支。只对本地分支和本地远程分支进行跟踪的有效。默认主分支和本地远程分支是跟踪的。
git pull 远程别名
git checkout --track 远程跟踪名:新建一个本地分支并跟踪远程分支
git checkout -b 本地分支名 远程跟踪分支名:创建一个本地分支并跟踪远程分支
git branch -u 远程分支名(origin/分支名):让本地当前分支跟踪本地远程分支,这样就可以pull了
git branch --set-upstream 本地分支名 远程分支名(origin/分支名):将本地分支跟踪远程分支
git branch -vv:查看跟踪
git push 远程别名 --delete 远程分支名:删除远程分支名
git remote prune 远程别名 --dry-run:列出仍在远程跟踪但是远程已被删除的无用分支
git remote prune 远程别名:清除上面命令列出的远程跟踪分支

pull request流程

如果你想要参与某个项目,但是没有推送权限,这时可以对这个项目进行“派生”(Fork)。GitHub将在你的空间创建一个完全属于你的项目副本,且你对其具有推送权限。通过这种方式,项目的管理者不再需要忙着把用户添加到贡献者列表并给予他们推送权限。人们可以派生这个项目,将推送到派生出的项目副本中,并通过创建合并请求(pull request)来让他们的改动进入源版本库。

Fork
在这里插入图片描述

发起pull request:在fork的项目必须要有新的提交
在这里插入图片描述
在这里插入图片描述

在源项目的作者在
在这里插入图片描述

可以看到,选择合并这个拉取请求
在这里插入图片描述

流程:
(1) 从master分支创建一个新分支(自己fork的项目)
(2) 提交一些修改来改进项目(自己fork的项目)
(3) 将这个分支推送到GitHub上(自己fork的项目)
(4) 创建一个合并请求
(5) 讨论,根据实际情况继续修改
(6) 项目的拥有者合并或关闭你的请求
注意:每次发起新的pull request时,都要拉取最新的源仓库的代码,而不是自己fork的那个仓库
git remote add 源仓库别名 源仓库URL:添加远程源仓库

SSH

ssh-keygen -t rsa -C “”:生成公私钥,按enter键,生成成功后默认在C:/Users/用户/.ssh下。可以将别人的公私钥添加到项目管理者下。配置读写权限,就可以直接拉取和推送。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值