zoukankan      html  css  js  c++  java
  • git笔记整理-learnGitBranching

    声明

    此篇文章内容是本人在 github上寻找到Peter Cottle的项目 https://github.com/pcottle/learnGitBranching.git 中学习git相关命令时所做的笔记,目的是方便复习时查看相关内容。

    大家也可以直接打开下面的链接进行学习

    链接:https://learngitbranching.js.org/?gist_level_id=a84407351f9c9f0cb241&locale=zh_CN

    在此致敬大佬!


    基础篇

    1:Git Commit

    创建一个新的提交记录

    git commit -m "[消息体]"
    

    2:Git Branch

    使用分支的意义:我想基于这个提交以及它所有的父提交进行新的工作。

    显示所有分支

    git branch
    

    创建新的分支

    git branch [branch_name]
    

    创建并切换到新的分支

    git checkout -b [branch_name]
    

    3:合并分支

    3.1:Git Merge

    在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:” 我要把这两个父节点本身以及他们所有的祖先都包含进来。“

    把当前分支与目标分支(branch_name)进行合并,会产生一个新的提交记录,这个记录包含合并之前两个分支的最新记录,然后当前分支指向这个记录。

    git merge [banch_name] 
    

    示例:

    git merge bugFix
    

    3.2:Git Rebase

    Rebase 实际上就是取出一系列的提交记录,”复制“他们,然后再另外一个地方逐个的放下去,

    特点:更加线性,使代码库的提交历史变得异常清晰。

    将当前分支里的工作直接移到目标分支(branch_name)上

    git rebase [branch_name]
    

    git rebase master
    

    高级篇

    1:在提交树上移动

    HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。

    HEAD 总是指向当前分支上最近一次提交记录。

    HEAD 通常情况下是指向分支名的。

    查看HEAD 指向:cat .git/HEAD (如果HEAD指向的是一个引用则可以用:git symbolic-ref HEAD)

    git checkout [objeck_pos]	(切换HEAD指向目标位置(object_pos))
    

    示例:

    git checkout c1
    


    2:相对引用(^,~

    • 使用 ^ 向上移动一个提交记录
    • 使用 ~ 向上移动多个提交记录,如 ~3

    示例:

    git checkout master^	(git checkout master~1)
    


    3:强制修改分支位置

    移动分支到目标位置:

    git branch -f [branch_name] [object_pos]
    

    示例:

    git branch -f bugFix master~3
    

    git branch -f master c6	(c6是提交记录的哈希值,可以通过 git log 命令来查看)
    


    4:撤销变更

    撤销变更:

    • 底层部分(暂存区的独立文件或者片段)

    • 上层部分(变更到底是通过哪种方式被撤销的)组成。

    4.1:Git Reset

    git revert [分支名/记录哈希值/HEAD~<num>]	(只能跟一个参数)
    

    git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

    缺点:只能在本地分支中使用,对远程分支无效

    示例:

    git reset HEAD~1
    

    4.2:Git Revert

    git revert [param1] [param2] ...	(后面可以跟多个参数(分支名/记录哈希值/HEAD~<num>))
    
    • 远程分支上可以使用

    示例1:

    git revert HEAD
    

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

    • revert 之后就可以把你的更改推送到远程仓库与别人分享啦。

    示例2:

    git reset local^
    

    git checkout pushed
    git revert pushed local
    


    移动提交记录

    1:Git Cherry-pick

    将一些提交复制到当前所在的位置(HEAD

    • git cherry-pick <提交号>...

    • git rebase类似

    示例:

    git cherry-pick c2 c4
    

    2:交互式 rebase

    交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i

    如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

    在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。

    特点:不清楚提交记录的哈希值时使用比较方便

    当 rebase UI界面打开时, 你能做3件事:

    • 调整提交记录的顺序(通过鼠标拖放来完成)
    • 删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
    • 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。

    示例:

    git rebase -i HEAD~4
    

    注意!:实际上并不是此画面。

    代码测试:

    $ git log
    commit 1839f3c00d6407c594d6f575872f743eed82195e (HEAD -> master)
    Author: rainMist <------------>		#此处横杠代表我的邮箱
    Date:   Sun Jan 10 23:51:19 2021 +0800
    
        changed the b.html
    
    commit e2ef072ca6121a2ecb2b1f0170ce18f5999fa3fe
    Author: rainMist <------------>		#此处横杠代表我的邮箱
    Date:   Fri Jan 8 22:19:07 2021 +0800
    
        修改代码
    
    commit 6e74ece9436503f52efed4ec99d54bcebc53faaa
    Author: rainMist <------------>		#此处横杠代表我的邮箱
    Date:   Fri Jan 8 12:38:31 2021 +0800
    
        new file b.html
    
    
    $ git rebase -i master~3
    hint: Waiting for your editor to close the file...
    

    执行命令后会打开文件(此处打开notepad++是因为我安装Git时配置的)


    杂项

    1:本低栈式提交

    2:提交的技巧 #1

    示例:

    git rebase -i HEAD~2
    

    git commit --amend
    

    这句命令可以用下面两句代替:

    • git branch caption c2
    • git rebase c3'

    git rebase -i HEAD~2
    

    git branch -f master caption
    


    3:提交的技巧 #2

    主要利用 git cherry-pickgit checkout命令。

    git checkout c1
    

    git cherry-pick c2
    

    git checkout master
    

    git cherry-pick c2 c3
    


    4:Git Tag

    永远指向某个提交记录的标识,不会随着新的提交而移动,也不能检出到某个标签上面进行修改提交

    • git tag [tag_name][record]
    • 第一个参数 - 标签名
    • 第二个参数 -提交记录(即需要标签的位置)

    注意:如果不指定提交记录,Git 会用 HEAD 所指向的位置。


    5:Git Describe

    • 描述离你最近的锚点(也就是标签)

    • Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 git bisect(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时

    语法:

    git describe <ref>
    

    <ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。

    它输出的结果是这样的:

    <tag>_<numCommits>_g<hash>
    

    tag 表示的是离 ref 最近的标签, numCommits 是表示这个 reftag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。

    ref 提交记录上有某个标签时,则只输出标签名称


    高级话题

    1:多分支 rebase

    示例:

    git checkout another
    git rebase side
    

    git rebase bugFix
    

    git rebase master
    

    git branch master another
    


    2:两个父节点

    操作符 ^~ 符一样,后面也可以跟一个数字。

    但是该操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个 父提交
    示例:

    git branch -f bugWork HEAD~^2~
    

    此步相当于以下步骤组合:

    • git branch bugWork #创建分支bugWork
    • git branch -f bugWork HEAD~ #强制移动分支到 c6 提交记录
    • git branch -f bugWork HEAD^2 #强制移动分支到 c6 的第二个父提交 -c5 提交记录
    • git Branch -f bugWork HEAD~ #强制移动分支到 c2 提交记录


    3:纠缠不清的分支

    现在我们的 master 分支是比 onetwothree 要多几个提交。出于某种原因,我们需要把 master 分支上最近的几次提交做不同的调整后,分别添加到各个的分支上。

    one 需要重新排序并删除 C5two 仅需要重排排序,而 three 只需要提交一次。

    git checkout one
    git cherry-pick c4 c3 c2
    

    git checkout two
    git cherry-pick c5 c4 c3 c2
    

    git branch -f three c2
    

    到此结束!

  • 相关阅读:
    多项式学习笔记(二) NTT
    矩阵树定理学习笔记
    拓展BSGS 学习笔记
    P2257 YY的GCD
    P1891 疯狂的lcm
    友链
    关于我
    焚燃指间の回忆
    洛谷P4180
    洛谷P2292
  • 原文地址:https://www.cnblogs.com/code-xu/p/14262963.html
Copyright © 2011-2022 走看看