由来

Git --- The stupid content tracker, 傻瓜内容跟踪器。Linus Torvalds 是这样给我们介绍 Git 的。

Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。[[百度百科]](https://baike.baidu.com/item/GIT)

安装

# CentOS
yum install git -y
# Windows&macOS&Unix&Linux都可以下面的页面中找到
# https://git-scm.com/downloads  

概念

  • 仓库Repository: 分为本地和远程仓库
  • 索引Index: 也可以叫缓存
  • 工作区Workspace: 也就是平时写的代码
  • 远程仓库Rmote: 远程仓库, 例如GITHUB

工作区 –>[add] 索引/缓存 –>[commit] 本地仓库 ···>[push] 远程仓库

远程仓库 –>[clone] 工作区

远程仓库 –>[pull] 本地仓库/工作区

Repository仓库, 版本库

git初始化后, 会在当前目录生成一个.git目录, 这就是版本库

WorkSpace工作空间, 工作区

.git所在目录就是工作区, 一般是项目的根目录

Index索引

介于工作区和版本库之间, 暂存修改的

Remote远程版本库

网络上的另一个版本库, 可以和本地库进行交互

使用

初始化一个空的版本库

mkdir test
cd test
git init    # 初始化一个空仓库
# Initialized empty Git repository in D:/Test/.git/

添加文件

# 新建一个index.html文件
cat > 'index.html' <<- EOF
<html>
    <title>Index</title>
    <body>
        <div class="index-title">Index</div>
        <style type="text/css">
            .index-title {
                text-align: center;
                font-size: 30px;
            }
        </style>
    </body>
</html>
EOF

# 单个文件添加
git add index.html
# 添加当前目录下的所有文件
git add .
# 查看状态
git status
# On branch master

# No commits yet

# Changes to be committed:
#  (use "git rm --cached <file>..." to unstage)
#        new file:   index.html    # 新文件

文件状态的生命周期

git status

  • untracked: 未添加的/未被管理的文件
  • unmodified: 被管理的文件
  • modified: 被修改的文件
  • staged: 放到index中

untracked –> [add]unmodified –> [edit]mofified –> staged –> [commit] –> unmodified(提交后状态又为unmodified)

GIT的文件分类

  • 追踪的Tracked, 已加入版本库中的文件
  • 未追踪的UNtracked, 未加入到版本库中文件
  • 忽略的Ignored, git不再关注的文件, 例如一些临时文件

.gitignore文件中, 目录以/结尾, 行起始的!是取反的意思

*.ipynb    # 以什么结尾的文件名
__pycache__/    # 所有以__pycache__命名的目录
.*

忽略文件: https://github.com/github/gitignore

提交代码

git commit 提交到本地仓库

git commit -m "第一次提交" # -m 是必须给的
# 如果想要批量的操作
git commit -a -m "Message"
# -a, --all
# 补充提交
# --amend 提交到当前分支最后一次提交的状态, 不是新提交, 而是追加提交

每次修改都需要先add才能进行commit

日志

git log

# 查看全部提交日志
git log
commit 695e5464fd2abd72f51e9af7361048bb40b3ed42
Author: libo124 <1240581124@qq.com>
Date:   Wed Jun 16 11:12:15 2021 +0800

    第一次提交

# 查看指定的提交
git log 695e5464fd2abd72f    # 不需要全长匹配
commit 695e5464fd2abd72f51e9af7361048bb40b3ed42
Author: libo124 <1240581124@qq.com>
Date:   Wed Jun 16 11:12:15 2021 +0800

    第一次提交

比较

git diff

git diff    # 查看被跟踪文件未暂存的修改, 比较暂存区和工作区
# git diff --cached    查看被跟踪文件暂存的修改, 比较暂存区和上一次commit的差异
# git diff HEAD 查看被跟踪文件, 比较工作区和上一次commit的差异, HEAD指代最后一次提交

HEAD

  • HEAD, 指代最后一次提交
  • HEAD^, 指代上一次提交
  • HEAD^^, 指代上上一次提交
  • HEADE~n, 上n次提交

检出与重置

命令说明
git checkout列出暂存区可以被检出的文件
git checkout file从暂存区检出文件到工作区, 就是覆盖工作区,文件, 可以指定检出的文件, 但是不清楚stage
git checkout commit file检出某个commit的指定文件到暂存区和工作区
git checkout .检出暂存区的所有文件到工作区
git reset列出被重置的文件
git reset file重置文件的暂存区, 和上一次commit一致.工作区不影响
git reset -hard重置暂存区和工作区, 与上一次commit保持一致

其他命令

命令说明
git reflog显示commit信息, 只要HEAD发生变化, 就可以在这里看到
git reset commit重置当前分支的HEAD为指定的commit, 同时重置暂存区, 但工作区不变
git reset -hard [commit]重置当前分支的HEAD为指定的commit, 同时重置暂存区和工作区, 与指定的commit保持一致
git reset -keep [commit]重置当前HEAD为指定commit, 但保持暂存区和工作区不变

移动和删除

git mv src dest 改名, 直接把改名的改动放入到暂存区

git rm file 会同时在版本库和工作目录中删除文件, 是完整的删除

git rm –cached file 将文件从暂存转为未暂存, 从版本库中删除, 但不删除工作目录的该文件,即文件恢复成不追踪的状态

push到服务器

配置

git config --global user.name "USERNAME"
git config --global user.email "1240581124@qq.com"
# 以上配置只是作为一些标签的使用, 与认证无关

push

git remote add origin https://git.beijixs.cn/libo/test.git    # 添加到远程仓库
# origin 只是本地的一个名字
cat .git/config    # 项目的配置文件
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = https://git.beijixs.cn/libo/test.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[user]
    name = libo
    email = 1240581124@qq.com

# 如果远程有文件了, 需要先合并或新建一个分支
git pull origin master
git push -u origin master  # -u 表示更新, 第一次push建议加上

克隆

git clone https://git.beijixs.cn/libo/test.git

临时存储

临时存储, 先不推送到服务器

Pychrom中VCS -> git -> stash changes # 创建一个临时保存
Pychrom中VCS -> git -> Unstash changes # 恢复/合并临时存储

分支

分支命名规则

  • 分支名在版本库中必须唯一
  • 不能以-开头
  • 可以使用/,但是不能以它结尾, 被它分割的名称不能以.开头
  • 不能使用两个连续的., 如: ..
  • 不能包含任何空白字符和GIT的特殊符号

创建分支

git checkout -b "dev" # 新建一个分支
# -B 新建分支, 如果存在就覆盖
git push origin dev # 推送到分支

合并分支

master合并分支代码

  • No FF合并: 这个合并表示两个分支进行合并, 如下

    Msater             -->        Master & Dev (No FF)
        ↘                    ↗
         Dev  --> Dev Changed
  • FF合并:

    Msater                            |    Master --> Dev --> Dev Changed
        ↘                        |    # 直接合并到master分支
         Dev  --> Dev Changed     |

合并前需要先切回master分支

git checkout master

请输入图片描述

然后合并dev分支到master

请输入图片描述

GitFlow工作流

最佳实践: 使用Git一般至少2个分支: masterdevelop

  • master: 生成环境都来主干上拿数据部署, 也可以使用钩子自动完成
  • deveop:开发分支, 开发人员都是检出这个分支进行开发
最后修改:2021 年 06 月 16 日 04 : 51 PM
如果觉得我的文章对你有用,请随意赞赏