git学习笔记

675 阅读8分钟

最近公司项目只能在Linux环境提交代码,所以不得不又学习了一下git命令和git。
相关内容大致可分为3个部分:认识git--git的一些概念;上手git--git的一些命令;了解git--git的一些原理。

认识git

什么是git?
git是一个分布式的版本控制系统,“分布式”指的是每个开发者本地都存储了一个版本仓库(.git目录),可基于这个本地版本仓库与远程服务器仓库进行交互。与“分布式”对应的是集中化版本控制系统,如SVN,其中”集中化”是指所有版本记录都存储在中央服务器,客户端本地是基于中央服务器进行版本控制。

git的优缺点:
git(分布式版本控制系统)的优点:每个人可以独立进行版本控制,与远程服务器无关;哪怕服务器挂了每个人本地也有所有历史记录。
git的缺点:几乎无,除了学习成本高一点。
svn(集中化版本控制系统)的优点:便于集中管理,可以看到每个成员的操作,管理员可以轻松掌握每个开发者的权限。
svn缺点:服务器宕机了开发者本地就失去了版本控制的功能,并且万一服务器损坏了就会失去所有的历史版本记录。

学习git命令之前必须要知道哪些概念? space.png 如图,git有几个区域,从右至左依次是:
workspace:工作区
Index/Stage:暂存区
Repository:版本库(或本地仓库)
Remote:远程仓库

一个工程被git管理,会有一个.git文件夹,工作区就是指除了.git文件夹外这个工程的所有目录,而暂存区和版本库则存储在.git文件夹内,远程仓库是指远程服务器仓库。

上手git

因为git在每个本地都有一个版本库,协同工作是本地版本库与远程版本库之间进行交互,所以git命令大致可分为2大块,本地操作相关的和远程操作相关的

本地操作

一. 常用提交代码的命令
git status;查看工作区文件状态
status.png 如图,工作区文件有3种状态:
1.Changes to be committed 文件添加到暂存区未被提交到版本库
2. Changes not staged for commit 文件被修改还未被添加到暂存区
3. Untracked files 文件未被跟踪,也就是未被git管理,一般是新建的文件

git add;将文件从工作区添加到暂存区(git add . 或 git add 文件路径)

git commit -m “提交信息”;将文件从暂存区添加到版本库

git commit -a -m “提交信息”;前2个命令的组合(不能是还未被跟踪的文件)

说明:每次提交后都会生成一个唯一的提交哈希值,对应这次提交的版本,如下图: commitHash.png
除了这几个常用的提交命令外,有时候还需要有其他的操作...

二. 分支
很多时候都需要用到分支,各分支之间可以是独立的,互不影响。
分支,是一个个版本最终存储的位置。
分支,就是一条时间线,每次git commit形成一个个版本,一个个版本依次存储在分支的一个个提交点上。

branch_1.png 仓库中默认有且仅有一个master分支。
新建一个分支,首先是新建一个指针,新分支的指针和当前分支指向同一个提交点,新分支包含的提交点就是从第一个提交点到分支指针指向的提交点。
在git中有一个名为 HEAD 的特别指针,它指向你正在工作中的本地分支的指针,可以将 HEAD 想象为当前分支的别名。

在master分支上新建一个dev分支,如下图: branch_2.png
git branch;查看当前仓库的分支,*是当前所在的分支
git branch 分支名;新建一个分支
git checkout 分支名;切换分支(有坑:本分支的修改有可能被带到切换后的分支,从而产生分支污染)
git checkout -b 分支名;新建并切换到这个分支
git branch -d 分支名;删除分支
git branch -D 分支名;强制删除分支(暂存区未清空或未被合并)
git merge 分支名;把分支合并到当前分支

合并分支有2种情况:
1, 快速合并Fast-forward,不会产生冲突 branch_3.png

branch_4.png 2. 三方合并,有可能产生冲突

branch_5.png

branch_6.png

解决冲突:保留对应的内容并删除掉<<<< ==== >>>>,之后重新add branch_7.png

三. 存储
上面提到在切换分支时有坑,避免这个坑有2种方法:一是提交当前的修改,二是可以使用存储stash:将未提交的修改保存到一个栈上,然后在任何时候重新应用这些修改。
git stash;将修改保存到一个栈
git stash list;查看存储
git stash apply;应用最近的存储
git stash drop 存储名;移除存储
git stash pop; 前2个命令的组合,应用并且移除掉最近的存储

