Git Learning Notes from 廖老大!


简介

Git是目前世界上最先进的分布式版本控制系统

入门

推荐一个个人认为讲得很不错链接吧
该讲师以类比于Tesla汽车公司的方式,给大家解释git的使用方法,以及GitHub的平台逻辑
https://www.bilibili.com/video/BV1wW41167wR?t=478

诞生

BitKeepe
Git –基于C

集中式 与 分布式

  • 集中式:
    需先从中央服务器获得最新版本,改后交由服务器整合。—-联网工作
  • 分布式:
    每个人的电脑上都是一个完整的版本库,各个电脑可相互推送修改内容。—-不必联网

所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的详细变化,Microsoft的Word格式是二进制格式

Git安装

  1. 官网下载https://git-scm.com/downloads
    已安装可通过Git本身获得最新的开发版本
    git clone https://github.com/git/git
  2. 设置 -指定仓库的用户名和Email地址
    git config --global user.name "Your Name"
    git config --global user.email "email@example.com"

创建版本库(仓库)

  • 创建目录
  • 初始化git

git init

  • 添加 readme.txt 文件到git仓库
    1
    2
    3
    4
    git add file1  //git命令必须在git仓库目录中运行
    git add file2 //add 文件时改文件必须在当前目录存在
    ... //可以一次提交多个文件
    git commit -m "有意义的提交说明"

    注意不要使用记事本编写!!!!不要使用记事本编写!!!!不要使用记事本编写!!!! 安装notepad++

实时掌握工作区状态

1
2
3
4
5
git status //显示当前工作区的更改状态(判定是否有差异 差异对象目前不懂)
git diff //若存在差异,则可通过命令查看具体的差异 可指定commit_id
git add file1 //提交修改记录
git commit -m "修改说明"

版本更替

  1. 查看
  • git log [–graph] (该参数可查看分支合并图)

    星号表示一个commit, 注意不要管*在哪一条主线上
    |表示分支前进
    /表示分叉
    \表示合入

  • 查看从当前版本开始最近到最远的提交记录

  • 记录commit_id版本号

    id:SHA1计算出来的一个非常大的数字,用十六进制表示,用于区分不同commit版本

  1. 回溯

git reset –hard commit_id (绝对)
git reset –hard head^ (相对)

  • 相对head指针指向的版本 ^个数为相对于当前head指向版本的上..版本
  • head~100 相当于 head^^^^(100个)
  1. 未来
  • git reflog
  • 查看所有commit版本历史 确定即将更替版本的版本号

4.20

工作区与暂存区

工作区(本地)

用户可视的目录

版本库

.git隐藏文件为版本库

暂存区 stage

git add filename 指令将文件修改添加到暂存区中

master分支

git commit -m “说明” 将暂存区中的提交记录一并提交至master分支中

  • 注意是将暂存区的修改记录提交,若进行了第二次更改未添加至暂存区,则无法直接与第一次修改一并提交至master分支中

指向master分支的head指针

git diff 总结

git diff查看工作区和暂存区差异

git diff –cached查看暂存区和仓库差异

git diff HEAD 查看工作区和仓库的差异

– filename 可指定查看具体文件在不同区的差异 有空格呢

撤销修改

git checkout – filename 撤销工作区的修改 实际上是使用版本库最新版本替代工作区版本
git reset head filename 撤销暂存区的修改
git reset –head commit_id(head) 版本回退 撤销已提交但未推送到远程库的修改

删除文件

git rm filename

git checkout – filename 对于已经提交的文件,误删后可恢复
从来没有被添加到版本库就被删除的文件,是无法恢复的!


4.21

远程库

关联远程库

git remote add origin [http|ssh秘钥]

要关联一个远程库,使用命令git remote add origin [http|ssh秘钥]
或者在.git目录下 config文件中直接修改url为[http|ssh秘钥]即可
关联一个远程库时必须给远程库指定一个名字,origin是默认习惯命名

推送分支至远程库

git push origin master

关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后通过git push origin master推送最新修改;

查看远程库信息

git remote -v

“删除”远程库

git remote rm name

此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。

克隆远程库

git clone [http|ssh秘钥]

待更新


4.22

分支管理

查看分支:git branch [-a] -a参数可查看远程分支

创建分支:git branch

切换分支:git checkout 或者git switch

创建+切换分支:git checkout -b 或者git switch -c

合并某分支到当前分支:git merge 快速合并

  • 合并冲突

  • 手动解决冲突文件后重新add后提交

删除分支:git branch -d

删除远程分支:git push origin –delete dev

强行删除未被合并的分支: git branch -D


4.29

分支管理补充

