1-git

git安装部署

查看是否安装git

1-git

源码包安装:

tar -zvxf git-2.5.0.tar.gz
cd git-git-2.5.0
make prefix=/usr/local/git all
make prefix=/usr/local/git install

配置-初始化用户

配置git使用邮箱

git config配置用户

1-git

配置git使用用户

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

语法高亮

git config --global color.ui true

查看信息

git config --list

1-git

cat .gitconfig

1-git

git初始化

常用命令:

# 初始化仓库
git init

# 查看文件状态
git status

# 添加文件到暂存区
git add 文件名
git add .   # 添加所有文件

# 提交代码
git commit -m "提交说明"

# 查看提交历史
git log --oneline

# 撤销/回退(后面教)
git checkout -- 文件名
git reset --hard 提交ID

初始化工作目录

mkdir git_data
cd git_data

初始化仓库,把一个目录初始化为版本仓库(可以是空目录,也可以是自带内容的目录)

git init

1-git

git工作目录

隐藏文件介绍

1-git

git_data为git的工作目录

1-git
HEAD → 记录你现在在哪个分支。
config → 当前仓库的配置信息(远程地址等)。
hooks/ → 一些自动执行的脚本(可选)。
info/ → 本地忽略规则等小配置。
objects/ → 存所有的版本数据(真正的历史)。
refs/ → 存分支、标签的指针。

GIT 基础概念

Git概念汇总

概念名称描述
工作区(Workspace)就是在电脑里能看到的代码库目录,是我们搬砖的地方,新增、修改的文件会提交到暂存区
暂存区(stage 或 index)用于临时存放文件的修改,实际上上它只是一个文件(.git/index),保存待提交的文件列表信息。
版本库/仓库(Repository)Git的管理仓库,管理版本的数据库,记录文件/目录状态的地方,所有内容的修改记录(版本)都在这里。
服务端/远程仓库(origin 或 remote)服务端的版本库,专用的Git服务器,为多人共享提供服务,承担中心服务器的角色。本地版本库通过push指令把代码推送到服务端版本库。
本地仓库用户机器上直接使用的的的版本库
分支(Branch)分支是从主线分离出去的“副本”,可以独立操作而互不干扰,仓库初始化就有一个默认主分支master
(HEAD)HEAD类似一个“指针”,指向当前活动 分支 的 最新版本
提交(Commit)把暂存区的所有变更的内容提交到当前仓库的活动分支。
推送(Push)将本地仓库的版本推送到服务端(远程)仓库,与他人共享。
拉取(Pull)从服务端(远程)仓库获取更新到本地仓库,获取他人共享的更新。
获取(Fetch)从服务端(远程)仓库更新,作用同拉取(Pull),区别是不会自动合并。
冲突(Conflict)多人对同一文件的工作副本进行更改,并将这些更改合并到仓库时就会面临冲突,需要人工合并处理。
合并(Merge)对有冲突的文件进行合并操作,Git会自动合并变更内容,无法自动处理的冲突内容会提示人工处理。
标签(Tags)标签指的是某个分支某个特定时间点的状态,可以理解为提交记录的别名,常用来标记版本。
master(或main)仓库的“master”分支,默认的主分支,初始化仓库就有了。Github上创建的仓库默认名字为“main
origin/master表示远程仓库(origin)的“master”分支
origin/HEAD表示远程仓库(origin)的最新提交的位置,一般情况等于“origin/master

工作区、暂存区、版本库是Git最基本的概念,关系如下图:

1-git

Git基本流程

Git的工作流程核心就下面几个步骤,掌握了就可以开始写Bug了。

  • 准备仓库:创建或从服务端克隆一个仓库。
  • 搬砖:在工作目录中添加、修改代码。
  • 暂存(git add):将需要进行版本管理的文件放入暂存区域。
  • 提交(git commit):将暂存区域的文件提交到Git仓库。
  • 推送(git push):将本地仓库推送到远程仓库,同步版本库。
  • 获取更新(fetch/pull):从服务端更新到本地,获取他人推送的更新,与他人协作、共享。
1-git

Git的GUI工具

如果不想用命令行工具,完全可以安装一个Git的GUI工具,用的更简单、更舒服。不用记那么多命令了,极易上手,不过Git基础还是需要学习了解一下的。

Sourcetree:SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。

  • ✔️适用于 Windows 和 Mac 系统,内置中文版,自动识别语言。
  • ✔️免费、功能强大,使用简单。
  • ✔️功能丰富,基本操作和高级操作都设计得非常流畅,适合初学者上手,支持Git Flow。
  • 🚫无冲突对比工具,支持配置第三方组件。

https://www.sourcetreeapp.com

1-git

git 命令详解

git status:查看仓库状态

查看当前仓库状态

git status

1-git

touch a b c
git status

1-git

git add命令就是把要提交的所有修改放到暂存区(Stage)