四. 撤销
很多时候都需要撤销修改,或者回退版本。
git checkout 文件名;撤销工作区的修改
git reset 文件名;将文件从暂存区撤回
git commit --amend;修改上一次的提交(会将暂存区的文件重新提交,并且覆盖上一次的提交信息)

“reset三部曲”
假设目前的提交是这样:
reset_1.png

git reset --soft HEAD~数字;只回退HEAD的指向,数字是几就回退几个版本(本质是撤销git commit)
如图:
reset_2.png

git reset --mixed HEAD~数字;回退HEAD指向和暂存区
如图:
reset_3.png

git reset --hard HEAD~数字;回退HEAD,暂存区,和工作目录。(慎用,会覆盖工作目录)
如图:
reset_4.png

说明:以上三个命令中”HEAD~数字”都可替换成提交哈希值

git branch 分支名 提交哈希值;新建一个分支并且指向对应的提交对象(回退版本,比git reset --hard更安全)

git revert;和git reset一样也是从版本库回退,不同的是revert会生成一个反提交记录,而不是像reset一样直接删除提交记录。(比git reset --hard更安全)
git revert HEAD;
git revert 命令只能抵消上一个提交,如果想抵消多个提交,必须在命令行依次指定这些提交。比如,抵消前两个提交,要像下面这样写。
git revert [倒数第一个提交] [倒数第二个提交]
git revert HEAD --no-edit;执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息。
git revert 提交哈希值 ;直接push可回滚远端的提交记录

五. 打tag
打tag是给历史中的某一个提交打上标签,常用标记发布节点(v1.0 等)
git tag;列出所有tag
git tag 标签名;新建tag
git show 标签名;查看特定tag的提交信息
git tag -d 标签名;删除tag
git checkout 标签名;检出标签所指向的文件版本(此时处于分离头指针detached HEAD状态,要修改内容必须新建分支)

六. 其他
git config -–list;查看配置信息
git init;初始化一个git库
git diff;查看文件修改(git diff 文件名;)
git diff --cached;查看已加入暂存的修改
git show 提交哈希值;查看指定的提交内容
git log;查看历史记录
git log --online; 简化版的提交记录
git reflog; HEAD每次改变时的日志
git log --oneline --decorate --graph --all;查看项目分叉历史
git config --global alias.新命令 旧命令;为命令配别名(如git config --global alias.lol “log --oneline --decorate --graph --all”就将上一条命令配置成git lol)

远程操作

多人协同开发时,往往需要与远程仓库之间推送或获取代码 remote1.png

git remote add origin 远程仓库地址;关联远程仓库(origin为远程仓库的别名,也可叫主机名。需要git init)
git clone 远程仓库地址;将远程仓库克隆到本地(不需要git init)
git remote -v;查看远程仓库地址
git push origin 本地分支名:远程分支名;将本地分支推送到远程分支(本地分支和远程分支一般是同名,可简写为git push origin 本地分支名)
git push -u origin 本地分支名;将本地分支推送到同名远程分支,同时指定origin为默认主机,以后就可以不加任何参数执行git push
git push;推送代码
git fetch origin;拉取远端所有的提交分支到本地(clone或者fetch时,并不会直接在本地生成一个与远程分支同名的分支,而是生成一个远程跟踪分支,它们以(remote)/(branch)形式命名,指向远端该分支的引用,远程跟踪分支不可修改,除了master分支会自动跟踪origin/master外,如需跟踪其他远程跟踪分支则要进行下面一个命令的操作)
git checkout -b 本地分支名 远程跟踪分支名;创建一个本地分支并且跟踪远程跟踪分支(也可直接将远程跟踪分支merge到当前分支)
git pull;拉取代码并且合并 (git fetch和git merge的组合命令)
git pull origin 远程分支名:本地分支名
git push origin --delete 远程分支名;删除远程分支
git branch -u 远程跟踪分支名;将当前分支跟踪远程跟踪分支(本地分支只有跟踪到远程跟踪分支才能对应到远程仓库的分支)
git branch -a; 查看拉取到本地的分支列表
git branch -vv; 查看设置的所有跟踪分支

了解git

未完......

参考链接:
www.bilibili.com/video/BV15J…
www.bilibili.com/video/BV1Mf…
www.ruanyifeng.com/blog/2014/0…