git基本使用

git

默认情况下,克隆的远程仓库会被命名为 origin

shell 复制代码
git remote remove origin
# 移除默认的远程仓库 origin

git remote add origin https://github.com/CS144/minnow.git
# 添加一个新的远程仓库 origin,指向自己的 GitHub 仓库

git branch -M main
#将当前分支重命名为 main(如果默认分支是 master,这一步会将其改为 main)

git push -u origin main:
# 将本地的 main 分支推送到远程仓库 origin,并设置 origin/main 为上游分支(-u 参数的作用)
# 之后可以直接使用 git push 和 git pull,而不需要指定远程分支

git remote add upstream https://github.com/CS144/minnow.git
# 添加一个新的远程仓库 upstream,指向原始的上游仓库
# 保留与上游仓库的连接,以便后续可以拉取上游的更新

git remote -v
# 查看远程仓库列表

git fetch upstream(前面设置的https://github.com/CS144/minnow.git,将仓库改为upstream名,origin是git clone后默认的名;) branch_name
# 拉取upstream的分支名

git branch -d <branch_name>
# 删除已经合并的本地分支

git branch -D <branch_name>
# 强制删除本地分支

git merge upstream/check1-startercode
# 将上面拉取的upstream/check1-startercode合并到本地分支main中

git 提交

复制代码
A <- B<- C(main)
  1. A是第一次提交;
  2. B是第二次提交;
  3. C是第三次提交;
  4. 当前C是最新一次的提交,所以main分支当前指向了C

git 创建新分支

假设现在 基于main分支创建了一个 新分支 feature:

shell 复制代码
git checkout -b feature
  1. feature 分支也指向提交 C,并且继承了 C 的所有父提交(BA

  2. feature 分支上开始新的工作,比如修改文件并提交:

    复制代码
    A <- B <- C (main)
               \
                D (feature)
  3. 通过创建 feature 分支,可以在不影响 main 分支的情况下进行新的开发

  4. 完成工作后,可以将 feature 分支合并回 main 分支,或者继续在 feature 分支上开发


git 合并分支merge

git merge 命令合并两个分支时,Git 会尝试将两个分支的历史记录整合到一起

假设有以下提交历史:

复制代码
      A <- B <- C (main)
       \
        D <- E (feature)
  1. main 分支的最新提交是 C
  2. feature 分支的最新提交是 E
  3. 它们的共同祖先是提交 A

执行 git merge feature(在 main 分支上合并 feature 分支)时,Git 会创建一个新的合并提交 F

复制代码
      A <- B <- C <- F (main)
       \           /
        D <- E <- (feature)
  1. 合并提交 F 有两个 parent 节点:
    1. 第一个 parent 是 Cmain 分支的最新提交)
    2. 第二个 parent 是 Efeature 分支的最新提交)
  2. 通过 F,Git 可以同时访问 mainfeature 分支的所有历史记录

git rebase

Git 中另一种合并分支的方法;通过"重新定位"提交记录来创造更线性的提交历史

  1. 找到当前分支和目标分支(通常是 main 或 master)的共同祖先

  2. 将当前分支上新增的提交提取出来,保存为临时文件

  3. 将当前分支指向目标分支的最新提交

  4. 将提取的提交逐个重新应用到目标分支的最新提交之后

    复制代码
       A <- B <- C (main)
        \
         D <- E (feature)

Rebase之后:

复制代码
      A <- B <- C <- D' <- E' (feature)
               (main)

使用git checkout <commit-has>可以让HEAD直接指向某个提交记录,从而分离HEAD


^操作符

^ 操作符 用于访问某个提交记录的 父节点

假设:

复制代码
C0 <- C1 <- C2 <- C3 (main)
  1. main 分支的最新提交是 C3

复制代码
   git checkout main^
  1. 此时 HEAD会指向C2

复制代码
   git checkout main^^
  1. 此时,HEAD 会指向 C1

切换分支的父节点

git branch -f main C6

  1. 强制将 main 分支指向提交记录 C6
  2. git branch -f 用于强制移动分支的指向
  3. main 分支移动到提交记录 C6,无论 main 分支之前指向哪里

git checkout HEAD~1

  1. HEAD 移动到当前提交记录的第一个父节点

git branch -f bugFix HEAD~1

  1. 强制将 bugFix 分支指向当前 HEAD 的父节点

reset 和 revert 撤回

假设原始提交链条:

复制代码
C0 <- C1 <- C2 <- C3 (HEAD -> main)

执行 git reset C1后:

复制代码
C0 <- C1 (HEAD -> main)

C2C3 被丢弃(但内容可能保留在工作目录,取决于 reset 的模式)

  1. --soft:仅移动分支指针,保留工作目录和暂存区的修改
  2. --mixed(默认):移动分支指针,并重置暂存区,但保留工作目录的修改
  3. --hard:彻底丢弃所有修改,分支指针、暂存区和工作目录全部回退

git revert:撤销某个提交

假设原始提交链:

复制代码
C0 <- C1 <- C2 <- C3 (HEAD -> main)

执行 git revert C3 后:

复制代码
C0 <- C1 <- C2 <- C3 <- C4 (HEAD -> main)

C4 是一个新提交,内容是撤销 C3 的更改

此时:++C4 的内容与 C2 相同++


git cherry-pick

  1. 复制提交:将某个提交的更改应用到当前分支,生成一个新的提交
  2. 选择性合并:只合并某个分支上的特定提交,而不是整个分支
  3. 将修复 bug 的提交从开发分支应用到生产分支

假设以下提交历史:

复制代码
      C0 <- C1 <- C2 (main)
       \
        C3 <- C4 <- C5 (feature)

现在:将 feature 分支上的提交 C4 应用到 main 分支

复制代码
   git checkout main
复制代码
   git cherry-pick C4
  1. 结果:

    复制代码
       C0 <- C1 <- C2 <- C4' (main)
        \
         C3 <- C4 <- C5 (feature)

    C4'C4 的副本,++内容与 C4 相同,但哈希值不同++


UI交互式变基 Interactive Rebase

Git 中一种高级操作,通过 git rebase -i 命令触发。它允许你以更精细的方式修改提交历史,例如重写、合并、拆分或删除提交

复制代码
git rebase -i <目标提交>

git pull

git pull 就是 git fetch 和 git merge 的缩写


git pull --rebase; git push

如果远程仓库被别人提交了一次,本地的o/main没有更新,就无法push到远程仓库;

此时:

  1. 拉取远程仓库的新更新;
  2. 然后将本地的一次提交,合并后再push
相关推荐
西西偷西瓜3 小时前
Soybean Admin移除git-hooks永久关闭git校验
git·vue
Archie_IT4 小时前
修图自由!自建IOPaint服务器,手机平板随时随地远程调用在线P图
运维·服务器·前端·git·深度学习·npm·conda
Qredsun6 小时前
获取git分支间差异文件列表
git
黑眼圈的小熊猫6 小时前
Git开发
大数据·git·elasticsearch
小镇敲码人12 小时前
【深入浅出 Git】:从入门到精通
git
gqkmiss16 小时前
Git 常用命令集与实际使用 Demo
大数据·git·elasticsearch·git 命令·git 命令大全
yantuguiguziPGJ17 小时前
Windows 下搭建 Git 本地服务器并进行开发
git
程序猿chen21 小时前
安全岗の夺命连环问:(第壹篇)从XSS到0day的灵魂拷问
前端·git·安全·面试·跳槽·xss·改行学it
xujiangyan_1 天前
MySQL的半同步模式
数据库·git·mysql