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 --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global color.ui true

cat .gitconfig

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工作目录
隐藏文件介绍


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最基本的概念,关系如下图:

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

Git的GUI工具
如果不想用命令行工具,完全可以安装一个Git的GUI工具,用的更简单、更舒服。不用记那么多命令了,极易上手,不过Git基础还是需要学习了解一下的。
Sourcetree:SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。
- ✔️适用于 Windows 和 Mac 系统,内置中文版,自动识别语言。
- ✔️免费、功能强大,使用简单。
- ✔️功能丰富,基本操作和高级操作都设计得非常流畅,适合初学者上手,支持Git Flow。
- 🚫无冲突对比工具,支持配置第三方组件。

git 命令详解
git status:查看仓库状态


git add
命令就是把要提交的所有修改放到暂存区(Stage)
"未被跟踪的文件a b c":因为尚未提交到暂存区,使用git add让其提交



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

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

git commit -m "add newfile a"

将暂存区的代码提交到本地仓库进行管理,并使用-m 赋予提示,生成一个SHA1 的 hash值,一般本地指令中可以只用前6位.完整的版本文件,以对象树的结构存在仓库下\.git\objects
目录里,这也是Git效率高的秘诀之一。
多个提交就形成了一条时间线,每次提交完,会移动当前分支master
、HEAD
的“指针”位置。

我们继续关注下状态

假如我们突然想要修改已经提交到本地仓库的文件 a 的名称并重新提交到 缓存区/本地仓库:
假如没有 git mv 命令,默认git在工作目录直接使用mv修改需要先将文件撤出缓存区

这里重点讲解下:
此时 你没有用 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 commit
时记录这次改动,才能修改本地仓库,所以修改完缓存区和工作目录,还需要重新提交到本地仓库
- git restore <file>:丢掉工作目录的修改,恢复到上次提交的状态。(类似于撤回)
- git rm <file>:工作区删除文件并把删除操作放到暂存区,下一次提交会从仓库移除。
- git rm --cached <file>:只从 Git 暂存区移除文件,保留本地文件,提交后 Git 不再跟踪它。
git diff 文件比对

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

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


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

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



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


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

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

git reset --hard 前七位hash字母 回滚回去即可
git分支及代码合并

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


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


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

实验:代码合并

模拟三次修改加入
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"




在test中继续创建文件(模拟分支中的修改代码),并提交到仓库
git add test.ddd
git commit -m "add newfile test.ddd to testing"

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

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

此时分支在master上面,记录的最后一次指针位置是master最后的一次提交位置
git commit -m "add newfile master.eee to master"

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

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

测试testing分支已经没有用了,需要删除这个分支重新创建
此时查看指针,显示合并时的位置,此时 testing 分支的历史操作记录也插入到了 master 分支中

实验:冲突合并
git init
初始化操作:
echo "# 初始化仓库" > README.md
git add README.md
git commit -m "Initial commit"
现在进入testing分支,修改aaa文件,并提交到本地仓库
git add aaa
git commit -m "modified testing add aaa"
修改文件内容
master分支提交
git add aaa
git commit -m "modify aaa add master"


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

git commit -am "after merge testing"
git标签
创建几个提交
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

在第二个提交上打一个标签
假设我们想把 “Second commit” 标记成 v1.0
版本:
先找到它的提交 ID:c3ada16
打标签
git tag v1.0 c3ada16
查看标签列表

查看某个标签指向的内容
git show v1.0

切换到标签对应的版本(detached HEAD)
git checkout v1.0
会发现 app.txt
内容变成了 "v2"
此时你的分支状态是「detached HEAD」(游离状态),因为标签不是分支,不能直接提交。

如果你想基于这个版本继续开发:,可从标签新建分支
git checkout -b hotfix/v1.0

这样就会在标签指向的提交上,创建一个新的分支 hotfix/v1.0
,方便你修补历史版本。
远程仓库:
推送标签到远程仓库
git push origin v1.0
或者推送所有标签:
git push origin --tags
发布者:LJH,转发请注明出处:https://www.ljh.cool/35822.html