Git版本控制服务器
GitHub :https://github.com/
Gitee :https://gitee.com/
GitLab :https://gitlab.cn/
AtomGit :https://atomgit.com

1.Git简介
1.1 什么是Git
Git是一个免费的、分布式的版本控制工具,或是一个强调了速度快的源代码管理工具。每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,不依赖于网络和中心服务器。
1.2 关于版本控制
**什么是版本控制?**版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。在本文所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任何类型的文件进行版本控制。
我们用word写文档会遇到以下问题:
- 想删除一个段落,又怕将来想恢复找不回,然后把文件另存为,最后在windows下生成好多的文档。
- 过段时间想找回被删除的文字,已经不知道删除前保存在哪个文件。
- 想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删。
- 有些文档需要别人帮助填写,你传给同事以后,你又更新了文档,然后同事填完文件又传给了你,怎么去合并文档。
采用版本控制系统就可以解决上面遇到的所有问题。它可以统一进行版本控制,自动帮我们记录每次文件的改动,进行代码合并,不需要把文件传来传去,如果想查看某次改动,只需要在软件里瞄一眼就可以。
有了版本控制你就可以将某个文件回滚到之前的状态,**甚至将整个项目都回退到过去某个时间点的状态。**你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而导致出现怪异问题,又是谁在何时报告了某个功能缺陷等等。使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改,删的删,你也照样可以轻松恢复到原先的样子。但额外增加的工作量却微乎其微。
1.3 Git内文件的三种状态及三个工作区域
1.3.1 三种状态
对于任何一个文件,在 Git 内都只有三种状态:
- **已提交(committed)**表示该文件已经被安全地保存在本地数据库中了;
- **已修改(modified)**表示修改了某个文件,但还没有提交保存;
- **已暂存(staged)**表示把已修改的文件放在下次提交时要保存的清单中。
1.3.2 三个工作区域
由此我们看到Git管理项目时,文件流转的三个工作区域:
- **工作目录:**从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从 Git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。所以工作目录就是写代码的地方,如果有新增、修改、删除文件都是在工作目录发生变化。工作目录的文件可以通过
git add命令将文件提交到暂存区。 - **暂存区:**所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中的index文件(
.git/index)中。有时候我们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。暂存区就是用来临时存储代码的一片区域,是已经修改了但是还没有提交,将来可以提交到本地库也可以撤回来。通过git commit命令可以将暂存区的文件提交到本地仓库。 - **本地库:**每个项目都有一个 Git 目录(注:如果
git clone出来的话,就是其中.git的目录;如果git clone --bare的话,新建的目录本身就是 Git 目录。),它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。本地库就是存储的实实在在的历史版本,可以通过git push命令来将本地库的文件推送到服务器。
2.部署Git及Git使用
2.1 环境
bash
Git-Server 172.25.254.44
Git-Client 172.25.254.45
2.2 软件安装
yum命令安装:此方法简单,并且会自动安装依赖的包,而且会从源里安装最新的版本,不过不一定是git最新的- 源码安装,这个要比yum方式较麻烦点,不过过程还是比较清晰的,毕竟源码安装也比较普遍了。
bash
[root@Git-Server ~]# yum install -y git
[root@Git-Client ~]# yum install -y git
需要ssh的支持。某些版本服务器需要安装git-core才是服务器
查看git版本
bash
]# git --version
git version 2.39.3
2.3 git使用
bash# 在Git客户端设置当前操作系统用户的全局用户名和电子邮件地址。 ]# git config --global user.name "xxxx" ]# git config --global user.email "xxx@xxxx.com
2.3.1 服务端创建仓库
创建git账号
bash
[root@cong11 ~]# useradd git
[root@cong11 ~]# echo git:123456 | chpasswd
创建版本库(仓库)并初始化
bash
[root@Git-Server ~]# useradd git
[root@Git-Server ~]# echo 'git' | passwd --stdin git
[root@Git-Server ~]# su - git
[git@Git-Server project.git]$ git config --global user.name 'kaser'
[git@Git-Server project.git]$ git config --global user.email 'kaser@163.com'
[git@Git-Server ~]$ mkdir project.git
# 初始化仓库
[git@Git-Server ~]$ git init --bare project.git/
版本库又名仓库,可简单理解为一个目录,该目录里所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,在将来某个时刻可以"还原"。
2.3.2 客户端测试
git add,git status,git rm --cached <file>
bash
[root@Git-Client ~]# mkdir git
[root@Git-Client ~]# cd git/
# 从服务端拉取仓库
[root@Git-Client git]# git clone git@172.25.254.44:/home/git/project.git
[root@Git-Client project]# git config --global user.name "Saker"
[root@Git-Client project]# git config --global user.email "Saker@163.com
# 写入测试文件,并查看状态(提醒并未存储到暂存区)
[root@Git-Client project]# echo "No.1" > Version.html
[root@Git-Client project]# git status
# 存入,并再次查看状态(提醒成功)
[root@Git-Client project]# git add Version.html
[root@Git-Client project]# git status
# 可以删去暂存区的具体文件,并再次查看状态
[root@Git-Client project]# git rm --cached Version.html
rm 'Version.html'
[root@Git-Client project]# git status
# 再次存入,并查看状态
[root@Git-Client project]# git add Version.html
[root@Git-Client project]# git status

