Git学习

学习网站:learngitbranching

主要部分

Git Commit



执行git commit以后,修改了代码库,并把这些修改保存成了一个提交记录 C2。C2 的父节点是 C1

Git Branch



执行git branch newImage, 新创建的分支 newImage 指向的是提交记录 C1

在上面的状态之上执行git commit以后:

由于当前所在的分支是main而不是newImage,所以main分支前进了,而newImage没有变化。


执行git checkout newImage;git commit 进行切换分支,然后提交

Git Merge


执行git merge bugFix,将bugFix合并到当前main分支

main 现在指向了一个拥有两个父节点的提交记录。假如从 main 开始沿着箭头向上看,在到达起点的路上会经过所有的提交记录。这意味着 main 包含了对代码库的所有修改。
对于:

再把 main 分支合并到 bugFix

因为 main 继承自 bugFix,Git 什么都不用做,只是简单地把 bugFix 移动到 main 所指向的那个提交记录。
现在所有提交记录的颜色都一样了,这表明每一个分支都包含了代码库的所有修改。

Git Rebase

对于

我们想要把 bugFix 分支里的工作直接移到 main 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。
执行git rebase main

现在 bugFix 分支上的工作在 main 的最顶端,同时我们也得到了一个更线性的提交序列。
注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 main 分支上的 C3 的副本。
现在唯一的问题就是 main 还没有更新

先切换到main上,执行git rebase bugFix,把它 rebase 到 bugFix 分支

在提交树上移动

HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。
对于:

HEAD -> main -> C1
执行git checkout C1以后,HEAD -> C1

相对引用

对于

执行git checkout main^,来移动HEAD到main的父节点

当然,HEAD^也可以作为当前HEAD的父节点的引用。

“~”操作符

使用“~”操作符可以移动多次

使用git branch -f main HEAD~3命令可以将main 分支强制指向 HEAD 的第 3 级父提交。

撤销变更

主要有两种方法用来撤销变更 —— 一是 git reset,还有就是 git revert
对于:

执行git reset HEAD~1

Git 把 main 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。(在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。)
为了撤销更改并分享给别人,我们需要使用 git revert.
对于
执行git revert HEAD以后

要撤销的提交记录后面多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。
revert 之后就可以把更改推送到远程仓库与别人分享。

整理提交记录

对于

执行git cherry-pick c2 c4,将c2和c4分支中的提交记录复制到 main分支中

交互式的 rebase

使用git rebase -i 命令

远程仓库

这里用o做为origin的简写
对于

执行 git checkout origin/main;git commit

Git 变成了分离 HEAD 状态,当添加新的提交时 o/main 也不会更新。这是因为 o/main 只有在远程仓库中相应的分支更新了以后才会更新。

Git Fetch

对于

执行 git fetch

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

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

git fetch 实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。
如果你还记得上一节课程中我们说过的,远程分支反映了远程仓库在你最后一次与它通信时的状态,git fetch 就是你与远程仓库通信的方式了!
git fetch 通常通过互联网(使用 http:// 或 git:// 协议) 与远程仓库通信。

git fetch 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你磁盘上的文件。
理解这一点很重要,因为许多开发人员误以为执行了 git fetch 以后,他们本地仓库就与远程仓库同步了。它可能已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改你本地的文件。
所以, 你可以将 git fetch 的理解为单纯的下载操作。

Git Pull

对于

执行git fetch;git merge o/main

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

Git Push


git push

对于远程仓库已经修改

执行git fetch;git rebase o/main;git push

对于

如果用merge替换rebase:git fetch;git merge o/main;git push


使用简化的命令:git pull --rebase;git push

远程服务器拒绝!(Remote Rejected)

对于
执行
git reset --hard o/main
git checkout -b feature C2
git push origin feature

快速更新main分支并推送到远程仓库

执行git pull --rebase; git push

posted @ 2020-09-29 16:38  机器狗mo  阅读(133)  评论(0编辑  收藏  举报