"未被跟踪的文件a b c":因为尚未提交到暂存区,使用git add让其提交

git add [file]:将文件添加到暂存区

git add a:添加a到暂存区

1-git
1-git

git add *(.):添加当前所有文件到暂存区

1-git

git rm --cached [file]:将文件从暂存区撤回到工作区

git rm --cached c

1-git

撤回后想继续删除撤回的文件,可以使用rm -f 在工作区直接删除这个文件,如果想要直接将暂存区和工作区一同删除,可以使用git rm -f [file]

加入我们想要从缓存区和工作区都删除 b 文件

1-git

git commit -m "描述内容" :提交到本地仓库

git commit -m "add newfile a"

1-git

将暂存区的代码提交到本地仓库进行管理,并使用-m 赋予提示,生成一个SHA1 的 hash值,一般本地指令中可以只用前6位.完整的版本文件,以对象树的结构存在仓库下\.git\objects目录里,这也是Git效率高的秘诀之一。

多个提交就形成了一条时间线,每次提交完,会移动当前分支masterHEAD的“指针”位置。

1-git

我们继续关注下状态

1-git

自适暂存区的内容已经提交到本地仓库,所以没有了

git mv:修改已经提交到 暂存区/本地仓库 的文件名

假如我们突然想要修改已经提交到本地仓库的文件 a 的名称并重新提交到 缓存区/本地仓库:

假如没有 git mv 命令,默认git在工作目录直接使用mv修改需要先将文件撤出缓存区

mv a a.txt
git status

1-git

这里重点讲解下:

此时 你没有用 git mv 或 git add,只是物理上改了文件名。

Git 的判断逻辑
Git 通过 比较工作目录和暂存区(以及最后一次提交) 来判断变化:
1、原来 commit 中有文件 a
2、工作目录中 a 被删除 → Git 认为 a 被删除
3、工作目录中新出现了 a.txt → Git 认为这是一个 未跟踪的文件
因为 Git 没法自动判断你只是重命名了,它只看到“a 消失了,a.txt 新增了”。

Git 想让你做什么
Git 给出的提示就是两种操作选择:
1、暂存这次删除/新增,准备提交
    git add a.txt      # 把新文件 a.txt 放入暂存区
    git rm a           # 告诉 Git a 被删除,把删除操作放到暂存区,下一次提交会从仓库移除
    git commit -m "rename a to a.txt"
    ⬆️ 这其实是手动模拟了 git mv 的效果。

2、丢弃工作区改动(恢复文件到上次提交状态)
    git restore a      # 恢复 a
    git restore a.txt  # 删除 a.txt

按照我们的思路继续往下走

git rm --cached a # a 已经提交到暂存区,需要撤回
git status
git add a.txt # 重新将工作区修改过名称的文件提交到暂存区
git status
git commit -m "modified a a.txt"
git status

直接使用mv默认是将a从本地仓库的源文件删除,然后需要先将修改后的文件再次提交到缓存区,然后提交到本地仓库

使用git mv命令修改

git mv a a.txt

1-git

git mv 并不会去修改 已经提交到本地仓库的历史,它只是修改了 暂存区和工作目录,让下一次 git commit 时记录这次改动,才能修改本地仓库,所以修改完缓存区和工作目录,还需要重新提交到本地仓库

git commit -m "mv a a.txt"

从上面这个操作步骤中我们又新了解了三条命令:

  • git restore <file>:丢掉工作目录的修改,恢复到上次提交的状态。(类似于撤回)
  • git rm <file>:工作区删除文件并把删除操作放到暂存区,下一次提交会从仓库移除。
  • git rm --cached <file>:只从 Git 暂存区移除文件,保留本地文件,提交后 Git 不再跟踪它。

git diff 文件比对

默认比对工作目录和暂存区有什么不同

1-git

因为本地工作目录中的a.txt和暂存区中的a.txt不一样,所以会显示出区别

1-git

提交:git add a.txt之后,此时工作区和暂存区内容一样,git diff则不会显示有区别

git diff --cached 比对暂存区域和本地仓库

工作目录提交到缓存区之后,缓存区会与本地仓库内容不一致

1-git

将暂存区的内容添加到本地仓库,这时所有区域都统一了

1-git

git commit -am 直接从工作空间提交到本地仓库

git commit -am:如果某个文件已经被仓库管理,如果修改工作区文件后再次更改此文件,直接需要一条命令提交即可

此时a.txt已经被仓库管理起来了

git commit -am "说明"

1-git

git log:git commit相当于虚拟机的镜像,任何操作被做了一次快照,可恢复到任意一个位置,如果想要查看历史的git commit快照操作,使用git log

1-git

git log --oneline:单行显示详细信息

1-git

git log --oneline --decorate

使用HEAD指针显示当前的位置

1-git

git log -p

同时显示每一次commit修改的内容变化

1-git

git log -n

只显示最近n条内容

