本文最后更新于 2024-08-07,文章内容可能已经过时。

Git使用

Git是什么
  • Git是一个免费的、开源的**分布式版本控制系统**,可以高速处理从小型到大型的各种项目

  • 版本控制:是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统

集中式与分布式版本控制

集中式版本控制工具:如CVS、SVN等,都有一个单一的几种管理服务器,保存所有文件的修订版本,而协同工作的人通过客户端连接到这台服务器,从而取出最新的文件或者提交更新。缺点:中央服务器的单点故障;多(程序员)对一(中央服务器)

分布式版本控制工具:如git,客户端取的不是最新的文件快照,而是把代码仓库完整的镜像下来到本地库(克隆/备份)

Git安装与配置

安装包下载-地址

 http://git-scm.com/downloads

Git配置

使用git config 的命令,用来配置或读取相应的工作环境变量

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。

  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。

  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

  1. 查看配置信息:

    1. 查看全局配置:git config --global --list

    2. 查看系统级配置:git config --system --list

    3. 查看仓库级配置:git config --local --list

  2. 设置配置项:

    1. 设置全局用户名:git config --global user.name "Your Name"

    2. 设置全局邮箱:git config --global user.email "your_email@example.com"

  3. 编辑配置文件:

    1. 编辑全局配置文件:git config --global --edit

    2. 编辑系统级配置文件:git config --system --edit

    3. 编辑仓库级配置文件:git config --local --edit

  4. 删除配置项:

    1. 删除全局用户名配置:git config --global --unset user.name

    2. 删除全局邮箱配置:git config --global --unset user.email

  5. 配置别名:

    1. 设置st作为status的别名:git config --global alias.st status

Git的使用流程

使用方法

Git可以使用GUI界面操作,也可以使用git命令操作

一般使用git命令操作简单清晰

Git Bash

Git安装后会带一个Git Bash 在项目根目录下右键选择就可使用

Git Bash 中可以使用所有git命令,也可使用部分Bash shell 命令比如vim(能不能使用所有shell命令没试过)

终端

也可直接在终端打开项目目录使用git命令,windows终端不能直接使用shell

idea

在项目idea中(pycharm、idea、VScode)中的终端也可以直接使用git命令

或者更简单点使用工具提供的图形化操作

三个区域
  • 工作区:工作区是你在本地计算机上的项目目录,你在这里进行文件的创建、修改和删除操作。工作区包含了当前项目的所有文件和子目录。

    • 作用:编辑文件且显示当前的更改状态,但这些更改还没有被记录到版本控制仓库中

    • 流程:使用git add 把更改添加到暂存区,再使用git commit 把暂存区中记录的更改添加到版本库中

  • 暂存区:暂存区是一个临时存储区域,它包含了即将被提交到版本库中的文件快照,在提交之前,你可以选择性地将工作区中的修改添加到暂存区。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

    • 作用:保存工作区添加的更改,并在下一次提交时全部记录到版本库中

    • 流程:可以多次使用 git add 命令来将文件添加到暂存区,直到你准备好提交所有更改。

  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

    • 作用:版本库包含项目的所有版本历史记录。每次提交都会在版本库中创建一个新的快照,这些快照是不可变的,确保了项目的完整历史记录。

    • 可以有本地版本库和远程版本库

五个状态
  • 未跟踪(Untracked):新创建的文件

  • 已跟踪(Tracked): 通过 git add 命令将未跟踪的文件添加到暂存区后,文件变为已跟踪状态。

  • 已修改(Modified): 对已跟踪的文件进行更改后,这些更改会显示为已修改状态,但这些更改还未添加到暂存区。

  • 已暂存(Staged): 使用 git add 命令将修改过的文件添加到暂存区后,文件进入已暂存状态,等待提交。

  • 已提交(Committed): 使用 git commit 命令将暂存区的更改提交到本地仓库后,这些更改被记录下来,文件状态返回为已跟踪状态。

使用流程

初始化仓库

要想进行版本管理,第一步肯定要初始化仓库,git使用都是建立在Git仓库上的

