Git 版本控制器 学习笔记

发布时间 2023-08-30 19:28:17作者: zz子木zz

git commit 当前*的分支提交记录

git branch <brachname> <ref> 建立分支
>git branch newImage
<ref>不填的话,就会在当前HEAD处或*处创建分支

git checkout 切换分支
>git checkout newImage

git checkout -b <your-branch-name> 建立并切换到分支
>git checkout -b newImage

git merge 分支合并
---------------------
情况1 bugFix和main无继承关系,mian为*
>git merge bugFix
>会产生一个新提交记录节点
情况2 main继承于bugFix,bugFix为*
>git merge main
不会产生新节点,会直接把bufFix分支移动到main分支处

git rebase 线性合并分支
---------------------
情况1 bugFix和main无继承关系,bugFix为*
>git rebase main
会复制bugFix上面的一连串节点,直接来到main的下面
>节点会加上小引号,如 C2', C3'
情况2 bugFix继承自main,main为*
>git rebase bugFix
main分支会直接移动到bugFix分支处

引用
--------------
HEAD 对当前所在分支的引用
总是指向当前分支上最新的一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
main + HEAD = main*
-----------------

git checkout <提交记录节点> 分离HEAD
>git checkout C1

<相对引用>
--------------
git checkout <分支名 | 节点名>^ 向上移动 1 个提交记录节点
git checkout <分支名 | 节点名>~<num> 向上移动<num>个提交记录节点
(不写<num>的话,默认为1)
------------------------
注意,移动的都是HEAD(哪怕使用 <分支名>进行移动)

git branch -f main HEAD~3 强制修改分支位置
上面的命令会将 main 分支强制指向 HEAD 的第 3 级 parent 提交。

git branch -f main C1 强制修改分支位置
上面的命令会将 main 分支移动到C1节点
-----
甚至能向下移动到还没有存在的节点(没存在就会先自动创建节点)

git reset 记录回退(local,对大家共享的远程分支无效)
>git reset HEAD~1
Git 把 main 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。
--
ps: 用节点ID也可以, 会实现节点移动的效果
> git reset C1
和 git branch -f main C1不一样的是,reset不是移动,而是会把之前的更改都撤销

git revert 撤销更改(对远程也有效)
>git revert HEAD
奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' (不会生成C3,而是生成C2')引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。
revert 之后就可以把你的更改推送到远程仓库与别人分享啦。
--
ps:用节点ID也可以

git cherry-pick <节点号> <节点号> 自由的抓取和组合节点
要在心里牢记 cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上
>git cherry-pick C2 C4
我们只需要提交记录 C2 和 C4,所以 Git 就将被它们抓过来放到当前分支(*分支)下,
产生副本C2', C4',并且将当前的main*移动到C4'

交互式rebase
> git rebase -i <ref>
<ref>是当前(*)节点或者(HEAD)节点及其他向上关联的节点要去嫁接去的节点
----
git rebase -i HEAD~4
Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录。
会出现一个交互对话框。对提交记录做个排序(当然你也可以删除某些提交),点击确定看结果
Git 会严格按照你在对话框中指定的方式进行复制。
--
ps:复制的节点带引号,如C2', C5'; 并且(*分支)会出现在最下方的节点处