对于所有的分支而言,工作区与暂存区是公共的,所以在其他分支作的更改但是未add,commit的内容同样会在其他分支中呈现

分支管理策略

合并分支

  • Git默认Fast forward模式,删除分支后,会丢掉分支信息(其他分支的commit信息将丢失)

  • 强制禁用Fast forward模式,添加–no-ff参数,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

  • git merge --no-ff -m "merge with no-ff" dev


4.30

BUG分支

Untracked files (未被追踪的文件): 从未add到暂存区的文件
Changes not staged:已被add到暂存区但是最新更改未add

原则: commit的内容应该是当前版本的较完善版本,未完善的存在bug的内容不应该commit,否则即使最新commit修改了之前bug,但是用户仍可以通过log访问到未完善版本。

修改BUG: 创建bug分支,修改bug后,合并到主分支即可

注意: 如果当前正在其他分支工作,突然需要修改紧急bug,需要切换到master分支修改bug,并先提交修改bug后的版本(不应包含当前工作分支的内容),但是本地工作区与暂存区为所有分支共享,如果当前分支所作更改不进行add-commit操作,则当前分支所作更改在其他分支仍然可见(可见代表其他分支也会不可避免的add-commit当前分支对项目所作的更改),关键是这部分内容不能提交啊(代码太那啥),所以我们可以先把当前分支的更改”藏匿”到缓存堆栈中,这样其他分支尽情提交而看不到本分支修改内容,待master分支修改完bug并commit后,回到本分支取出,继续更改即可。

  • git stash [save ""]

把所有未提交的修改(包括暂存的和非暂存(Changes not staged)的)都保存起来(当前目录就变干净),用于后续恢复当前工作目录。

保存之前确定无Untracked files,因为git stash不能将未被追踪的文件(Untracked file)压栈

  • git stash list
    查看现有stash缓存堆栈内容

  • git stash pop
    将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。

  • git stash apply
    将缓存堆栈中的第一个stash应用到工作目录中,但并不删除stash拷贝

  • git stash drop
    默认删除缓存堆栈中第一个stash

Cherry_pick 与 merge

  • git cherry-pick commit_id
    就是将指定的提交(commit)应用于其他分支,这会在当前分支产生一个新的提交.

代码冲突

  • –continue
    用户解决代码冲突后,将修改的文件重新加入暂存区,第二步执行如下命令,让 Cherry pick 过程继续执行。
    git cherry_pick --continue
  • –abort
    发生代码冲突后,放弃合并,回到操作前的样子。
    git cherry_pick --abort
  • –quit
    发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。
    git cherry_pick --quit

注意:两者均为将新分支更改更新至当前分支,但是merge会将整个分支的文件更新,cherry-pick为将指定提交应用于当前分支


5.1

克隆仓库

  • git clone [http|ssh秘钥]
    整个仓库被克隆包括所有分支,但是最开始只能看到master分支,需要创建远程origin的对应分支到本地,才能看到对应分支

    git switch -c dev origin/dev

如果需要提交最新更改,不要直接使用原作者项目下的秘钥,否则没有操作权限,需要fork到自己仓库下,再clone

推送分支

  • git push origin <branch-name>
    将本地某个分支的更新推送到远程库

抓取分支 建立关联

  • git pull <远程库名> <远程分支名>:<本地分支名>
    取回远程库某个分支的更新,再与本地的指定分支(默认当前分支)合并
  • git pull = git fetch + git merge

    注意: 抓取分支之前,可以先指定本地分支与远程对应分支的链接,建立关联

    git branch --set-upstream-to=origin/dev dev

    关联目的: 如果在本地分支下进行pull 和push操作时 ,便不需要指定远程的分支。

标签

创建标签

发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

  • git tag tagname
    默认给当前分支的最新提交打上标签

  • git tag
    查看所有按字母排序的标签

  • git show tagname
    查看标签的详细信息

  • git tag -a tagname -m “说明文字” commit_id
    为指定commit打上名为tagname的带有说明文字的标签

操作标签

  • 命令git push origin <tagname>可以推送一个本地标签;
  • 命令git push origin --tags可以推送全部未推送过的本地标签;
  • 命令git tag -d <tagname>可以删除一个本地标签;
  • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

经历总结

看大佬都是一两天看完,惭愧哈哈哈,最近社团,考试(考的稀碎),比赛等等实在是抽不出来时间更新笔记了,只能是拿每天零碎的时间更新一下,好在五一放假有更多的自由时间来完善,很舒服啊,总算是结课廖雪峰老师的git了,终于不用再百兆百兆的保存原始项目了!起飞好吧。