Learning Git Branching 题解(基础、高级、Git远程仓库)

  • Post author:
  • Post category:其他


官网:

Learning Git Branch



主要



基础篇



Git Commit

在这里插入图片描述

在当前节点是main的时候

git commit
git commit



Git Branch

git branch bugFix

在这里插入图片描述

git checkout bugFix

过关!



Git Merge

在这里插入图片描述

git branch bugFix;
git commit
git checkout main
git commit

在这里插入图片描述

git merge bugFix

这条指令会让指定分支合并到当前分支(新开一个节点)

在这里插入图片描述



Git Rebase

在这里插入图片描述

根据之前的操作,可以很容易到达此阶段

接下来

git rebase main

在这里插入图片描述



高级篇



分离 HEAD

HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。

如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向。

分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。HEAD 总是指向当前分支上最近一次提交记录。

在这里插入图片描述

git checkout C4

在这里插入图片描述



相对引用(^)

利用hash值很不方便(虽然只需要输入前几位)

使用相对位置,^可以向上移动一个提交记录,^^就是两个

在这里插入图片描述

git checkout C4^

在这里插入图片描述



相对引用2(~)

~<num> 可以向上移动num个提交记录

例如:

git branch -f main HEAD~3

这种是强制main指向HEAD向上第三个节点

在这里插入图片描述

C6需要有(最底部的无法用^和~),所以先分离HEAD到C6

git checkout C6

在这里插入图片描述

接下来就是置换位置了

git branch -f main HEAD
git checkout C1
git branch -f bugFix HEAD~1

在这里插入图片描述



撤销变更

  • git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。本地代码库根本就不知道有原先的提交。这种对于远程分支是无效的。
  • git revert,撤销更改并分享给别人。新提交记录有个’号,代表引入了更改,这些更改刚好是用来撤销上个提交的。这种是为远程分支服务的。

在这里插入图片描述

git reset main

在这里插入图片描述

git checkout pushed
git revert C2

在这里插入图片描述



远程



Push & Pull —— Git 远程仓库!



Git Clone

在这里插入图片描述

git clone

在这里插入图片描述



远程分支

git clone之后,我们的本地仓库多了一个名为 o/main 的分支, 这种类型的分支就叫远程分支。远程分支反映了远程仓库(在你上次和它通信时)的状态。在你检出时自动进入分离 HEAD 状态

<remote name(远程仓库名)>/<branch name(分支名)>

远程仓库名默认是:origin(git clone某个仓库时,自动将远程仓库的名称设置为 origin)

在这里插入图片描述

git commit
git checkout o/main
git commit

在这里插入图片描述

最后一次commit的时候,HEAD分离出来了。o/main 只有在远程仓库中相应的分支更新了以后才会更新。



Git Fetch

fetch:获取

git fetch 完成了仅有的但是很重要的两步:

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

远程分支反映了远程仓库在你最后一次与它通信时的状态,git fetch 就是你与远程仓库通信的方式了。git fetch 通常通过互联网(使用 http:// 或 git:// 协议) 与远程仓库通信。

git fetch 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你磁盘上的文件。可以将 git fetch 的理解为单纯的下载操作(并没有修改你本地的文件)。

在这里插入图片描述

git fetch

在这里插入图片描述

全部自动下载



Git Pull

先抓取更新再合并到本地分支这个流程很常用,直接用git pull就可以。git pull 就是 git fetch 和 git merge 的缩写!

在这里插入图片描述

git pull

在这里插入图片描述



模拟团队合作

团队的协作会让远程仓库发生变化

这里给出假指令:

git fakeTeamwork <branch_name> <num> 

在这里插入图片描述

git clone

在这里插入图片描述

git fakeTeamwork main 2

在这里插入图片描述

这时候你要和团队跟进进度

git fetch
git commit
git merge o/main

在这里插入图片描述

虽然也可以,但是指令数太多,可以将fetch和merge合并为pull

git fetch
git pull



Git Push

git push 与 git pull相反,是一种成果的发布

变更上传到指定的远程仓库,并在远程仓库上合并新提交记录

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

在这里插入图片描述

git commit
git commit
git push

在这里插入图片描述



偏离的提交历史

在你提交之前别人就已经提交了,这时候要使工作基于最新的远程分支。有许多方法做到这一点

  • 最直接的方法就是通过 rebase 调整工作,用 rebase 可以将我们的工作移动到最新的提交记录下。(git fetch + git rebase + git push)
  • 更新了本地仓库中的远程分支,然后合并了新变更到我们的本地分支(为了包含远程仓库的变更),最后我们用 git push 把工作推送到远程仓库。 (git fetch + git merge + git push)

如果指令多,可以用 git pull(就是 fetch 和 merge 的简写),类似的 git pull –rebase 就是 fetch 和 rebase 的简写。

所以两种方案就变成了:

  • git pull –rebase + git push
  • git pull + git push

在这里插入图片描述

git clone

在这里插入图片描述

git fakeTeamwork
git commit

在这里插入图片描述

这就到了一个两难的境地。(偏离的提交历史)

git pull --rebase
git push

在这里插入图片描述



锁定的Main(Locked Main)

push之后报错

! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)

原因是main是团队锁定了,应该按照流程,新建一个分支,推送(push)这个分支并申请pull request。

新建一个分支feature,推送到远程服务器,然后reset你的main分支和远程服务器保持一致,否则下次你pull并且他人的提交和你冲突的时候就会有问题。

在这里插入图片描述

git reset --hard o/main

–hard是直接指定

我们也可以用

git reset HEAD^

在这里插入图片描述

git checkout -b feature C2

-b 参数是创建并切换分支,刚好把C2这个引用(也就是我们之前修改但是不能提交的代码)重新使用起来。

在这里插入图片描述

git push origin feature

简单点就是

git push

在这里插入图片描述



版权声明:本文为GDUT_xin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。