本地仓库的 GIT 基本操作,远程仓库的 GIT 操作以及一些实例

可视化练习网站推荐:https://learngitbranching.js.org/

常用 GIT 命令

一. 本地仓库的 GIT 基本操作

git commit

  • 创建 git 的提交记录

  • 相当于将本地内容与 git 上内容(或者说当前版本与仓库中旧版本)对比,将二者差异打包作为一个提交记录

git branch ["分支名"]

  • 创建 git 的分支

  • 指向某个提交记录,基于这个提交记录以及它所有的父提交进行新的工作

  • 按逻辑分解工作到不同分支中会使工作更加轻松,高效

  • git branch (展示目前存在分支,和目前所在分支)

git checkout [-b] <分支名> [标识]

  • 切换分支

  • git checkout -b <分支名> (创建新分支并切换到新分支)

  • git checkout -b <分支名> <标识> (在标识位置创建新分支并切换到新分支)

git merge <分支名>

  • 合并两个分支

  • 将指定分支合并到当前所在分支,将两个分支及其所有历史节点记录都包含进去,产生一个特殊的提交记录

  • 为使两个被合并的分支记录统一,通常会切换到另一分支,再进行一次合并

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 例:新建 "test" 分支,在 "test","main" 分支分别创建一个记录,并将两个分支合并,最终指向 "main" 分支
    git branch test // 默认有 "main" 分支, 创建一个 "test" 分支并切换到 "test" 分支
    git commit // 在 "main" 分支下创建一个提交记录
    git checkout test // 切换到 "test" 分支
    git commit // 在 "test" 分支下创建一个提交记录
    git merge main // 将 "main" 分支合并到 "test" 分支
    git checkout main // 切换到 "main" 分支
    git merge test // 将 "test" 分支合并到 "main" 分支

git rebase [目标分支] <分支名>

  • 取出目标分支(默认当前分支)提交记录,移动至分支名分支,原地留下一个副本分支
1
2
3
4
5
6
7
8
// 例:新建 "test" 分支,将其移至 "main" 分支,并更新 "main" 分支,最终指向 "main" 分支
git branch test // 默认有 "main" 分支, 创建一个 "test" 分支
git commit // 在 "main" 分支下创建一个提交记录
git checkout test // 切换到 "test" 分支
git commit // 在 "test" 分支下创建一个提交记录
git rebase main // 将 "test" 分支移动到 "main" 分支
git checkout main // 切换到 "main" 分支
git rebase test // 更新 "main" 分支(将 "main" 分支移动到 "test" 分支)

二. 远程仓库的 GIT 操作

git clone

  • 拷贝远程仓库的所有内容

  • git clone 后会产生一个远程分支 < remote name > / < branch name > (例(默认分支):origin/master)

  • 远程分支反映了 “远程仓库相应分支,在你上次和它通信时的状态

  • 远程分支在检出时(即处于远程分支上时)自动进入分离 HEAD 状态

    • 这样是为了使我们无法直接在 “远程分支” 上进行操作, 我们必须在别的地方完成工作, 再用远程推送工作成果
    • Git 变成了分离 HEAD 状态,当添加新的提交时 “远程分支” 也不会更新
    • “远程分支” 只有在远程仓库中相应的分支更新了以后才会更新

git fetch

  • 从远程仓库获取数据

  • 所有远程分支将会更新以反映最新的远程仓库,即单独从远程仓库下载本地仓库中缺失的提交记录

  • 本地分支不会更新,即本地仓库状态不会改变 (更新origin/master分支,不更新master分支)

  • git fetch 通常通过互联网(使用 http://git:// 协议) 与远程仓库通信。

当远程分支中有新的提交时,可以像合并本地分支那样来合并远程分支

git cherry-pick <分支名>

  • 拷贝 “分支名” 的单个节点到 “当前所在节点” 下

git rebase <分支名>(前)

  • 取出 “当前所在分支” 的一系列提交记录,移到 “分支名” 分支,原地留下一个副本分支

git merge <分支名>(前)

  • 将 “分支名” 分支合并到 “当前所在分支” , “当前所在分支下” 产生一个新的提交记录

git pull

  • 先抓取更新,再合并到本地分支

  • git pull 会抓取当前分支对应的远程仓库的更新,并合并更新至到本地分支

  • 类似git fetchgit fetch会更新所有分支,git pull只会更新当前分支) 加git merge <远程分支>

    • 例:git fetchgit merge origin/master,此后,当前分支master

