Git
本文最后更新于88 天前,其中的信息可能已经过时,如有错误请发送邮件到3095478042@qq.com

一、Git 的基础知识

1.git主要命令


git commit-提交

创建一个新的提交对象,创建项目历史中的一个节点

  • git commit --amend:修改最新的提交

git branch-分支

用于创建、列出、重命名和删除分支

  • git branch:列出所有本地分支,当前分支前会有一个 * 号
  • git branch <name>创建一个名为 <name> 的新分支(基于当前提交)。
  • git checkout <name> 或 git switch <name>切换到指定分支
  • git branch -d <name>:删除一个已合并的分支。
  • git branch -D <name>:强制删除一个分支(即使它还没有被合并)。
  • git checkout -b <new-name>或 :git switch -c <new-name> 创建并立即切换到新分支。
HEAD 指针

这是一个特殊的指针,它指向你当前所在的分支(也就是当前的工作目录状态)。当你切换分支时,HEAD 会指向新的分支。

git merge-合并

合并指定分支到当前分支,分支的历史合并在一起。它会创建一个新的合并提交(merge commit)

两种合并方式:

  • Fast-Forward(快进合并): 如果目标分支(如 main)自分支创建以来没有新的提交,Git 会简单地将分支指针向前移动,指向源分支(如 feature/login)的最新提交。不会创建额外的合并提交。
    • 如何避免快进合并? 使用 git merge --no-ff,这会强制创建一个合并提交,即使可以快进。这能更好地保留历史信息。
  • 3-Way Merge(三方合并): 如果目标分支有了新的提交,Git 会创建一个新的合并提交,这个提交有两个父提交(一个是 main 的最新提交,一个是 feature/login 的最新提交)

git merge bugFix
bugFix分支的更改和 main 分支自它们分叉点之后的所有更改合并起来

git rebase-变基

变基。它可以将一个分支上的所有提交“复制”到另一个分支的顶端,从而重写项目历史,让提交历史更线性

git rebase main

2.HEAD

HEAD 是 Git 中一个特殊的指针

  • 一般情况下,HEAD 间接地通过指向一个分支来工作,而并不直接指向一个提交
  • 分离 HEAD 状态是指 HEAD 指针直接指向某个具体的提交,而不是指向一个分支
    • 通过 git checkout <提交哈希>,让 HEAD 直接指向某个提交(移动的是HEAD),此时提交历史可独立延伸(但需注意:新提交若不关联分支,可能丢失)

git checkout c1

3.相对引用

  1. ^(向上移动一代,并选择不同的父提交)
    • git checkout HEAD^
    • 快速移动HEAD或分支指针
  2. ~<n>(向上移动 n 代)
    • git checkout HEAD~3
    • 将引用向上移动 n 代,沿着第一个父提交一直回溯。这是在一条直线上向后移动的最常用方法
  • git branch -f <branch> <commit> 是一个强大的命令,用于强制移动一个已存在分支的指针到指定的提交。
    • git branch -f main HEAD~3将 main 分支强制指向 HEAD 的第 3 级 parent 提交
    • 它是一个重写历史的命令,具有破坏性,会丢弃目标分支上原有的最新提交。

git branch -f main c6

4.撤销变更

  • git reset 通过把分支记录回退几个提交记录来实现撤销改动(会丢失历史,适合本地未推送的提交)
    • 语法:git reset <提交哈希>(默认 --mixed,移动指针 + 保留工作区修改);git reset --hard <提交哈希>(强制回退,丢弃修改)

git reset HEAD~1
  • git revert:创建新提交 “抵消” 旧提交的修改(安全,保留历史,适合已推送的提交)。
    • 语法:git revert <提交哈希>(生成新提交,反转旧提交的修改)

git revert HEAD
新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。

二、移动提交记录

1.整理提交记录(cherry-pick

  • git cherry-pick
    • 复制指定提交到当前分支,生成新提交(哈希不同,但内容一致)
    • 语法git cherry-pick <提交哈希>,可连续挑选多个提交。

git cherry-pick c2 c4

2.交互式的 rebase(变基)

  • git rebase -i
    • 作用:在变基过程中,手动编辑提交历史(如删除、合并、重排、修改提交说明),
  • 流程:
    1. 执行 git rebase -i <目标提交>,进入交互界面。
    2. 通过编辑指令(drop/squash/pickreword等)调整提交。(沙盒中通过鼠标拖动调整顺序,点击删除)
    3. 保存退出后,Git 按指令重写提交历史。

 git rebase -i HEAD~4
可以在这个选项中删除或者移动历史提交

三、Git 技术、技巧与贴士大集合

1、本地栈式提交(只取一个提交记录)

  1. 利用cherry-pick
    • git checkout main
    • git cherry-pick C4
  2. 利用rebase -i
    • git rebase -i c1
      • Drop/Omit:丢弃该提交,选择c2,c3
    • git branch -f main c4'

2、提交的技巧 #1(rebase)

  • git rebase -i HEAD~2
  • git commit --amend
  • git rebase -i HEAD~2
  • git branch -f main c3''
git commit --amend

修改最新的提交,


3、提交的技巧 #2(cherry-pick

  • git checkout main
  • git cherry-pick c2
  • git commit --amend
  • git cherry-pick c3

4、Git Tags(标签)

是用于标记特定提交的引用,通常用于标记发布版本(如 v1.0, v2.0等)

  • git tag v1 c1

5、Git Describe

用来描述离你最近的标签

  • ​​语法:git describe <ref>
    • <ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会使用你目前所在的位置(HEAD
  • 输出结果:<tag>_<numCommits>_g<hash>
    • tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
  • git describe main 会输出:
    • v1_2_gC2

  • git describe side 会输出:
    • v2_1_gC4


四、高级话题

1、多分支 rebase

  • git rebase main bugFix
  • git rebase bugFix side
  • git rebase side another
  • git branch -f main c7'

2、选择 parent 提交记录

  • git checkout main^2
  • git checkout HEAD~^2~2
    • =
  • git checkout HEAD;git checkout HEAD^2;git checkout HEAD~2
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