工作区:电脑里能看到的目录。
暂存区:工作区有一个隐藏目录.git,是Git的版本库,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
仓库:远程服务器中的项目。
git版本控制一般有两个命令 reset 和 revert。reset 代表将当前节点“销毁”(回退,节点还存在),就像不存在一样;revert 代表创建一个新的节点,其中记录我要删除当前节点。其中reset 中有 三个参数需要注意:
--mixed 默认参数,重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
--soft 回退到某个版本。
--hard 撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。
对文件做了修改,现在需要撤销修改:
git restore <文件名>
或者
git checkout -- 文件名
如果文件已经add,但还没commit,可以使用以下命令,撤销add,恢复到上一步状态:
"git restore --staged <file>
或者
git reset HEAD 文件名
如果已经commit,需要删除文件,
1、被提交到仓库的某个文件需要删除,可以使用 git rm 命令:
git rm <file>
git commit -m ""
2、如果只想从暂存区删除文件,本地工作区不做出改变,可以:
git rm --cached <file>
一般 master 分支用于发布版本,开发都是其他他分支上进行,也会存在一些 bugFix 分支,feature 分支用于开发未来的功能。创建分支有以下三种命令:
git branch 分支名
git checkout -b 分支名
git switch -c 分支名
git branch -d 分支名
分支管理一般基于三个命令进行,分别未 merge、rebase、cherry-pick
merge的合并方式默认是 fast-forward,即将master 指针直接指向当前节点。例如我们创建 readme.txt 文件,并且add 和 commit,此时创建分支 dev , 此时git 的 graph 如下;
git switch -c dev
我们对readme.txt 文件做修改,并切换到 master 分支,使用 git merge dev 命令,git 的graph 如下:
可以看到 git 并没有创建新的节点,而是将 master 指针快速移动到了dev分支,如果要保存开发记录,我们可以显示禁用掉 fas-forward 模式 ,即在merge 后加上参数 --no-ff
git merge --no-ff -m "说明文字" 分支名
此时,git的graph如下,可以看到,git创建了一个新的节点,继承了dev分支。
rebase比较有意思,翻译成中文名叫”变基“,我个人把他理解成剪切,就像 ctrl + x 一样,将当前分支黏贴到目标分支。这是原始的 graph。
我们使用以下命令:
git switch Feature
git rebase master
可以,看到feature分支接到了master后面。需要注意的是,rebase 提供了 -i 参数,是”剪切”变得更加灵活,可以自己尝试一下。那么 rebase 和 merge 的区别在哪里?
假如master和feature开发了不同的功能,即两个分支没有文件冲突,和3.2.1的情况不一样(dev分支继承在master分支),此时我们执行命令:
git switch master
git merge feature
这个命令就比较简单了,他就相当于复制节点到当前分支。
需要注意的是我们在合并前都需要git commit 将暂存区的内容提交到分支中。
分支可以移动,当一个节点打上标签后这个标签就在这个节点上,不会移动。那么我们只需要记住一些命令就好了:
#创建标签
git tag 标签名 commit_id
#指定标签信息
git tag -a <tagname> -m "blablabla..."
#删除标签
git tag -d 标签名
#推送某个标签到远程
git push origin xxxx
#删除远程标签,需要首先删除本地标签
git tag -d 标签名
git push origin :refs/tags/标签名
如果要与远程仓库交互,就需要用到这三个命令,其中 pull 是 fetch 和 merge 的结合。
fetch 是从远程仓库抓取 origin/master 节点,
git fetch origin/[branch]
git pull <远程主机名> <远程分支名>:<本地分支名>
将本地仓库推送到远程仓库,
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
删除远程仓库分支
git push origin --delete master
git push origin :分支名
追踪远程分支:
git checkout -b 本地分支 远程分支
git branch -u 远程分支 本地分支
显示分支图
git log --graph --pretty=oneline --abbrev-commit
git remote remove origin