头(HEAD)HEAD类似一个“指针”,指向当前活动 分支 的 最新版本。
就是在电脑里能看到的项目代码库目录,是我们搬砖的地方,
在这里我们可以新增文件、修改文件内容,或删除文件。
此时的项目代码库目录还是红色的(没有与git关联),未被git跟踪
此时的工作区的代码修改是不能直接保存到本地仓库的,
需要通过 git add(暂存)把整个项目工程提交到暂存区,
这时项目工程就变成绿色的了,就被gti跟踪了,
在暂存区修改的代码内容 只有通过git commit才能将暂存区修改的内容提交到Git本地仓库
用于临时存放文件的修改,
用git add 命令将工作区的项目工程代码保存到暂存区,此时的项目工程就被git跟踪了
在暂存区里未修改的代码文件是绿色的, 修改的代码文件是蓝色的
通过git commit 命令将暂存区的内容正式提交到版本库(本地仓库)。
master 为仓库的默认分支master,HEAD是一个“指针”指向当前分支的最新提交,默认指向最新的master。
通过git push 将本地仓库推送到远程仓库
通过git pull 从服务端仓库文件拉取更新到本地仓库
git常见命令
git branch
列出所有本地分支,加参数-v显示详细列表,
git branch -r
列出所有远程分支
git branch -a
列出所有本地分支和远程分支
git branch -d dev
删除dev分支,-D(大写)强制删除
git checkout -b dev
从当前分支创建并切换到dev分支
git checkout -b feature1 dev
从本地dev分支代码创建一个 feature1分支,
git switch:
专门只是用来实现分支切换。
git switch dev
只是切换到dev分支
git reset:
将已经提交到本地仓库的文件,撤销回退到暂存区(替代checkout的撤销功能。)
git commit -m "first commit"
将暂存区的修改文件提交到本地仓库
git commit -a
直接提交工作区的修改内容到本地仓库
git branch -M "分支名称"
创建本地分支
git remote add origin https://github.com/fmf19870210/FMFNote.git
关联远程git仓库地址
git push -u origin master
一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到
git fetch
命令。
git fetch
命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。远程代码取回到本地并不会合并到你的本地分支里去。git fetch <远程主机名>
git fetch origin
默认情况下,
git fetch
取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。git fetch <远程主机名> <分支名>
//比如,取回origin主机的master分支。
git fetch origin master
先拉取git fetch 某个远程分支的代码,然后再git merge 合并到当前本地分支 或指定的某个本地分支
git pull
命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。git pull <远程主机名> <远程分支名>:<本地分支名>
//比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
git pull origin next:master
git pull origin master:master
git pull origin dev:dev
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin next
git pull origin master
git pull origin dev
git fetch 从远程分支上获取最新版本代码 到本地 ,代码不会合并 merge到当前分支
git pull 从远程分支上拉取最新版本代码 到本地并自动合并 merge到当前分支
git pull =git fetch 和 git merge
update project 会更新项目所有module,但是pull只会更新一个。
git merge dev dev合并到master没有冲突
合并dev到master,注意要先切换到master分支,然后执行git merge dev,master分支上没有修改内容,直接把dev合并到当前分支master。
git merge dev dev合并到master有冲突
把分支dev 8合并到已经修改过内容的分支master 6
有冲突需要人工手动解决 合并到新的分支master 9分支上
为最新的master分支
<<<<<<< HEAD开头的内容就表示是有冲突的部分,需要人工处理,
=======分割线上方是当前分支的内容,下方是被合并分支的变更内容。
标签(Tags)指的是某个分支某个特定时间点的状态,是对某一个提交记录的的固定“指针”引用。一经创建,不可移动,存储在工作区根目录下.git\refs\tags。可以理解为某一次提交(编号)的别名,常用来标记版本。所以发布时,一般都会打一个版本标签,作为该版本的快照,指向对应提交commit。
当项目达到一个关键节点,希望永远记住那个特别的提交快照,你可以使用 git tag给它打上标签。比如我们今天终于完成了V1.1版本的开发、测试,并成功上线了,那就可给今天最后这个提交打一个标签“V1.1”,便于版本管理。
git tag 查看标签列表
git show [tagname] 查看标签信息
git tag [tagname] 创建一个标签
git tag -a v5.1 -m'v5.1版本'
创建标签v5.1.1039,-a指定标签名,-m指定说明文字
git tag -d [tagname] 删除本地标签
git push origin [tagname] 推送某个标签tagname到远程
git push origin --tags 一次性推送全部标签到远程
发现写错了要回退怎么办?看看下面几种后悔指令吧!
修改的内容还没提交到工作区、暂存区,不想要了
使用reset 本地回滚撤销
修改的内容已经提交到工作区、暂存区,不想要了
使用reset、revert本地回滚撤销
先使用reset、revert本地回滚撤销
然后强制推送git push origin -f
git checkout / git checkout [file]
撤销/清除工作区中 所有的修改内容(该修改内容未添加到暂存区),用暂存区替换当前的工作区。
git checkout HEAD / git checkout HEAD [file]
撤销/清除工作区、暂存区的修改内容(已经通过git add 将工作区暂存到了暂存区)
用HEAD指向的当前分支最新版本替换工作区、暂存区的版本
reset是专门用来撤销修改、回退版本的指令,支持的场景比较多,多种撤销姿势,所以参数组合也比较多。简单理解就是移动master分支、HEAD的“指针”地址,理解这一点就基本掌握reset了。
reset有三种模式,对应三种参数:mixed(默认模式)、soft、hard。三种参数的主要区别就是对工作区、暂存区的操作不同。
mixed为默认模式,参数可以省略。
只有hard模式会重置工作区、暂存区,一般用这个模式会多一点。
git reset/git reset HEAD/git reset HEAD [file]
撤销暂存区状态,不影响工作区
git reset [commit]
回退到指定版本,清空暂存区,不影响工作区。
git reset/git reset HEAD/git reset HEAD [file] (HEAD可省略)
撤销暂存区状态,不影响工作区
git reset [commit]
回退到指定版本,清空暂存区,不影响工作区。工作区需要手动git checkout签出
git reset --soft [commit]
移动分支master、HEAD到指定的版本,不影响暂存区、工作区,需手动git checkout签出更新
git reset --hard HEAD
撤销工作区、暂存区的修改,用当前最新版
git reset --hard HEAD~
回退到上一个版本,并重置工作区、暂存区内容。
git reset --hard [commit]
git reset --hard 5f8b961
回退到指定版本,并重置工作区、暂存区内容。
reset案例
git reset --hard v4 或 git reset --hard HEAD~2
回退到版本v4 master、HEAD指针移动到v4。v5、v6就被废弃了。
git reset --hard v6
也可以重新恢复到v6版本 移动master、HEAD的“指针”地址到V6
安全的撤销某一个提交记录,基本原理就是生产一个新的提交,用原提交的逆向操作来完成撤销操作。注意,这不同于reset,reset是回退版本,revert只是用于撤销某一次历史提交,操作是比较安全的。
git revert[commit]
撤销之前的一个提交,
会生成一个新的提交 来完成 撤销之前的一个提交 操作,
案例
git revert v4 -m'撤销对***的修改'
这个提交的指令就是撤销v4版本 v4版本就不存在了
同时更新maser、HEAD“指针”位置,以及工作区内容。
“-m”附加说明”
感谢
我看谁还不懂 Git !(万字长文)