git commit提交至本地仓库,git log查看日志
bash
[root@Git-Client project]# git commit -m "Version 1"
[root@Git-Client project]# git log
2.3.3 查看远程仓库信息
git remote -v 查看本地存储的远程仓库信息
bash
[root@Git-Client project]# git remote -v
origin git@172.25.254.44:/home/git/project.git (fetch)
origin git@172.25.254.44:/home/git/project.git (push)
说明:origin表示的是远程仓库的别名(默认为origin,fetch更新类似于update,push推数据相当于commit),以后提交代码的时候只需要使用origin这个别名即可。
2.3.4 添加远程仓库(扩展)
法1
bash
]# git remote add 仓库名 git@仓库地址:/xxxxxxxxxx
# 举例
]# git remote add origin git@172.25.254.44:/home/git/project.git
法2(ssh协议)
bash
]# git remote add 仓库名 ssh://git@仓库地址/xxxxxxxx
# 举例
]# git remote add origin ssh://git@172.25.254.44/home/git/project.git
法3(http协议)
bash
]# git remote add 仓库名 http://git@仓库地址/xxxxxxxx
]# git remote add origin http://git@172.25.254.44/home/git/project.git
(必须保证本地仓库里面有提交(commit),注意是本地仓库而不是暂存区)
2.3.5 将本地仓库代码推送到远程仓库
bash
[root@Git-Client project]# git push origin master
上面就是一个标准的代码提交的过程,到此自己创建的文件就推到了远程的git仓库了。
2.3.6 git版本回退
git reset --hard <具体版本hash值>
bash
[root@Git-Client project]# cat Version.html
No.1
[root@Git-Client project]# echo "No.2" >> Version.html
[root@Git-Client project]# cat Version.html
No.1
No.2
[root@Git-Client project]# git commit -m "Version 2"
[root@Git-Client project]# git log
bash
[root@Git-Client project]# git log
commit 8789f8898667725b823dc4aedda7eb51100bba05 (HEAD -> master)
Version 2
commit 32f20d47638365bb85b052a654e128f608e1ec66 (origin/master)
Version 1
[root@Git-Client project]# git reset --hard 32f20d47638365bb85b052a654e128f608e1ec66
[root@Git-Client project]# cat Version.html
No.1
[root@Git-Client project]# git reset --hard 8789f8898667725b823dc4aedda7eb51100bba05
[root@Git-Client project]# cat Version.html
No.1
No.2
- 先进行本地的版本回退
git reset --hard commit_id git reset后,本地版本回退了,但无法直接 push 到远程仓库(因为远程仓库版本更加新)git push -f覆盖推送即可- 回退前,用
git log可以查看提交历史,以确定要回退的commit_id。 - 如果后悔回退了,用
git reflog查看命令历史,以便确定要回到的版本的commit_id。
2.3.7 删除本地仓库并克隆远程仓库
bash
[root@Git-Client project]# echo "No.3" >> Version.html
[root@Git-Client project]# git add Version.html
[root@Git-Client project]# git commit -m "Version 3" Version.html
[root@Git-Client project]# git log
[root@Git-Client project]# git push origin master
[root@Git-Client ~]# rm -rf git/project/
[root@Git-Client ~]# git clone git@172.25.254.44:/home/git/project.git
[root@Git-Client ~]# git clone git@172.25.254.44:/home/git/project.git
[root@Git-Client ~]# ls -la project/
total 8
drwxr-xr-x 3 root root 38 Apr 19 21:33 .
dr-xr-x---. 15 root root 4096 Apr 19 21:33 ..
drwxr-xr-x 8 root root 163 Apr 19 21:33 .git
-rw-r--r-- 1 root root 15 Apr 19 21:33 Version.html
[root@Git-Client ~]# cat project/Version.html
No.1
No.2
No.3
3.git使用扩展
这部分内容主要介绍一下Git的基本命令和操作,会从Git的版本库的初始化,基本操作和独有的常用命令三部分着手,让大家能够开始使用Git。
3.1 git初始化(git clone,git init+git remote add)
3.1.1 git clone
bash
# 示例如下:
]# mkdir -p xxxx # git仓库目录
]# git clone git@远程仓库地址:仓库路径 xxxx
[git@Git-Server ~]$ mkdir Test.git
[git@Git-Server ~]$ git init --bare Test.git/
[root@Git-Client ~]# mkdir /New_Base
[root@Git-Client ~]# git clone git@172.25.254.44:/home/git/Test.git /New_Base/
注:上面命令实际是基于ssh协议的,如果不想通过密码验证,可以使用密钥对方式,需要将自己的公钥传到服务器,这样就可以不输入密码直接git clone。
3.1.2 git init,git remote
bash
[root@Git-Client ~]# mkdir /Ceshi
# 初始化git,指定git仓库路径,同时也是工作目录。
[root@Git-Client ~]# git init /Ceshi
[root@Git-Client Ceshi]# git remote add xxx ssh://git@172.25.254.44:/home/git/aaa.git
[root@Git-Client Ceshi]# git remote -v
xxx ssh://git@172.25.254.44:/home/git/aaa.git (fetch)
xxx ssh://git@172.25.254.44:/home/git/aaa.git (push)
3.2 git基本命令
3.2.1 git pull与git clone定位与区别
git clone 与 git pull 是 Git 版本控制中两个核心但定位完全不同的指令,其差异主要体现在执行前提、底层机制、作用范围与配置依赖四个维度:
-
执行前提与上下文依赖
git clone <url>无需本地存在任何仓库环境。它可在任意空目录或系统路径下直接执行,Git 会自主创建目标文件夹并建立完整的版本控制上下文。git pull强依赖本地仓库上下文。执行时 Git 会递归向上查找.git元数据目录,若未找到则立即报错fatal: not a git repository。必须在已初始化的项目目录内运行。
-
底层执行机制
git clone是原子化的初始化+全量同步操作 。底层依次执行:创建目录 →git init生成.git结构 → 将远程仓库自动注册为origin→ 执行git fetch下载全部对象(commits、trees、blobs)及所有分支引用 → 创建本地跟踪分支并检出默认分支(如main)。git pull是增量更新操作 ,本质为git fetch与git merge的组合(若配置pull.rebase=true则为fetch+rebase)。它仅下载远程分支相对于本地已有历史的新增提交对象,随后将差异合并至当前已检出的工作分支,并更新工作区文件。
-
作用范围与数据量
clone针对整个远程仓库,一次性拉取全量历史、所有分支指针、标签及远程配置信息,数据量等于仓库完整体积。pull仅针对当前分支及其配置的upstream远程分支,仅同步自上次 fetch 之后的新增提交,数据量为增量大小。
-
配置状态与工作流定位
clone自动写入.git/config中的[remote "origin"]区块,并建立本地分支与远程分支的跟踪关系(tracking branch)。属于项目接入阶段的一次性指令。pull依赖预先存在的远程配置。若本地仓库未通过clone或remote add绑定过远程源,或当前分支未设置跟踪关系,则必须显式指定<remote>与<branch>参数,否则提示需配置上游分支。属于日常开发阶段的高频同步指令。
在标准的团队协作工作流中,两者严格分工:clone 负责"环境搭建与首次数据获取",pull 负责"持续集成与分支对齐"。混用或颠倒顺序将导致上下文缺失、重复下载或合并冲突。
你可以把
git clone理解为"第一次搬家入住并配齐所有家具 ",而git pull则是"住进去之后,每天收快递补充新到的物品"。
具体生活场景对照:
当你换了一台新电脑,或者刚接手一个别人写好的项目,本地连文件夹都没有时,必须用
git clone。它会自动帮你建好项目文件夹、生成记录本(.git)、贴好服务器地址标签,并把服务器上所有的历史版本、所有分支的代码一次性完整搬到你电脑里。这是一次性动作,做完后你就拥有了可以正常工作的本地环境。当你已经用
clone把项目拉下来了,并且每天都在本地写代码。某天同事向服务器提交了新功能或修复了 Bug,你想把这些更新同步到自己的电脑上,这时就该用git pull。它只会去服务器核对"从你上次同步之后,多了哪些新改动",然后自动把这些新内容合并到你正在干的活里。它不会重新下载整个项目,也不会新建文件夹。为什么不能混用或替代 :
如果你电脑里根本没有这个项目,直接敲
git pull,就像对着空房间喊"把新快递拿来",系统根本不知道快递该放哪个柜子、怎么记账,只能报错拒绝。反过来,如果你本地已经有项目了还反复用git clone,它会强行新建一个同名文件夹重新下载全套数据,导致硬盘里出现多份重复代码,不仅浪费空间,还会让你后续的版本记录彻底混乱,分不清该进哪个目录干活。实操建议 :
记住一个简单原则:"从无到有用 clone,从有到新用 pull" 。在你之前的实验中,报错正是因为删除了本地文件夹后跳过了"安家"步骤,直接尝试"收快递"。今后操作时,首次接触远程仓库永远使用
git clone 仓库地址,之后每次开工前进入该目录执行git pull,即可保持本地与服务器的平滑同步。
3.2.2 git pull拉取变更并应用(对齐并写入)
git pull=git fetch+git log+git diff+git merge
正确的实验路径应严格区分"首次获取"与"后续同步"两种场景:
- 首次获取远程仓库 :必须使用
git clone <url>。该命令会自动创建目标目录、执行git init、写入远程源配置(默认命名为origin)、获取所有分支对象,并检出默认分支。- 已存在本地仓库需更新 :需先进入包含
.git的目录,执行git pull。若远程地址未配置,可先用git remote add <name> <url>绑定,再通过git fetch与git merge完成同步。
bash
# 示例
# 三个版本
[root@Git-Client project]# git log
commit 04467435b11c8827103f2068afb01727a2049ab8 (HEAD -> master, origin/master, origin/HEAD)
Version 3
commit 8789f8898667725b823dc4aedda7eb51100bba05
Version 2
commit 32f20d47638365bb85b052a654e128f608e1ec66
Version 1
# 回退到版本2
[root@Git-Client project]# git reset --hard 8789f8898667725b823dc4aedda7eb51100bba05
# 确实是版本2
[root@Git-Client project]# git log
commit 8789f8898667725b823dc4aedda7eb51100bba05 (HEAD -> master)
Version 2
commit 32f20d47638365bb85b052a654e128f608e1ec66
Version 1
# 查看远程
[root@Git-Client project]# git remote -v
origin git@172.25.254.44:/home/git/project.git (fetch)
origin git@172.25.254.44:/home/git/project.git (push)
# git pull 拉取远程仓库
[root@Git-Client project]# git pull
# 再次查看,发现版本回到3
[root@Git-Client project]# git log
commit 04467435b11c8827103f2068afb01727a2049ab8 (HEAD -> master, origin/master, origin/HEAD)
Version 3
commit 8789f8898667725b823dc4aedda7eb51100bba05
Version 2
commit 32f20d47638365bb85b052a654e128f608e1ec66
Version 1
3.2.3 git fetch拉取变更不应用(只读型同步)
bash
]# git clone git@172.25.254.44:/home/git/project.git
]# echo "测试更新测试更新!!!" >> test_fetch.txt
]# git add test_fetch.txt
]# git commit -m "更新Tag" test_fetch.txt
]# git log
]# git remote -v
]# git push
[root@Git-Client project]# git fetch
[root@Git-Client project]# git log
[root@Git-Client project]# git diff master origin/master
[root@Git-Client project]# git merge
[root@Git-Client project]# git log
commit 6ed3578a0b3c70daf4eda39bd9076b8b5491b99a (HEAD -> master, origin/master, origin/HEAD)
更新Tag
commit 902b97293a2e7a31ee5236db29d65b9bee4ef76b
模拟测试
commit a013204442df1b6b28f2a1a01a636efa9406be80
Version 4
commit 04467435b11c8827103f2068afb01727a2049ab8
Version 3
commit 8789f8898667725b823dc4aedda7eb51100bba05
Version 2
commit 32f20d47638365bb85b052a654e128f608e1ec66
Version 1
3.2.4 git pull与git fetch区别
git fetch 与 git pull 的核心差异体现在数据同步范围 、工作区状态干预 与冲突处理时机三个技术维度。
-
底层执行链路与状态影响
git fetch仅执行网络对象下载阶段。它会连接远程仓库,获取本地缺失的 commits、trees、blobs 对象,并更新本地.git/refs/remotes/origin/下的远程跟踪分支指针。该过程严格隔离于当前分支(HEAD)与工作区(Working Tree),不会修改任何本地文件,属于只读型同步。git pull是git fetch与git merge(默认)或git rebase(若配置pull.rebase=true)的原子组合。它在完成对象下载与跟踪分支更新后,立即尝试将远程变更集成至当前检出的本地分支。该操作会直接重写工作区文件、更新暂存区(Index)与 HEAD 指针,若存在同文件同区域的修改差异,将触发合并冲突并阻塞流程。
-
命令行工作流示例
假设远程
origin/main新增了 3 个提交,本地main落后 2 个提交:bash# 场景A:使用 fetch(安全审查型) $ git fetch origin # 仅下载数据,更新 origin/main 指针,本地工作区无变化 $ git log main..origin/main # 预览远程新增的提交记录 $ git diff main..origin/main # 逐文件比对差异 $ git merge origin/main # 确认无误后,手动执行合并 # 场景B:使用 pull(自动集成型) $ git pull origin main # 等价于 fetch + merge。直接下载并将远程变更合并至当前 main 分支 # 若本地与远程修改重叠,终端将输出 CONFLICT 提示并暂停,需手动解决 -
工程实践定位
fetch适用于 CI/CD 预检、多分支交叉验证、本地存在未提交修改(Dirty Tree)或需审查远程代码质量后再决定是否集成的场景。pull适用于本地工作区干净、团队已约定直连同步策略或追求快速对齐主干的日常开发场景。
两者并非互斥替代关系,而是"审查缓冲"与"一键同步"的协作分工。合理选择取决于对变更可控性与操作效率的权衡。
git fetch相当于"下载附件,暂不替换原文件":同事通过邮件把新版合同发给你。你点击"保存附件"到桌面,但继续打开自己电脑里原来的旧版合同继续修改。你可以随时点开桌面上的新版,逐条对比同事改了哪些条款、是否影响你的谈判策略。确认完全没问题后,你再手动把需要的改动复制粘贴到你的正式文件里。这个过程完全不会打乱你当前的进度,即使新版里有冲突条款,你也能从容评估后再处理。git pull相当于"下载并自动替换合并":你点击"一键同步更新",系统不仅把新版下载下来,还立刻打开你正在编辑的合同,把同事改的内容直接覆盖进去。如果你们改的是不同条款,文件就顺利变成最新合集;但如果同事改了"违约责任"条款,而你今天也在改同一条款,系统就会立刻弹窗提示"内容冲突",强制暂停保存,要求你逐条勾选"保留我的"还是"保留对方的"。这个过程一步到位,但一旦撞车就会中断你的工作流。
3.2.5 git add提交至暂存区
将所有改动的文件(新增和有变动的)放在暂存区,由git进行管理
bash
[root@Git-Client project]# echo 'No.4' >> Version.html
[root@Git-Client project]# cat Version.html
No.1
No.2
No.3
No.4
[root@Git-Client project]# git status
# add提交至暂存区
[root@Git-Client project]# git add Version.html
[root@Git-Client project]# git status
[root@Git-Client project]# git commit -m 'Version 4'
[root@Git-Client project]# git log
commit a013204442df1b6b28f2a1a01a636efa9406be80 (HEAD -> master)
Version 4
commit 04467435b11c8827103f2068afb01727a2049ab8 (origin/master, origin/HEAD)
Version 3
commit 8789f8898667725b823dc4aedda7eb51100bba05
Version 2
commit 32f20d47638365bb85b052a654e128f608e1ec66
Version 1
[root@Git-Client project]# git push
git status 获取仓库当前的状态:
- Untracked files:有未被跟踪的文件
- Changes to be committed:有未提交的文件
- nothing to commit, working tree clean:没有被修改的文件
3.2.6 删除暂存区缓存(工作区文件不受影响)
3.2.6.1 git restore --staged xxx(推荐,频率高)
bash
[root@Git-Client fz]# echo "Docker" > 9.txt
[root@Git-Client fz]# git add 9.txt
[root@Git-Client fz]# echo "DDDD" > 11.txt
[root@Git-Client fz]# git add 11.txt
[root@Git-Client fz]# git status
new file: 11.txt
new file: 9.txt
[root@Git-Client fz]# git restore --staged 11.txt
[root@Git-Client fz]# git status
new file: 9.txt
11.txt
3.2.6.2 git rm --cached xxx
bash
[root@Git-Client fz]# git add 11.txt
[root@Git-Client fz]# git status
new file: 11.txt
new file: 9.txt
[root@Git-Client fz]# git rm --cached 11.txt
[root@Git-Client fz]# git status
new file: 9.txt
11.txt
3.2.6.3 区别(跟踪/不跟踪)
模拟测试
bash
# 步骤1:创建一个会被跟踪的文件
echo "test" > track.txt
git add track.txt
git commit -m "add track.txt" # 关键:让它被跟踪
# 步骤2:修改并暂存
echo "new" >> track.txt
git add track.txt
# 步骤3:用 restore(文件保持跟踪)
git restore --staged track.txt
git status | grep "track.txt"
# 输出:modified: track.txt (注意:是 modified,不是 untracked)
# 步骤4:重新 add
git add track.txt
# 步骤5:用 rm --cached(文件失去跟踪)
git rm --cached track.txt
git status | grep "track.txt"
# 输出:Untracked files: track.txt (注意:是 untracked)
自我测试
bash
[root@Git-Client fz]# git add 123.txt
[root@Git-Client fz]# git add 456.txt
[root@Git-Client fz]# git status
new file: 123.txt
new file: 456.txt
[root@Git-Client fz]# git commit -m "v1" 123.txt
[root@Git-Client fz]# git status
new file: 456.txt
[root@Git-Client fz]# echo "000" >> 123.txt
[root@Git-Client fz]# git add 123.txt
[root@Git-Client fz]# git status
modified: 123.txt
new file: 456.txt
[root@Git-Client fz]# git restore --staged 123.txt
[root@Git-Client fz]# git status
new file: 456.txt
modified: 123.txt
[root@Git-Client fz]# git add 123.txt
[root@Git-Client fz]# git rm --cached 123.txt
[root@Git-Client fz]# git status
deleted: 123.txt
new file: 456.txt
123.txt
3.2.7 git commit提交暂存区内容
bash
HEAD # 当前提交(最新)
HEAD~1 # 上一次提交(父提交)
HEAD~2 # 上两次提交
HEAD~3 # 上三次提交
# 等价写法
HEAD^ # 等同于 HEAD~1
HEAD^^ # 等同于 HEAD~2
提交当前工作空间的修改内容到本地仓库
bash
[root@Git-Client project]# git add 123.txt
# -m 是本次提交内容的注释/备注
[root@Git-Client project]# git commit -m "测试 commit" 123.txt
[root@Git-Client project]# git log
3.2.8 git reset删除commmit内容
bash
# 环境准备
[git@Git-Server ~]$ mkdir xx.git
[git@Git-Server ~]$ git init --bare xx.git/
[root@Git-Client ~]# git clone git@172.25.254.44:/home/git/xx.git
[root@Git-Client ~]# cd xx/
[root@Git-Client xx]# echo "1111" > x.html
[root@Git-Client xx]# git add x.html
[root@Git-Client xx]# git status
new file: x.html
[root@Git-Client xx]# git commit -m "v1" x.html
3.2.8.1 温柔git reset --soft xxx删除commit,保留修改(暂存区)
代码还在,git add 也帮你做好了。
bash
[root@Git-Client xx]# git reset --soft HEAD~1
[root@Git-Client xx]# git status
modified: x.html
3.2.8.2 默认git reset --mixed xxx删除commmit,保留修改(工作区)
代码还在,但git add 被取消了。
bash
[root@Git-Client xx]# git reset --mixed HEAD~1
[root@Git-Client xx]# git status
3.2.8.3 暴力git reset --hard xxx丢弃所有修改(包括历史修改)
干净得像新克隆的一样。
bash
[root@Git-Client xx]# git add x.html
[root@Git-Client xx]# git commit -m "v3" x.html
[root@Git-Client xx]# git status
[root@Git-Client xx]# git reset --hard HEAD~
[root@Git-Client xx]# git log --oneline # v3->v1
be778b6 (HEAD -> master) v1
3.2.9 git push推送更新
将本地commit的代码更新到远程版本库中
bash
[root@Git-Client project]# echo "NO.555" >> Version.html
[root@Git-Client project]# git add Version.html
[root@Git-Client project]# git commit -m "Version 555" Version.html
[root@Git-Client project]# git remote -v
origin git@172.25.254.44:/home/git/project.git (fetch)
origin git@172.25.254.44:/home/git/project.git (push)
# 推送到远程仓库
[root@Git-Client project]# git push
# 进行远程仓库拉取测试,并查看是否成功?
[root@Git-Client ~]# mkdir temp
[root@Git-Client ~]# cd temp/
[root@Git-Client temp]# git clone git@172.25.254.44:/home/git/project.git
[root@Git-Client project]# cat Version.html
No.1
No.2
No.3
No.4
NO.555
3.2.10 git log查看历史日志
查看历史记录,显示从最近到最远的提交日志,以便确定要回退到哪个版本。
git log --pretty=oneline使每条记录显示在同一行。git log --pretty=oneline --abbrev-commit使每条记录显示在同一行且简写。
bash
[root@Git-Client project]# git log --pretty=oneline
10519ddad7cf0ac438e5c9cb7adf8a106ce21d47 (HEAD -> master, origin/master, origin/HEAD) Version 555
433448a95cddcaf98f391062d9e5d2efc6f74fa4 测试 commit
63e4bcb1c0c930ad3cc5ccba219c645e42cc767e 测试 git rm
6ed3578a0b3c70daf4eda39bd9076b8b5491b99a 更新Tag
902b97293a2e7a31ee5236db29d65b9bee4ef76b 模拟测试
a013204442df1b6b28f2a1a01a636efa9406be80 Version 4
04467435b11c8827103f2068afb01727a2049ab8 Version 3
8789f8898667725b823dc4aedda7eb51100bba05 Version 2
32f20d47638365bb85b052a654e128f608e1ec66 Version 1
[root@Git-Client project]# git log --pretty=oneline --abbrev-commit
10519dd (HEAD -> master, origin/master, origin/HEAD) Version 555
433448a 测试 commit
63e4bcb 测试 git rm
6ed3578 更新Tag
902b972 模拟测试
a013204 Version 4
0446743 Version 3
8789f88 Version 2
32f20d4 Version 1
4.分支操作
4.1 git的分支是什么?
顾名思义,分支就是从主分支上分离出来进行另外的操作,而又不影响主分支,主分支又可以继续干它的事,最后分支做完事后合并到主分支上而分支的任务完成可以删掉了。使用分支意味着你可以从开发主分支上分离开来,然后在不影响主分支的同时继续工作。创建一个属于自己的分支,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,既安全又不影响别人工作。Git的分支无论创建、切换和删除,无论版本库大小,都很快,只是修改指针。
4.2 git分支管理
准备前期环境
bash
[git@Git-Server ~]$ mkdir fz.git
[git@Git-Server ~]$ git init --bare fz.git/
[root@Git-Client ~]# git clone git@172.25.254.44:/home/git/fz.git
[root@Git-Client ~]# cd fz/
# 如果拉下来的仓库是裸仓库,因此需要第一次commmit之后,才会出现分支
[root@Git-Client fz]# git branch
[root@Git-Client fz]# echo "hello" > README.md
[root@Git-Client fz]# git add README.md
[root@Git-Client fz]# git commit -m "v1" README.md
[root@Git-Client fz]# git branch
* master
# 推送至远程仓库,远程裸仓库里也会出现 master 分支
[root@Git-Client fz]# git push -u origin master
4.2.1 git branch查看分支
bash
# * 代表此时处于那个分支
[root@Git-Client fz]# git branch
* master
4.2.2 git branch <name>创建分支
bash
[root@Git-Client fz]# git branch nginx
[root@Git-Client fz]# git branch
* master
nginx
4.2.3 git checkout <name>切换分支
bash
[root@Git-Client fz]# git checkout nginx
[root@Git-Client fz]# git branch
master
* nginx
4.2.4 git checkout -b <name> 创建并切换到分支
bash
[root@Git-Client fz]# git checkout -b tomcat
[root@Git-Client fz]# git branch
master
nginx
* tomcat
4.2.5 git branch -m <old> <new>重命名分支
bash
[root@Git-Client fz]# git branch -m tomcat nginx-2
[root@Git-Client fz]# git branch
master
nginx
* nginx-2
4.2.6 git merge <name>合并分支(前提:master分支操作)
bash
# nginx分支存在1.tml
[root@Git-Client fz]# git branch
master
* nginx
nginx-2
[root@Git-Client fz]# ls
1.html README.md
[root@Git-Client fz]# cat 1.html
<<nginx>>
# 切换到master分支,只有README.md
[root@Git-Client fz]# git checkout master
[root@Git-Client fz]# git branch
* master
nginx
nginx-2
[root@Git-Client fz]# ls
README.md
# 合并nginx分支,再次查看发现,1.html已存在
[root@Git-Client fz]# git merge nginx
[root@Git-Client fz]# ls
1.html README.md
[root@Git-Client fz]# cat 1.html
<<nginx>>
4.2.7 git -d/D <name>删除分支(安全/强制)
bash
# 安全删除:只能删除已合并的分支
git branch -d <name>
# 强制删除:删除任何分支(包括未合并的分支)
git branch -D <name>
bash
[root@Git-Client fz]# git branch
* master
nginx
nginx-2
# nginx分支已经被merege合并了,因此-d可以直接删除
[root@Git-Client fz]# git branch -d nginx
# 这里删除不了说明nginx-2为未合并
# 如果很意外的删除了,那是说明这个分支你没有做任何的动作,只是创建下来了
[root@Git-Client fz]# git branch -d nginx-2
error: The branch 'nginx-2' is not fully merged.
If you are sure you want to delete it, run 'git branch -D nginx-2'.
# 因此需要-D来强制删除
[root@Git-Client fz]# git branch -D nginx-2