git commit --amend 原地修改提交
看起来本质上就是生成了新的commit,替代了上一次commit的位置
新的节点是并列的,并且会增加一个(')
如 C2 --> C2'

git tag <标签名> <节点名 | 分支名> 打标签

git describe <ref> 输出离你最近的标签
<ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会使用你目前所在的位置(HEAD)
git describe main 会输出:
v1_2_gC2
git describe side 会输出:
v2_1_gC4


--------------------远程------------------
git clone 在本地创建一个远程仓库的拷贝
> git clone

<remote name>/<branch name> 远程分支
>o/main
远程分支反映了远程仓库(在你上次和它通信时)的状态
远程分支有一个特别的属性,在你切换到远程分支时,自动进入分离 HEAD 状态。

git fetch
>从远程仓库下载本地仓库中缺失的提交记录
>更新远程分支指针(如 o/main)

git pull
>git fetch + git merge o/main

git pull --rebase
>git fetch + git rebase o/main
优点:
>Rebase 使你的提交树变得很干净, 所有的提交都在一条线上
缺点:
>Rebase 修改了提交树的历史

git push 发布成果
>上传记录
>远程的分支将会被更新
>本地的远程分支(如:o/main)也将被更新
>有时候本地记录和远程记录不一致,会导致无法git push,这个时候需要 git pull(或者git pull --rebase)一下
在本地合并远程记录后,即可git push

被锁定的main
>有些远程仓库会锁定main,勿让本地仓库的main* 进行 git push来更新记录
>这种情况可以再本地创建新的分支,提交记录,然后git push
>别忘记移动本地仓库的main使其与远程仓库的main一致,否则你的队友可能会爆炸

跟踪远程分支
--
方法1
>git checkout -b totallyNotMain o/main
就可以创建一个名为 totallyNotMain 的分支,它跟踪远程分支 o/main。
--
方法2
>git branch -u o/main foo
这样 foo 就会跟踪 o/main 了。如果当前就在 foo 分支上, 还可以省略 foo
>>git branch -u o/main
------
ps: 如果先 git checkout -b side
然后 git commit
不经过跟踪远程分支,直接git push会发生什么?
没错,会出现 o/side 的远程分支


git push <remote> <place> 指定提交记录的来源和去向
----
<remote> 远程仓库
<place> 要追踪的本地分支
---
> git push origin main
切到本地仓库中的“main”分支,获取所有的提交,再到远程仓库“origin”中找到“main”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。
我们通过“place”参数来告诉 Git 提交记录来自于 main, 要推送到远程仓库中的 main。它实际就是要同步的两个仓库的位置。
--
ps: 注意,远程仓库只会更新和place有关的提交路径(只更新必要路径)

 

git push <remote> <source>:<destination> 指定独立的来源和目的地
--
<source> 本地仓库中的提交记录的位置
<destination> 要提交到远程仓库中的分支的名字(没有就会自动创建)
>git push origin foo^:main
Git 将 foo^ 解析为一个位置,上传所有未被包含到远程仓库里 main 分支中的提交记录。
>git push origin main:newBranch
如果你要推送到的目的分支不存在会怎么样呢?没问题!Git 会在远程仓库中根据你提供的名称帮你创建这个分支!


git fetch <remote> <place>
> git fetch origin foo

Git 会到远程仓库的 foo 分支上,然后获取所有本地不存在的提交,放到本地的 o/foo 上
然后更新本地的o/foo远程指针
(注意,本地更新的是o/foo)


git fetch <remote> <source>:<destination>
> <source> 现在指的是远程仓库中的位置,而 <destination> 才是要放置提交的本地仓库的位置。
> 不过,你不能在当前切换的分支上干这个事,但是其它分支是可以的。
--
> git fetch origin foo~1:bar
Git 将 foo~1 解析成一个 origin 仓库的位置,然后将那些提交记录下载到了本地的 bar 分支(一个本地分支)上。s
注意:本地更新的是bar而不是o/bar
ps: 本地没用bar的话就会自动在本地创建一个bar
--
<destination>在本地没用的话,会自动创建


git fetch <无参数>
--
它会下载所有的提交记录到各个远程分支……(o/main, o/foo, o/side)

<source>为空:
--
git push origin :side 删除远程分支
> git push origin :foo
如果 push 空 到远程仓库会如何呢?它会删除远程仓库中的foo分支!

git fetch origin :bugFix 创建本地分支
>git fetch origin :bar
如果 fetch 空 到本地,会在本地创建一个新的bar分支

git pull 参数
> git fetch 参数 + git merge
>git pull origin foo
即:git fetch origin foo; git merge o/foo
>git pull origin bar~1:bugFix
git fetch origin bar~1:bugFix; git merge bugFix

 

 

学习时间:2023.8.22, 2023.8.23, 2023.8.30

 学习网站:https://learngitbranching.js.org/?locale=zh_CN

 

学习网站2:

https://github.com/git-guides