1-git

历史数据的恢复:git reset --hard 前七位hash字母

回滚数据到某一个提交位置

1-git

此时使用git log回到现在已经无法找到最后的状态值,如果需要找到所有的操作hash值,需要使用git reflog全部显示

回滚到历史后查看回到未来的方式

git reflog

1-git

git reset --hard 前七位hash字母 回滚回去即可

git分支及代码合并

1-git

一般实际项目开发中,我们要尽量保证分支是非常稳定的,仅用于发布新版本,平时不要随便直接修改里面的数据文件,而工作的时候可以创建不同的工作分支,等到工作完成后再合并到master分支上面,所以团队分支看起来会如图

常见命令

git branch:查看分支

1-git

git branch testing 创建一个测试分支

1-git

git checkout -b testing 创建并切换到testing分支(相当于 git branch xxx && git checkout xxx)

1-git

git checkout testing 切换到测试分支

1-git

git branch -d testing 删除testing分支

如果此时处于testing分支需要先切换到master分支,否则会报错:无法强制更新被工作区xxx所使用的分支 'testing'

 

1-git

实验:代码合并

流程图

1-git

初始化

mkdir data
cd data/
git init

模拟三次修改加入

touch aaa bbb ccc
git add aaa
git commit -m "add aaa"
git add bbb
git commit -m "add bbb"
git add ccc
git commit -m "add ccc"

查看指针位置

git log --oneline --decorate

1-git

此时加入testing分支进行操作

git branch testing

git checkout testing

1-git

git branch

1-git

查看现在所在的位置

1-git

指针指向了master最后一次提交

在test中继续创建文件(模拟分支中的修改代码),并提交到仓库

touch test.ddd

git add test.ddd

git commit -m "add newfile test.ddd to testing"

git log --oneline --decorate

1-git

此时HEAD指针指向testing库中的添加test.ddd到testing本地仓库中

此时返回到主干查看本地仓库中的内容

git checkout master && ll

1-git

并没有新建的test.ddd,说明分支创建的文件不会影响到主干

git log --oneline --decorate

1-git

此时分支在master上面,记录的最后一次指针位置是master最后的一次提交位置

在master分支中创建master.eee

touch master.eee

git add master.eee

git commit -m "add newfile master.eee to master"

git log --oneline --decorate

1-git

如果testing分支功能研发完毕,需要与master分支进行合并:git merge testing

git merge testing

1-git

合并时可以选择填写信息

ls一下,发现此时成功将test.ddd合并到master分支

1-git

测试testing分支已经没有用了,需要删除这个分支重新创建

git branch -d testing

此时查看指针,显示合并时的位置,此时 testing 分支的历史操作记录也插入到了 master 分支中

1-git

实验:冲突合并

git init

初始化操作:

echo "# 初始化仓库" > README.md
git add README.md
git commit -m "Initial commit"

创建testing分支

git branch testing

现在进入testing分支,修改aaa文件,并提交到本地仓库

git checkout testing

echo "testing" > aaa

git add aaa

git commit -m "modified testing add aaa"

进入master进行合并

git checkout master

修改文件内容

echo "master" >aaa

master分支提交

git add aaa

git commit -m "modify aaa add master"

git merge testing

1-git

cat aaa

1-git

此文件出现冲突只能手动修改

删除想要留下的内容后重新提交

vim aaa

1-git

git commit -am "after merge testing"

git标签

命令:

  • git tag:查看有哪些标签
  • git tag -a 标签版本 -m "备注信息":打标签
  • git show:查看标签信息
  • git tag -d 版本号:删除标签

实验:

创建几个提交

echo "v1" > app.txt
git add app.txt
git commit -m "First commit"

echo "v2" > app.txt
git commit -am "Second commit"

echo "v3" > app.txt
git commit -am "Third commit"

git log --oneline

1-git

在第二个提交上打一个标签

假设我们想把 “Second commit” 标记成 v1.0 版本:

先找到它的提交 ID:c3ada16

打标签

git tag v1.0 c3ada16

查看标签列表

1-git

查看某个标签指向的内容

git show v1.0

1-git

切换到标签对应的版本(detached HEAD)

git checkout v1.0

会发现 app.txt 内容变成了 "v2"

此时你的分支状态是「detached HEAD」(游离状态),因为标签不是分支,不能直接提交。

1-git

如果你想基于这个版本继续开发:,可从标签新建分支

git checkout -b hotfix/v1.0

1-git

这样就会在标签指向的提交上,创建一个新的分支 hotfix/v1.0,方便你修补历史版本。

远程仓库:

推送标签到远程仓库
git push origin v1.0

或者推送所有标签:
git push origin --tags

发布者:LJH,转发请注明出处:https://www.ljh.cool/35822.html

Like (0)
LJH的头像LJH
Previous 2023年4月20日 上午1:48
Next 2023年4月20日 上午2:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注