Git

Git

安装

  1. 官网下载:https://git-scm.com/

  2. 下载安装包后运行,使用默认选项一路 Next 即可

  3. 检查是否安装成功

    1
    git --version
  4. 配置身份信息(用于标识提交记录里的作者)

    1
    2
    git config --global user.name "你的名字"
    git config --global user.email "你的邮箱@example.com"
  5. 查看当前配置

    1
    git config --global --list

基本概念

仓库

  • 本地仓库:存放在你电脑上的仓库
  • 远程仓库:存放在服务器(如 GitHub)上的仓库

三大区域

工作区 –add–> 暂存区 –commit–> 本地仓库

  • 工作区:电脑上的项目文件夹,写代码的地方
  • 暂存区:临时存放修改的地方,决定哪些修改要放进下一个版本
  • 本地仓库:保存所有版本历史的 .git 目录

基本命令

仓库相关

  • 初始化仓库

    1
    git init
  • 克隆远程仓库

    1
    2
    3
    4
    git clone https://github.com/用户名/仓库名.git

    # 克隆到指定目录
    git clone https://github.com/用户名/仓库名.git 本地文件夹名查看状态

文件相关

  • 查看文件状态

    显示哪些文件被修改了但还没暂存;哪些文件已经暂存,等待提交;哪些文件没有被 Git 跟踪

    1
    git status
  • 添加文件到暂存区

    1
    2
    3
    4
    5
    # 添加指定文件
    git add 文件名

    # 添加当前目录下所有修改
    git add .
  • 把暂存区文件提交到仓库

    1
    2
    3
    4
    5
    # 提交并附带简短的说明信息
    git commit -m "描述这次做了什么修改"

    # 提交所有已跟踪文件的修改,-a相当于git add
    git commit -a -m "直接提交"
  • 查看提交历史

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看完整历史
    git log

    # 简洁的一行显示
    git log --oneline

    # 图形化显示分支历史
    git log --graph --oneline --all
  • 查看文件差异

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看工作区和暂存区的差异(还没 git add 的修改)
    git diff

    # 查看暂存区和最新提交的差异(已经 git add 但还没 commit 的修改)
    git diff --staged

    # 查看两个提交之间的差异
    git diff 提交ID1 提交ID2

版本管理

  • 回退版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 回退到上一个提交,撤销 commit 和 add,保留文件修改
    git reset HEAD~1

    # 回退到上一个提交,撤销 commit,保留修改用于重新提交
    git reset --soft HEAD~1

    # 回退到上一个提交,彻底回到指定版本,丢弃所有修改
    git reset --hard HEAD~1

    # 回退到指定提交
    git reset --hard 提交ID
  • 安全撤销

    1
    2
    3
    # 会创建一个新的版本,内容是指定的版本内容
    # 和reset的区别是不会删除历史
    git revert 提交ID
  • 回退单个文件

    1
    2
    3
    4
    5
    # 撤销这个文件的add
    git restore --staged 文件名

    # 从指定的提交中恢复文件
    git restore --source=提交ID 文件名
  • 编辑最后一次提交

    1
    2
    3
    4
    5
    6
    # 修改最后一次提交的说明信息
    git commit --amend -m "新的提交信息"

    # 把忘掉的修改追加到上一次提交中(不产生新提交)
    git add 忘掉的文件
    git commit --amend --no-edit

分支管理

  • 查看分支

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看本地所有分支(前面带 * 的是当前分支)
    git branch

    # 查看远程分支
    git branch -r

    # 查看所有分支(本地 + 远程)
    git branch -a
  • 创建分支

    1
    2
    3
    4
    5
    6
    # 创建分支(但不切换)
    git branch 分支名

    # 创建并切换到新分支
    git switch -c 分支名 # 新版命令(推荐)
    git checkout -b 分支名 # 传统命令
  • 切换分支

    :warning:在切换时,如果有尚未commit的修改,会直接覆盖到新分支的工作区和暂存区

    1
    2
    3
    # 切换到已有分支
    git switch 分支名 # 新版命令(推荐)
    git checkout 分支名 # 传统命令
  • 合并分支

    1
    2
    # 合并到当前分支
    git merge 分支名
  • 删除分支

    1
    2
    3
    4
    5
    # 删除已合并的分支
    git branch -d 分支名

    # 强制删除(即使没合并)
    git branch -D 分支名
  • 暂存分支的修改

    想要切换到其它分支,但不想要丢到现在分支的工作区和暂存区

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 暂存当前所有修改
    git stash

    # 带说明信息的暂存
    git stash push -m "WIP: 用户登录功能进行中"

    # 查看已暂存的列表
    git stash list

    # 恢复最近一次暂存(并保留 stash 记录)
    git stash apply

    # 恢复最近一次暂存(并删除 stash 记录)
    git stash pop

    # 删除所有 stash
    git stash clear

