跳转至

git

参考



License

MIT

Massachusetts Institute of Technology License

我只想安安静静写代码, 你干嘛都与我无关

  1. 版权申明

    • 文档和软件中需保留原始版权信息
  2. 免责条款

    • 原始作者对软件使用引发的任何损害不负责
  3. 使用

    • 随便用
  4. 修改

    • 随便改
  5. 再分发

    • 随意


BSD

Berkeley Software Distribution License

打广告的时候, 别说你是基于我的, 丢脸

  1. 版权申明

    • 文档和软件中需保留原始版权信息
  2. 免责条款

    • 原始作者对软件使用引发的任何损害不负责
  3. 使用

    • 随便用, 但是宣传软件的时候, 不要带上我
  4. 修改

    • 随便改
  5. 再分发

    • 随意


GPL

GNU General Public License

一日GPL, 一生GPL

  1. 版权申明

    • 文档和软件中需保留原始版权信息
  2. 免责条款

    • 原始作者对软件使用引发的任何损害不负责
  3. 使用

    • 随便用
  4. 修改

    • 随便改, 但是改了之后的代码不能闭源
  5. 再分发

    • 依旧遵循 GPL


LGPL

GNU Lesser General Public License

更灵活的GPL

  • 允许动态连接闭源库

  • 虽然灵活, 但这并不意味着你可以闭源


Apache

  1. 版权申明

    • 文档和软件中需保留原始版权信息
  2. 免责条款

    • 原始作者对软件使用引发的任何损害不负责
  3. 使用

    • 随便用
  4. 修改

    • 随便改
  5. 再分发

    • 修改后的软件, 分发时需要带上原始版权信息



安装

Linux

Bash
1
2
sudo apt install git # 安装 git
git --version        # 验证 git 安装成功


Windows

git 官网



首次使用

初始化仓库

在需要管理的目录(工作区)下, 执行以下命令:

Bash
1
git init -b main

将目标目录初始化成 git 可以管理的仓库, 会生成一个 .git 目录

同时, 会创建一个 main 分支, 看不见, 但是存在


设置名字和邮箱

Bash
1
2
git config user.name "名字"
git config user.email "邮箱"

此操作的目的, 是为了追踪每次操作, 究竟是谁做的, 我们一般将其存储在 config 中, 配置文件有三个级别, 权重从高到底:

  1. 仓库 local, 此配置文件只对 当前仓库 有效

  2. 全局 global, 此配置文件对 当前用户 有效

  3. 系统 system, 此配置文件对 全局 有效

所在位置:

Windows:

  1. local: .git/config

  2. global:C:\Users\username\.gitconfig

  3. system:C:\Program Files\Git\etc\gitconfig

Linux:

  1. local:.git/config

  2. global:~/.gitconfig

  3. system:/etc/gitconfig


文件追踪 / 移动到暂存区

Bash
1
git add 目标文件

或者追踪所有文件:

Bash
1
git add .

忽略某些文件

创建一个 .gitignore 文件, 写入需要忽略的文件或目录:

Text Only
1
2
3
4
b.txt
a/
*.txt
!a.txt

值得一提, 忽略文件的权限更改

Bash
1
git config core.filemode false


将暂存区提交到本地仓库

目标文件提交到本地仓库的当前分支:

Bash
1
git commit -m "提交说明"


将本地仓库推送到远程仓库