在需要进行版本控制的项目根目录上使用 git init 命令来初始化一个 Git 仓库

执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变

 # 初始化当前目录
 git init
 ​
 # 也可指定目录作为仓库
 git init newrepo

克隆已有仓库

除了新建一个项目外,还可使用已有的Git仓库中克隆项目

 # 默认克隆在当前操作目录
 git clone <repo>
 ​
 # 也可指定克隆位置
 git clone <repo> <directory>
 ​
 # 克隆 Ruby 语言的 Git 代码仓库 Grit
 $ git clone git://github.com/schacon/grit.git

添加文件到暂存区

使用git add 命令可以将有更改的文件添加到暂存区,没有更改文件将不会产生任何效果

 # 可以添加单个文件
 git add test.txt
 ​
 # 也可一次添加所有有更改的文件
 git add .

git add 命令执行后没报错就是执行成功了

查看仓库状态

使用git status命令可以 查看仓库当前的状态,显示有变更的文件。

git status均有返回提示:

  • 仓库当前没有任何更改

  • 新建了文件还没添加到暂存区(红色字体)

  • 新建了文件在暂存区还没提交到版本库

  • 文件有更改还没提交到暂存区

  • 暂存区有文件还没提交到版本库

提交到版本库

使用git commit 将暂存区内容添加到仓库中。

 # 将暂存区的所有更改添加到版本库
 git commit # 不加参数会交互式的让你写入提交日志
 ​
 # 可加 -m 参数直接输入日志信息
 git commit -m "日志信息“

关联远程仓库

1.添加远程仓库

需要现在远程仓库创建一个空仓库

使用 git remote 命令进行远程操作

 git remote add origin https://gitee.com/yourname/project.git

  • git remote:列出当前仓库中已配置的远程仓库。

  • git remote -v:列出当前仓库中已配置的远程仓库,并显示它们的 URL。

  • git remote add <remote_name> <remote_url>:添加一个新的远程仓库。指定一个远程仓库的名称和 URL,将其添加到当前仓库中。

  • git remote rename <old_name> <new_name>:将已配置的远程仓库重命名。

  • git remote remove <remote_name>:从当前仓库中删除指定的远程仓库。

  • git remote set-url <remote_name> <new_url>:修改指定远程仓库的 URL。

  • git remote show <remote_name>:显示指定远程仓库的详细信息,包括 URL 和跟踪分支。

2.拉取远程仓库

git pull 其实就是 git fetchgit merge 的简写,先从远程仓库获取最新的提交记录,然后将这些提交记录合并到你当前的分支中

git pull [远程仓库名] [分支名]

  • [远程仓库名] 通常是 origin,是默认的远程仓库名。

  • [分支名] 是你要合并的远程分支,比如 mainmaster

 git pull origin master
 ​
 这个命令非常容易报错fatal: refusing to merge unrelated histories 合并冲突
 可以按提示使用以下命令
 ​
 git pull origin master --allow-unrelated-histories
 ​

git fetch:

git fetch 命令用于从远程获取文件到本地仓库

git merge

合并分支

在执行 git fetch 之后紧接着执行 git merge 远程分支到你所在的任意分支。

3.更新远程仓库

git push <远程主机名> <本地分支名>:<远程分支名>

 git push origin master (分支的名字)
 ​
 #  可以使用 -u 参数将当前本地分支与远程分支关联
 git push -u origin master 

git push --force :版本有冲突强制推送

git push origin --delete <分支名>:删除远程仓库分支

查看版本提交日志

git log

  • git log 命令用于查看 Git 仓库中提交历史记录。

  • git log 显示了从最新提交到最早提交的所有提交信息,包括提交的哈希值、作者、提交日期和提交消息等。

