Git详解
- 认识Git
- Git的组成
- 三个区域
- 二大类,四种状态
- Git add所做的操作
- Git commit所做的操作
- 分支(branch)
- 标签Tag
- Git checkout的作用
- 创建分支
- 切换分支
- 切换提交快照
- 撤销更改
- Git安装
- Linux版本
- yum源方式安装
- 编译方式安装
- Windows
- Git命令使用
- 比较文件异同
- 查看历史版本
- 版本回滚
- 远程仓库相关操作
- 分支相关操作
- git相关配置
- 标签
- Git快速上传数据到GitHub
认识Git
Git操作的终极结果:
让工作区中的文件都处于最初“未修改”的状态。
未修改(Unmodified)工作区中文件的内容和 Git仓库中文件的内容保持一致
版本库文件如果工作区文件一致时,文件状态描述是nothing to commit ,working tree clean
在Git中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。它具有以下特性:
- 断网后依旧可以在本地对项目进行版本管理
- 联网后,把本地修改的记录同步到云端服务器即可
获取git仓库的2种方式
- 将尚未进行版本控制的本地目录转换为Git仓库
1.在项目目录中,通过鼠标右键打开“Git Bash'
2.执行 git init 命令将当前的目录转化为Git仓库
- 从其它服务器克隆一个已存在的Git仓库(暂时不表述)
以上两种方式都能够在自己的电脑上得到一个可用的 Git仓库。
Git初始化
git init 命令在项目的根目录下创建.git
子目录来保存版本信息。
执行 git init 命令之后,会在项目文件夹中生成一个.git
文件夹,Git 管理项目的每一次记录,都在这个文件夹里面保存着。所以这个文件夹不能删除;对于一个项目来说,git init 只需要执行一次
没有初始化,就使用Git将会报如下错误
fatal: not a git repository (or any of the parent directories): .git
Git的组成
三个区域
- 工作区(Working tree)
- 暂存区(Staging area)
- 版本库 (Repository)
二大类,四种状态
未被git管理
- 未跟踪(Untracked)不被Git 所管理的文件 即该文件所在目录未被git init
已被git管理
- 已修改(Modified):工作区中的文件内容和Git仓库中的文件内容不一致
- 已暂存(Staged):工作区中被修改的文件已被放到暂存区,准备将修改后的文件保存到Git仓库中
- 未修改(Unmodified):工作区中文件的内容和 Git仓库中文件的内容保持一致
注意:
- 工作区的文件被修改了,但还没有放到暂存区,就是已修改状态。
- 如果文件已修改并放入暂存区,就属于已暂存状态。
- 如果Git仓库中保存着特定版本的文件,就属于已提交状态。
除工作区外,暂存区,版本库为空,此时状态为modified
使用git add
命令提交后,暂存区缓存文件,版本库为空 此时状态为已暂存(staged)
使用git commit
把暂存区的所有修改提交到版本库,并清空暂存区此时状态为(Unmodified)
Git add 跟踪新文件
文件前面状态为红色??的文件可以使用git add
进行跟踪,跟踪完成后该文件状态标记变为绿色A
语法
追踪单个文件
git add 文件名追踪所以文件
git add .
Git commit 提交更新
将暂存区中的文件提交到Git仓库中进行保存
语法
git commit -m "文件描述"
git commit -a -m "文件描述" # 跳过缓存区操作,直接把工作区内容提交到本地仓库
查看文件状态
git status
使用【git commit 】将文件提交到版本库,工作区和版本库一样,此时为未修改状态,可使用git status查看版本库状态
对已提交到版本库的文件进行修改,还未提交到暂存区的文件标志是红色M(Modified)(工作区和版本库有差异时为红M)
对已提交到版本库的文件进行修改,还未提交到版本库的文件标志是绿M(暂存区和版本库有差异时为绿M)
撤销工作区文件:git checkout
撤销对文件的修改指的是:把对工作区中对应文件的修改(清空工作区内容),还原成Git仓库中所保存的版本。相当于系统的回滚。
操作的结果:所有的修改会丢失,且无法恢复!危险性比较高,请慎重操作!
此处的操作为取出版本库的内容覆盖工作区内容。保持版本库和工作区内容一致。
Git add所做的操作
1.保存对象
将一个文件现有的内容压缩成二进制文件,并保存到Git中。该压缩文件叫做Git对象,保存在.git/objects目录中
# git hash-object -w filename
[root@git Myporject]# git hash-object -w test.txt
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
如上图所示,objects目录下又多出了一个子目录,而且这个子目录名是生成哈希值的前两个字符。在这个子目录下有一个文件,文件名是上述哈希值中其余的38个字符。
查看空文件内容
[root@git Myporject]# cat .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
xKˉOR0` °
[root@git Myporject]# git cat-file -p e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
上述代码输出的文件内容是一些二进制字符。你可能会问既然test.txt是空文件,又怎么会有这些内容呢?这是因为该二进制对象中还存储了一些元数据。
添加文件内容再次查看
[root@git Myporject]# echo 'hello world' > test.txt
[root@git Myporject]# git hash-object -w test.txt
3b18e512dba79e4c8300dd08aeb37f8e728b8dad[root@git Myporject]# git cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dad
hello world
2.更新索引
当文件保存成二进制对象以后,你需要告诉Git哪个文件发生了变化。
Git会在一个名叫“索引”(或阶段)的区域记录所有发生了变化的文件。然后等到所有的变更都结束后,将索引中的这些文件一起写入正式的版本历史记录中。
[root@git Myporject]# git update-index --add --cacheinfo 100644 3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt
通过git add验证,确实是相当于执行了上面两个步骤。
git add 指令执行后,在object目录中查看到原文件的git对象副本,并且查看副本内容,与原文件一致
Git commit所做的操作
Git 了变化的文件信息。等到修改完成,所有这些信息都会被写入版本的历史记录中,这相当于生成一个当前项目的快照。
项目的历史记录由不同时间点的项目快照组成。Git可以将项目恢复成任何一个快照。在Git中“快照”有一个专门的术语,即“提交”(commit)。所以生成快照也可以称之为完成提交。
下列所有“快照”的引用指的都是提交。
(1)首先,在你保存快照的时候,Git需要记录是谁执行的提交,因此需要设置用户名和邮件地址。
git config --global user.name "xxx"
git config --global user.email "xxx@xxx.com"
(2)接下来,保存现有的目录结构。
前面的保存对象指令只会保存一个文件,并不会记录文件之间的目录结构。
git write-tree命令可以根据当前目录结构生成一个Git对象。
[root@git Myporject]# git write-tree
e4960f7351e198cf6aa4be06059b14c8c77c382a
查看该Git对象的文件内容
所谓的快照就是保存当前的目录结构,以及每个文件相对应的二进制对象。
[root@git Myporject]# git cat-file -p e4960f7351e198cf6aa4be06059b14c8c77c382a
100644 blob 81c545efebe5f57d4cab2ba9ec294c4b0cadf672 a.txt
100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt
(3)最后,把这个目录结构和一些元数据一起写入版本的历史记录中
git commit-tree可以将目录树对象写入到版本的历史记录中
[root@git Myporject]# echo "first commit" | git commit-tree e4960f7351e198cf6aa4be06059b14c8c77c382a
8857ce62953c6f8f158a1c47675f1322ac449edd
在上述代码中,在提交时,需要提供提交的描述,而且你可以通过echo "first commit"
提供提交描述。git commit-tree命令会根据元数据以及目录树生成一个Git对象。
查看该Git对象的内容
[root@git Myporject]# git cat-file -p 8857ce62953c6f8f158a1c47675f1322ac449edd
tree e4960f7351e198cf6aa4be06059b14c8c77c382a
author zhangsan <zhangsan@123456.com> 1689175947 +0800
committer zhangsan <zhangsan@123456.com> 1689175947 +0800first commit
第一行输出是对应于该快照的目录树对象。
第二行和第三行是有关作者和提交者的信息。
最后一行内容是提交的描述。
查看某个快照(提交)的信息
[root@git Myporject]# git log --stat 8857ce62953c6f8f158a1c47675f1322ac449edd
commit 8857ce62953c6f8f158a1c47675f1322ac449edd
Author: zhangsan <zhangsan@123456.com>
Date: Wed Jul 12 23:32:27 2023 +0800first commita.txt | 1 +test.txt | 1 +2 files changed, 2 insertions(+)
git checkout命令,我们可以切换到某个快照。
git checkout c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
git show命令,我们可以显示某个快照的所有代码变更。
git show c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
Git commit验证
git commit -m [message]
git commit [file1] [file2] ... -m [message]
(1)创建数据并提交
[root@git csdn-picgo]# touch b.txt
[root@git csdn-picgo]# echo b > b.txt
[root@git csdn-picgo]# git add b.txt
[root@git csdn-picgo]# git commit -m "add b.txt"
(2)查看提交的版本及具体内容
1.先查看历史版本
[root@git csdn-picgo]# git log --stat
commit 4fa6d215164bb44456f5c6d53e9001de9cefd4b0 (HEAD -> pictures) # 版本记录的hash值(最新版本)
Author: yuansetiankong <xxxx@xx.com>
Date: Thu Jul 13 12:30:49 2023 +0800add b.txtb.txt | 1 +1 file changed, 1 insertion(+)commit 90a9ccbb54ee0c4e0bf759b59880899aca912511 (tag: csdn-v1, tag: csdn, csdn/pictures) # 版本记录的hash值(上一个版本)
Author: yuansetiankong <xxxxx@xx.com>
Date: Thu Jul 13 01:52:24 2023 +0800CSDN图床a.txt | 1 +test.txt | 1 +2 files changed, 2 insertions(+)...2.切换最新的快照(提交)
[root@git csdn-picgo]# git checkout 4fa6d215164bb44456f5c6d53e9001de9cefd4b0
Note: switching to '4fa6d215164bb44456f5c6d53e9001de9cefd4b0'.You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:git switch -c <new-branch-name>Or undo this operation with:git switch -Turn off this advice by setting config variable advice.detachedHead to false3.查看快照信息
[root@git csdn-picgo]# git show 4fa6d215164bb44456f5c6d53e9001de9cefd4b0
commit 4fa6d215164bb44456f5c6d53e9001de9cefd4b0 (HEAD, pictures)
Author: yuansetiankong <xxxx@xx.com>
Date: Thu Jul 13 12:30:49 2023 +0800add b.txtdiff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..6178079
--- /dev/null
+++ b/b.txt
@@ -0,0 +1 @@
+b
分支(branch)
分支是快照的指针,分支的名字就是该指针的名字。虽然哈希值不可读,但是分支允许用户给快照起别名。另外,分支还会自动更新,如果当前分支是一个新的快照,那么这个指针会自动指向它。例如,主分支(master branch)有一个名为master的指针指向主分支当前的快照。
用户可以为任何快照创建新指针。例如,如果你想创建一个新的fix-typo分支,那么只需创建一个名为fix-typo的指针,并指向一个快照。因此,在Git中创建一个新分支非常容易,而且开销非常低。
Git有一个特殊的指针HEAD,它始终指向当前分支中最新的那个快照。另外,Git还提供了快捷方式。例如,HEAD^
指向HEAD之前的快照(父节点),而HEAD~6
指向HEAD之前的第六个快照。
每个分支的指针都是一个文本文件,存储在.git/refs/heads/目录中。文件的内容是它指向的快照的二进制文件名(哈希值)。
标签Tag
什么是Git标签?
Git标签是代码库的一个里程碑,通常用于标记代码库的特定版本或发布版本。
它可以是一个版本号、一个预发布版本或是其他重要的代码点。
在Git中,标签分为轻量标签和带注释的标签。
轻量标签只是一个指向提交对象的引用,不包含任何元数据。
带注释的标签则是一个独立的对象,包含了标签的名称、日期、标签描述等信息,以及指向提交对象的引用
为什么需要Git标签?
- 标记重要版本:通过为重要的版本打上标签,可以方便地回溯到该版本,进行问题排查和修复。
- 标记发布版本:对于需要发布的版本,打上标签可以方便地追踪和回溯发布记录。
- 管理依赖:当你的代码依赖于其他人的代码时,打上标签可以方便地管理依赖关系,确保你的代码能够正常运行。
- 分支管理:通过打标签,可以方便地将分支合并到主分支时进行校验,确保没有未解决的冲突。
Git checkout的作用
git checkout 命令用于创建、切换分支或恢复工作树文件。
创建分支
基于本地库
效果是:创建分支,并切换到该分支
git checkout -b <branch>单纯的创建分支:
git branch <branch>
基于远程库
git checkout -b <new-branch> origin/<old-branch>
示例:以远程库中的 liang 分支为起点,在本地创建一个 dev 分支
git checkout -b dev origin/liang
基于指定标签创建分支
1.切换到标签对应的提交记录
git checkout <tagname>2.创建并切换到新分支
git checkout -b <branch>
基于指定 commit id 创建分支
1.切换到指定提交记录
git checkout <commit id>2.创建并切换到新分支
git checkout -b <branch>
切换分支
使用 checkout 切换分支时,先从本地库查找分支,在本地库没找到时,就去远程库中查找,在远程库也没有找到就会报错
git checkout <branch>
重置分支
删除已存在的分支且重新创建,分支不存在也不会报错
git checkout -B <branch>
切换分支后的提示信息
当我们切换到 master 分支后,出现这个提示说明: 本地分支和上游分支的最新提交记录是同一个
# 您的分支 “origin/master” 是最新的
Your branch is up to date with 'origin/master'.
将一个远程仓库中的分支 liang 签出到本地时的提示
# 本地库中的分支 liang 的上游分支是远程仓库中的分支 liang
Branch 'liang' set up to track remote branch 'liang' from 'origin'.
# 切换到了一个新的分支 liang
Switched to a new branch 'liang'
当本地库有了新的提交记录
# 本地分支比远程分支多了一次提交记录
# 可以使用 git push 将本地的提交记录推送到远程库
Your branch is ahead of 'origin/liang' by 1 commit.
(use "git push" to publish your local commits)
切换提交快照
git checkout命令,我们可以切换到某个快照。
git checkout c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
git show命令,我们可以显示某个快照的所有代码变更。
git show c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
撤销更改
用于让工作区中的文件回到最近一次 git add
或 git commit
的状态
# 让工作区中的某些文件撤销更改
git checkout -- <file1> <file2># 让工作区中的所有文件撤销更改
git checkout -- .
场景一、本地库中已有 某个文件,在工作区修改了该文件,但是没有提交到暂存区,此时撤销更改是从版本库中恢复内容
场景二、本地库中已有 某个文件,在工作区修改了该文件,并且已提交到暂存区,此时撤销更改是从暂存区中恢复内容
Git安装
Linux版本
Centos系列安装
yum源方式安装
安装旧版本
CentOS 7 光盘里软件包默认包含git 的安装包
[root@git ~]# sudo yum install git
查看版本
[root@git ~]# git --version
git version 1.8.3.1
yum源方式安装新版本
另外的yum源参考:centos7.x yum源安装git2.x版本
# 纯下载rpm包需要解决依赖问题,而且还是循环依赖,还是配置软件仓库方便
1.配置yum源
# cat <<-EOF:那么分界符(EOF)所在行的开头部分的制表符(Tab)都将被去除。这可以解决由于脚本中的自然缩进产生的制表符
# <<- 必须连写;'EOF'必须带单引号
[root@git ~]# cat > /etc/yum.repos.d/wandisco-git.repo <<- 'EOF'
[wandisco-git]
name=Wandisco GIT Repository
baseurl=http://opensource.wandisco.com/centos/7/git/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
EOF2.安装
[root@git ~]# yum install git3.验证版本
[root@git ~]# git --version
git version 2.39.1
编译方式安装
在Linux服务器上,如果git版本过低,使用的时候可能会由于低版本不支持遇到各种问题,比如Centos 7自带的 git版本一般是1.8.3.1的,比较旧,通常建议升级git后再使用。
1.安装依赖包
[root@git ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc -y
2.安装编译器
[root@git ~]# yum install gcc perl-ExtUtils-MakeMaker -y
3.下载git源码
[root@git data]# wget https://github.com/git/git/archive/refs/tags/v2.41.0.tar.gz
[root@git data]# ll -h
total 11M
-rw-r--r-- 1 root root 11M Jul 12 16:16 v2.41.0.tar.gz
git下载源码
官网:https://git-scm.com/
GitHub地址:https://github.com/git/git
4.安装git
[root@git data]# tar zxvf v2.41.0.tar.gz
[root@git data]# cd git-2.41.0/
[root@git git-2.41.0]# make prefix=/usr/local/git all
[root@git git-2.41.0]# make prefix=/usr/local/git install
5.创建软连接
[root@git git-2.41.0]# rm -f /usr/bin/git # 删除已经存在的旧链接
[root@git git-2.41.0]# ln -s /usr/local/git/bin/git /usr/bin/git
6.验证安装完成
[root@git git-2.41.0]# git --version
git version 2.41.0
Windows
直接在官网下载
直接下一步即可
检查版本:打开Git Bash
Git命令使用
比较文件异同
工作区与暂存区的差异
什么参数都不加的使用情況,比对的是「工作目录」与「索引」之间的差异。这是个很常用的指令,因为当你执行 git add . 指令之前,先通过 git diff 查看你自己到底改了哪些东西。
git diff
查看已经add 没有commit 的改动
git diff --cached
查看任意两个版本之间的改动:
git diff 版本号1 版本号2
比较两个版本号的src 文件夹的差异
git diff 版本号1 版本号2 src
工作区与某分支的差异
远程分支这样写:remotes/origin/分支名
git diff 分支名
工作区与HEAD指针指向的内容差异
git diff HEAD
- git diff 提交id 文件路径 工作区某文件当前版本与历史版本的差异
- git diff -stage 工作区文件与上次提交的差异(1.6 版本前用 -cached)
- git diff 版本TAG 查看从某个版本后都改动内容
- git diff 分支A 分支B 比较从分支A和分支B的差异(也支持比较两个TAG)
- git diff 分支A…分支B 比较两分支在分开后各自的改动
查看历史版本
查看所有commit记录(SHA-A校验和,作者名称,邮箱,提交时间,提交说明)
git log
查看最近多少次的提交记录
git log -p -次数
简略显示每次提交的内容更改
git log --stat
仅显示已修改的文件清单
git log --name-only
显示新增,修改,删除的文件清单
git log --name-status
让提交记录以精简的一行输出
git log --oneline
图形展示分支的合并历史
git log --oneline --graph --all
查询作者的提交记录(和grep同时使用要加一个-all-match参数)
git log --author=作者
列出提交信息中包含过滤信息的提交记录
git log --grep=过滤信息
和 -grep类似,S和查询内容间没有空格
git log -S查询内容
查看某文件的修改记录
git log fileName
版本回滚
当前版本: HEAD (指向master的一个指针叫HEAD)
上一个版本: HEAD^
上上个版本:HEAD^^
第100个版本:HEAD~100
切换上一个版本
git reset --hard HEAD^
切换到指定版本
git reset --hard db896 # commit id的前几位就可以
如果切换到旧版本,忘记了最新版本的commit id,使用命令:
git reflog
远程仓库相关操作
从远程仓库下载项目到本地
git clone git@github.com:<your_githubname>/<repository>.git
将远程仓库映射为映射为本地仓库的别名
git remote add <remoteaddress_aliasname> git@github.com:帐号名/仓库名.git
删除远程仓库的别名
git remote rm name
修改远程仓库的别名
git remote rename <old_name> <new_name>
查看远程库映射信息:
git remote显示所有远程仓库
git remote -v
显示某个远程仓库的信息
git remote show <remoteaddress_aliasname>
示例:
[root@git csdn-picgo]# git remote show csdn
* remote csdnFetch URL: git@github.com:yuansetiankong/csdn-picgo.gitPush URL: git@github.com:yuansetiankong/csdn-picgo.gitHEAD branch: mainRemote branches:main trackedpictures trackedLocal branch configured for 'git pull':pictures merges with remote picturesLocal ref configured for 'git push':pictures pushes to pictures (up to date)
上传数据到远程仓库
git push <remoteaddress_aliasname> <local_branchname>:<reomote_branchname>如果当前所在分支和远端分支相同,可省略的写为:
git push <remoteaddress_aliasname> <local_branchname>
拉取远程分支到本地仓库:
git checkout -b 本地分支 远程分支 # 会在本地新建分支,并自动切换到该分支
git fetch origin 远程分支:本地分支 # 会在本地新建分支,但不会自动切换,还需checkout
git branch -set-upstream 本地分支 远程分支 # 建立本地分支与远程分支的链接
同步远程仓库更新
git fetch origin master
分支相关操作
查看分支:
git branch
创建并切换分支
git checkout -b dev # -b表示创建并切换分支上面一条命令相当于一面的二条:
git branch dev # 创建分支
git checkout dev # 切换分支
合并分支
分支文件中存储的是当前分支的最新一次提交的commitID,也就是版本号,而每一个版本号对应的 objects 文件中都存储着 parent 版本号(首次提交没有 parent),以此将版本串起来,每一个分支都有自己的串。
比如将分支A合并到分支B,其实就意味着使分支B和分支A的内容完全一致,那么要达到这个目的最快的方式就是将分支A中的最新的commitID复制到分支B的文件中,这样分支B也就拥有了分支A的串,就达到了合并的效果。
如果在合并的时候出现了冲突,需要手动编辑解决冲突,然后提交一个commit,但是分支A上还是之前的内容。
参考:git深入理解(九):git分支管理与应用
git merge dev # 用于合并指定分支到当前分支
git merge -no-ff -m "merge with no-ff" dev # 加上-no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
删除分支
git branch -d dev
查看分支合并图
git log --graph --pretty=oneline --abbrev-commit
git相关配置
安装完Git后第一件要做的事,设置用户信息(global可换成local在单独项目生效):git config -global user.name "用户名" # 设置用户名
git config -global user.email "用户邮箱" # 设置邮箱git config -global user.name # 查看用户名是否配置成功
git config -global user.email # 查看邮箱是否配置
其他配置
git config -global -list # 查看全局设置相关参数列表
git config -local -list # 查看本地设置相关参数列表
git config -system -list # 查看系统配置参数列表
git config -list # 查看所有Git的配置(全局+本地+系统)
git config -global color.ui true # 显示git相关颜色
标签
打标签(默认为HEAD)
git tag <tag_name>创建一个带有附注的标签,其中包含更详细的信息,如作者、日期和注释:
git tag -a <tag_name> -m "标签注释"
给某个commit版本添加标签
git tag <tag_name> <version_number>
显示所有标签
git tag
git tga -l
显示某个标签的详细信息
git show 标签
推送标签到远程仓库
git push origin <tag_name>
git初始化
[root@git data]# mkdir Myporject
[root@git data]# cd Myporject/
[root@git Myporject]# git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /data/Myporject/.git/[root@git Myporject]# tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── push-to-checkout.sample
│ ├── sendemail-validate.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs├── heads└── tags9 directories, 18 files
更新分支
下面我们将演示如何更新分支。首先,修改test.txt。
$ echo "hello world again" > test.txt
然后保存二进制对象。
$ git hash-object -w test.txtc90c5155ccd6661aed956510f5bd57828eec9ddb
接下来,将该对象写入索引,并保存目录结构。
$ git update-index test.txt
$ git write-tree1552fd52bc14497c11313aa91547255c95728f37
最后,提交目录结构,并生成一个快照。
$ echo "second commit" | git commit-tree 1552fd52bc14497c11313aa91547255c95728f37 -p c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa785f188674ef3c6ddc5b516307884e1d551f53ca
在上述代码中,我们可以通过git commit-tree命令的参数-p来指定父节点,即以哪个快照为基础。
下面我们把快照的哈希值写入到.git/refs/heads/master文件中,并让master指针指向该快照。
$ echo 785f188674ef3c6ddc5b516307884e1d551f53ca > .git/refs/heads/master
现在,通过git log命令你可以看到两个快照了。
$ git logcommit 785f188674ef3c6ddc5b516307884e1d551f53ca (HEAD -> master)
Author: jam
Date: Sun Oct 7 13:38:00 2018 +0800second commitcommit c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
Author: jam
Date: Sun Oct 7 13:12:14 2018 +0800first commit
git log命令的运行过程大致如下:
- 找到HEAD指针对应的分支。在上述示例中为master。
- 找到master指针指向的快照。在上述示例中为785f188674ef3c6ddc5b516307884e1d551f53ca。
- 找到父节点(即前一个快照)c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa。
- 等等,最后显示当前分支中所有的快照。
另外,上述我们曾提到分支指针是动态的,下述三个命令会自动覆盖分支指针。
- Git commit:当前分支的指针将移动到新创建的快照上。
- Git pull:在当前分支和远程分支合并后,指针会指向新创建的快照。
- Git reset [commit_sha]:当前分支的指针将被复位到某个指定的快照上。
拉取远程库的数据,代码
拉取GitHub远程代码,无需先与远程建立建立
语法
git clone -b <branch> <url> # -b 远程分支名称
示例:获取GitHub的项目中pictures分支的数据
[root@git Myporject]# git clone -b pictures https://github.com/yuansetiankong/csdn-picgo.git
url为GitHub项目对应分支下的HTTPS路径
检验github中文件与拉取的内容一致
Git的实际使用过程中,如果每次提交给远程仓库都使用链接的话,那会显得很长,且当有多个仓库在管理时,就会显得很麻烦。所以Git提供了一个给远程仓库重新起个简单的名字的操作,也叫做创建远程仓库,其实就是将本地的某个名字与远程的某个仓库对应起来。
语法
git remote add <New_Name> <Remote_Url>
查看现有远程
git remote -v
修改名称
git remote rename <Old_Name> <New_Name>
修改名称对应的链接
git remote set-url <Name> <New_Url>
删除本地的远程连接映射
git remote rm <Name>
示例:
[root@git Myporject]# git remote add csdn https://github.com/yuansetiankong/csdn-picgo.git
上传代码到远程仓库
语法
git push <远程主机名> <本地分支名>:<远程分支名>
git push csdn pictures:pictures
切换远程库的分支
[root@git csdn-picgo]# git checkout main
Switched to branch 'main'
Your branch is up to date with 'csdn/main'.[root@git csdn-picgo]# ll
total 4
-rw-r--r-- 1 root root 12 Jul 13 00:40 README.md[root@git csdn-picgo]# git checkout pictures
Switched to branch 'pictures'
Your branch is ahead of 'csdn/pictures' by 1 commit.(use "git push" to publish your local commits)
[root@git csdn-picgo]# ll
total 12
-rw-r--r-- 1 root root 5 Jul 13 01:14 a.txt
drwxr-xr-x 2 root root 131 Jul 13 01:14 csdn
-rw-r--r-- 1 root root 12 Jul 13 00:40 README.md
-rw-r--r-- 1 root root 12 Jul 13 01:14 test.txt
用户信息配置
config 配置有system级别、global(用户级别)、和local(当前仓库)三个级别
查看git的配置列表
[root@git csdn-picgo]# git config --list
–global 表示全局的,即当前用户都有效,该配置会出现在 ~/.gitconfig 文件中,~表示当前用户的家目录
局部是只对当前仓库起效的,它的配置信息会在当前仓库根目录/.git/config文件下
Git快速上传数据到GitHub
使用 SSH 协议:SSH 协议比 HTTPS 协议更快,而且不需要输入账号密码,可以提高 push 速度。
1.生成SSH Key
[root@git csdn-picgo]# ssh-keygen -t rsa -C "your_email@youremail.com" # your_email@youremail.com是在github上注册的那个邮箱
直接点回车,说明会在默认文件id_rsa上生成ssh key。
然后系统要求输入密码,直接按回车表示不设密码
重复密码时也是直接回车,之后提示你shh key已经生成成功[root@git csdn-picgo]# ll /root/.ssh/
total 12
-rw------- 1 root root 1675 Jul 13 01:26 id_rsa
-rw-r--r-- 1 root root 399 Jul 13 01:26 id_rsa.pub打开id_rsa.pub,复制里面的key。里面的key是一对看不懂的字符数字组合,不用管它,直接复制
GitHub设置
右上角点击头像,进入Account Settings
2.设置用户邮箱
git config --global user.name xxxx
git config --global user.email xx@xxx.com
3.下载上传代码
[root@git Myporject]# git clone -b pictures git@github.com:yuansetiankong/csdn-picgo.git1.添加新文件到clone的项目里
[root@git Myporject]# cp a.txt csdn-picgo/
[root@git Myporject]# cp test.txt csdn-picgo/
[root@git Myporject]# cd csdn-picgo/[root@git csdn-picgo]# ll
total 12
-rw-r--r-- 1 root root 5 Jul 13 01:51 a.txt
drwxr-xr-x 2 root root 131 Jul 13 01:51 csdn
-rw-r--r-- 1 root root 12 Jul 13 01:51 README.md
-rw-r--r-- 1 root root 12 Jul 13 01:51 test.txt2.提交到本地仓库
[root@git csdn-picgo]# git add .
[root@git csdn-picgo]# git commit -m "CSDN图床"
[pictures 90a9ccb] CSDN图床2 files changed, 2 insertions(+)create mode 100644 a.txtcreate mode 100644 test.txt[root@git csdn-picgo]# git remote -v
origin git@github.com:yuansetiankong/csdn-picgo.git (fetch)
origin git@github.com:yuansetiankong/csdn-picgo.git (push)
[root@git csdn-picgo]# git remote rename origin csdn
Renaming remote references: 100% (4/4), done.3.上传到远程仓库
[root@git csdn-picgo]# git push csdn pictures:pictures
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 373 bytes | 373.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:yuansetiankong/csdn-picgo.gitd968abc..90a9ccb pictures -> pictures
Github验证
使用https时,总是链接不上,报TCP 链接错误,或者输用户名密码,显示权限不允许
参考:
git初始化和基础概
git checkout 命令详解
git常用命令
20 分钟教你搞懂 Git!
git远程仓库分支的各命令的具体解析(git remote add)
Git使用教程,最详细,最傻瓜,最浅显,真正手把手教