远程仓库

  • 关联远程仓库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 添加远程仓库(origin 是约定俗成的名字)
    git remote add origin 仓库地址

    # 查看已关联的远程仓库
    git remote -v

    # 修改远程仓库地址
    git remote set-url origin 新地址

    # 删除远程仓库关联
    git remote remove origin
  • 推送代码

    1
    2
    3
    4
    5
    6
    7
    8
    # 推送当前分支到远程仓库
    git push origin 分支名

    # 首次推送并建立追踪关系(之后可以直接用 git push)
    git push -u origin 分支名

    # 推送所有本地分支
    git push --all origin
  • 拉取代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # git fetch:只下载远程更新,不合并
    git fetch origin

    # git pull:下载并自动合并到当前分支(= git fetch + git merge)
    git pull origin 分支名

    # 用 rebase 方式拉取(保持历史整洁)
    # 变基:把远程代码的commit拉下来,再把本地的commit接到后面
    # 如果不变基就会显示两个分支合并成一个
    git pull --rebase origin 分支名

代码冲突的处理

当合并出现冲突时,Git 会输出:

1
2
3
Auto-merging 冲突的文件名
CONFLICT (content): Merge conflict in 冲突的文件名
Automatic merge failed; fix conflicts and then commit the result.

解决方式

  • 手动解决

    • 冲突的文件里会显示

      1
      2
      3
      4
      5
      <<<<<<< HEAD
      分支1
      =======
      分支2
      >>>>>>> 分支2
      标记 含义
      <<<<<<< HEAD 当前分支(main)的内容
      ======= 分隔线
      >>>>>>> 分支2 被合并分支的内容
    • 保留其中一个

      1
      分支2
    • 然后 addcommit

      1
      2
      git add .
      git commit -m "解决合并冲突"
  • 取消合并

    1
    git merge --abort

.gitignore

有些文件不应该被 Git 跟踪(如依赖包、编译产物、密钥、系统文件等),通过 .gitignore 来忽略它们

可能出现的问题

  1. 推送远程仓库时出现git SSL certificate problem: unable to get local issuer certificate时,设置

    1
    2
    // 使用 Windows 系统自带的证书系统(Schannel)来处理 SSL/TLS 连接
    git config --global http.sslbackend schannel
  2. 推送时Automatic merge failed; fix conflicts and then commit the result.,表示自动合并失败,本地和远程文件同一部分被修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 查看冲突文件
    git status

    // 打开冲突文件可以看到
    <<<<<<< HEAD
    本地内容
    =======
    远程内容
    >>>>>>> origin/main

    // 保留本地内容或远程内容
    // 修改完文件后 git add、commit、push即可

git工作流

通常

  1. 先将远程仓库的项目拉到本地

    1
    git clone <仓库地址>
  2. 在本地新建一个自己的分支

    建议在自己的branch上修改代码,而不是直接在主分支上修改

    1
    2
    git checkout -b <分支名>
    // -b 新建并且切换到新分支
  3. 在自己分支上修改代码

  4. 在写完代码,还没有保存到git本地仓库时,可以通过git diff查看修改后的代码和修改前的代码的不同

    建议先看一下修改了哪些内容再继续

  5. 将修改的代码保存到暂存区

    1
    2
    git status	// 查看还没有保存到暂存区的文件
    git add <文件名/*> // 将文件添加到暂存区,*表示所有
  6. 将暂存区的代码提交到git本地仓库中

    1
    git commit -m "<备注信息>"
  7. 将自己本地的分支提交到远程仓库,远程仓库会多出一个新分支

    1
    git push origin <提交的远程仓库的分支名>

当远程仓库的主分支代码有改动时

如果在合并自己的分支和远程仓库主分支时,远程仓库主分支的代码在之前clone下来的基础上有改动,需要同步远程仓库的代码到本地的分支里,看看会不会冲突

  1. 先将本地git的分支切换回主分支,再将远程仓库的代码拉到本地

    1
    2
    git checkout main
    git pull origin main
  2. 切换到分支上,将分支上的代码和最新的代码尝试进行合并

    可能会出现冲突,需要手动选择要保存的代码

    1
    git rebase main	// 意思是在最新的main的基础上,将我的修改添加到main中
  3. 解决完冲突后,将本地的分支推到远程仓库的分支上

    1
    2
    git push -f origin <分支名>
    // -f force强行

远程仓库上将分支和主分支合并

  1. 远程仓库主人通过pull request的squash and merge 将所有的commit合并成一个commit ,再合并到主分支上

  2. 合并完,通常会删除本地分支和远程分支,再把最新的主分支拉到本地主分支

    1
    2
    git branch -D <分支名>	// 删除本地分支
    git pull origin main // 把最新的主分支拉到本地主分支
    1
    删除远程分支:点击view all branchs,点击垃圾桶标识就可删除了


Git
http://xwww12.github.io/2022/08/10/后端/Git/
作者
xw
发布于
2022年8月10日
许可协议