git pull --rebase

  • 先抓取更新,再移动当前分支至更新的远程分支

  • git pull --rebase 会抓取当前分支对应的远程仓库的更新,并取出当前分支提交记录,移动至更新的远程分支,原地留下一个副本分支

  • 类似git fetchgit fetch会更新所有分支,git pull只会更新当前分支) 加git rebase <远程分支>

    • 例:git fetchgit rebase origin/master,此后,当前分支master

git push

  • 提交本地更新

  • git push 会将当前分支变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录

  • 将会更新当前分支对应的远程分支

  • git push 不带任何参数时的行为与 Git 的一个名为 push.default 的配置有关。它的默认值取决于使用的 Git 的版本

  • 在项目中进行推送之前,最好检查一下push.default 的配置

1
2
3
4
5
1. git push -f origin master //本地强行覆盖远端,慎用

2. git push -u origin master //将本地的master分支推送到origin主机,同时指定origin为默认主机

3. git push //在 2 后用表示推送默认分支到默认主机

示例

远程仓库和本地仓库都有新的变更
1
2
git fetch --rebase // 远程拉取最新记录,将本地最新记录合并至新分支(git fetch + git rebase <分支名>)
git push
远程服务器拒绝直接推送(push)提交到 main
  • main 被锁定了, 需要一些 Pull Request 流程来合并修改。
1
2
3
4
5
6
7
8
// 新建一个分支feature, 推送到远程服务器
// 然后reset你的main分支和远程服务器保持一致——否则下次你pull并且他人的提交和你冲突的时候就会有问题.

// 方法1:先看当前位置标识C2
git log
git reset o/main
git checkout -b feature C2
git push
本地初始化仓库与远程仓库合并
1
2
3
4
5
6
7
8
9
10
11
git remote add origin <远程仓库地址>     # 与远程仓库建立连接,默认origin
git fetch
git branch --set-upstream-to=origin/main main # 设置上游地址(将远程分支origin/main设为本地分支main的上游)
git rebase
git push

# 输错远程分支名,需要删除远程分支步骤
git branch -a # 查看所有分支
git push origin -d master # 删除远程分支
# git pull 出错,返回
git remote remove <远程分支名> # 取消与远程分支的联系,默认名为origin

本地管理仓库

  • 安装GIT
  • 常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 初始化
git init // 在文件夹下初始化git
git clone <仓库地址> // 克隆仓库
git branch <分支名> // 创建新分支

// 配置用户
git config --global user.email “you@example.com” // 设置用户邮箱
git config --global user.name “Your Name” // 设置用户名

// 配置相关:
1、仓库级别 local 【优先级最高】
2、用户级别 global【优先级次之】
3、系统级别 system【优先级最低】
git config --local -l // 查看(仓库/用户/系统)配置
git config --global -l
git config --system -l

git config -e // 编辑配置文件
git config --local -e // 编辑仓库级别配置文件
git config --global -e // 编辑用户级别配置文件
git config --system -e // 编辑系统级别配置文件

//分支操作
git branch // 查看git分支
git checkout <分支名> // 移动到分支
git checkout -b <分支名> // 创建新分支并移动到此分支
git branch -d <分支名> // 删除分支

// 记录操作
git add <文件路径> // 增加变动到暂存区,例:`.`表示将根目录下所有改动加入暂存区
git commit -m <msg> // 提交记录修改 -m <msg> 表示提交说明
git log // 查看提交记录
git reflog // 查看修改记录

// 回滚操作
git reset [--hard] <标识> // 标识可以是 git log 或 git reflog 中的标识码 例:4e5be9d
// [--hard]:重置索引和工作树。此后对工作树中跟踪文件的任何更改<commit>都将被丢弃(隐藏)。
// 本地常用
git merge <分支名> // 将分支合并到当前分支
git rebase <分支名> // 取出当前分支提交记录,移动至此分支,原地留下一个此分支的副本

END