参数选项:

  • -p:显示提交的补丁(具体更改内容)。

  • --oneline:以简洁的一行格式显示提交信息。

  • --graph:以图形化方式显示分支和合并历史。

  • --decorate:显示分支和标签指向的提交。

  • --author=<作者>:只显示特定作者的提交。

  • --since=<时间>:只显示指定时间之后的提交。

  • --until=<时间>:只显示指定时间之前的提交。

  • --grep=<模式>:只显示包含指定模式的提交消息。

  • --no-merges:不显示合并提交。

  • --stat:显示简略统计信息,包括修改的文件和行数。

  • --abbrev-commit:使用短提交哈希值。

  • --pretty=<格式>:使用自定义的提交信息显示格式。

撤销和回退

使用版本控制就是为了能在出错时可以恢复和回退,所以这一步是很重要的

常见命令:

  • git restore: 恢复或撤销文件的更改。

    git restore 命令是 Git 2.23 版本引入的,用于简化和改进文件恢复操作,相比于旧的命令(如 git checkoutgit reset),它更专注于恢复文件内容和工作区状态。

    git restore 可以恢复工作区和暂存区中的文件,也可以用于丢弃未提交的更改。

    git restore [<options>] [<pathspec>...]
    
    <pathspec>:要恢复的文件或目录路径。
    <options>:用于定制恢复行为的选项。
    
    
    # 恢复工作区中的文件到最近的提交状态(即丢弃对文件的所有未提交更改)
    git restore file.txt
    
    # 将暂存区中的文件恢复到工作区,实际上是将文件从暂存区移除(不提交)
    git restore --staged file.txt
    
    # 从某个提交(例如 HEAD~1)中恢复文件
    git restore --source=HEAD~1 file.txt
    
    # 在合并冲突时,恢复为当前分支的版本(即"我们"的版本)
    git restore --ours file.txt
    
    # 在合并冲突时,恢复为另一个分支的版本(即"他们"的版本)
    git restore --theirs file.txt
    
    # 显示将要恢复的文件和路径,而不实际进行恢复
    git restore file1.txt file2.txt

  • git checkout:切换分支或恢复文件到指定提交。

  • git reset:重置当前分支到指定提交(软重置、混合重置、硬重置)。

  • git revert:创建一个新的提交以撤销指定提交,不改变提交历史。

  • git reflog:查看历史操作记录,找回丢失的提交。

Git一般流程
  1. git init(初始化仓库)或者git clone(克隆仓库)

  2. git pull(获取仓库最新版本)

  3. 工作区项目有更改

  4. git add .(将所有更改添加到暂存区)

  5. 确认更改

  6. git commit (将暂存区的更改更新到本地版本库)

  7. git push(将本地版本库更新到远程仓库)

Git分支管理

Git 分支管理是 Git 强大功能之一,能够让多个开发人员并行工作,开发新功能、修复 bug 或进行实验,而不会影响主代码库。

分支规则
  • 分支可以创建多条分支,分支的分支也可以创建分支

  • 分支创建时会继承父分支的库,但是创建后各分支库互不影响,除非进行合并

切换分支
git checkout (branchname)

删除分支
# 删除本地分支
git branch -d <branchname>

# 强制删除未合并的分支
git branch -D <branchname>

# 删除远程分支
git push origin --delete <branchname>

git branch

git branch也是对分支进行操作

列出分支

当前所在分支前有 *表示

# 列出本地所有
git branch

创建分支
# 创建新分支
git branch <branchname>

删除分支
git branch -d (branchname)

git merge

git merge用于合并分支

# 将branchname分支合并到当前所在分支,banchname分支库不受影响
git merge <branchname>

Git 标签

如果你达到一个重要的阶段,并希望永远记住提交的快照,你可以使用 git tag 给它打上标签。

Git 标签(Tag)用于给仓库中的特定提交点加上标记,通常用于发布版本(如 v1.0, v2.0)。

git tag <tagname>

git tag v1.0

# -a 选项可以添加注解
$ git tag -a v1.0 

# 查看所有标签
git tag

推送标签到远程仓库

默认情况下,git push 不会推送标签,你需要显式地推送标签。

git push origin <tagname>

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

# 本地删除标签
git tag -d <tagname>

# 远程删除标签
git push origin --delete <tagname>

# 附注标签 -m
git tag -a <tagname> -m "message"