将本地仓库推送到远程仓库, 需要使用 SSH key 进行身份验证;私钥存储在本地, 公钥存储在远程仓库;当你推送的时候, 远程仓库会验证你的身份, 如果验证通过, 则可以推送

  1. 生成 SSH key

    在线生成

  2. 将公钥添加到远程仓库(github or gitee

    Windows:C:\Users\username\.ssh\id_rsa.pub

    Linux:~/.ssh/id_rsa.pub

    登录远程仓库, setting -> SSH keys -> New SSH key

    title:填写公钥的名字

    key:填写公钥的内容

  3. 在远程仓库中新建仓库

  4. 添加远程仓库

    Bash
    1
    git remote add origin 远程仓库地址
    

    origin 是远程仓库的别名, 可以自定义

  5. 推送到远程仓库

    Bash
    1
    git push origin main
    

    如果远程仓库没有 main 分支, 则会自动创建一个 main 分支

如果是通过账号密码进行身份验证

  • 记住账号密码

    Bash
    1
    git config --local credential.helper store
    


将远程仓库拉取到本地仓库

  • git fetch origin

    下载但不合并

  • git merge origin/main

    合并分支

  • git pull origin

    下载并合并

  • git clone 远程仓库地址

    在本地创建一个远程仓库的克隆(副本)



冲突

场景: 当 remote 已经领先于 local 时

  1. stash local changes

    Bash
    1
    git stash
    
  2. pull remote changes

    Bash
    1
    git pull
    

    如果这里出现冲突, 此时需要具体问题具体分析, 常见情形:

    local 文件未 add, 无法 stash 此文件, 但 remote 存在同名文件

    1. git add <file>

    2. git stash

    3. git pull

  3. apply local changes

    Bash
    1
    git stash apply
    

    如果这里出现冲突, 此时需要具体问题具体分析, 常见情形:

    local 文件与 remote 文件存在冲突

    1. 手动修改冲突文件, 解决冲突

    2. git add <file>

子模块

  • 拉取含有子模块的仓库

    Bash
    1
    git clone --recursive 远程仓库地址
    
  • 添加子模块

    Bash
    1
    git submodule add 远程仓库地址 子模块目录
    
  • 删除子模块

    Bash
    1
    git rm 子模块目录
    
  • 查看子模块

    Bash
    1
    git submodule
    
  • 更新子模块

    Bash
    1
    git submodule update
    



branch

Bash
1
2
3
4
5
git branch                  # 查看分支
git branch branch_name      # 创建分支
git checkout branch_name    # 切换分支
git checkout -b branch_name # 创建并切换分支
git merge branch_name       # 合并分支



1-------------------------

创建分支

Bash
1
git branch 分支名


设置默认编辑器

Bash
1
git config --local core.editor "vim"



查看状态

仓库

Bash
1
git status
  • 显示位于哪个 分支

  • 显示 暂存区 的信息

  • 显示 未跟踪 的文件


设置

Bash
1
git config --级别 -l

--级别 可以省略, 会显示最终三个配置文件计算后的配置信息


所有分支

Bash
1
git branch

* 表示当前分支


远程仓库

Bash
1
git remote -v
  • 远程仓库的别名和地址


查看提交历史

Bash
1
git log

显示从最近到最远的提交日志

简化输出:git log --pretty=oneline


查看命令历史

Bash
1
git reflog

显示从最近到最远的命令日志

可以看到每一次命令的 commit id



修改

更改名字和邮箱

Bash
1
2
git config --级别 user.name "新名字"
git config --级别 user.email "新邮箱"


修改上一次提交的信息

Bash
1
git commit --amend

如果使用的是 nano 编辑器, 按 Ctrl + X 退出, 然后输入 Y 保存, 最后按 Enter 退出


从暂存区移除文件

Bash
1
git reset 目标文件

这个命令本质上是

Bash
1
git reset --mixed commit_id

从暂存区移除文件, 但是不会删除文件

commit_id 可以省略, 默认是 HEAD

意思是将暂存区的文件恢复到 commit_id 的状态


撤销本次提交

  1. 保留工作区的修改

    Bash
    1
    git reset --soft HEAD^
    
    > 撤销本次提交, 但是保留工作区的修改

    HEAD^ 表示上一次提交, HEAD^^ 表示上上次提交, 以此类推

  2. 删除工作区的修改

    Bash
    1
    git reset --hard HEAD^
    

    撤销本次提交, 同时删除工作区的修改


删除远程仓库地址

Bash
1
git remote rm origin

删除远程仓库的别名为 origin 的仓库(地址) 仅仅是删除了别名, 远程仓库并没有被删除


切换分支

  • 切换到指定分支

    Bash
    1
    git checkout 分支名
    



国区操作

代理

设置代理

Text Only
1
2
3
4
```shell
git config --local http.proxy http://192.168.19.19:7890
git config --local https.proxy http://192.168.19.19:7890
```
  • 取消代理

    Bash
    1
    2
    git config --local --unset http.proxy
    git config --local --unset https.proxy
    

同时推送到多个远程仓库

  1. 再添加一个需要推送的远程仓库

    Bash
    1
    git remote set-url --add origin 远程仓库地址
    
  2. 推送到远程仓库

    Bash
    1
    git push origin
    

注意, 此方案只适用于多个远程仓库的代码完全一致的情况

因为我们只是给 origin 添加了多个 URL

虽然效果上看起来是推送到了多个仓库, 但是实际上只是推送到了一个仓库