- git是分布式管理工具
- 集中式:需要用中央服务器,必须联网才能工作;
- 分布式:没有中央服务器的概念,每个人的电脑上都是一个完整的版本库;
- 分布式中也需要一个充当“中央服务器”角色的电脑:他只用来方便交换大家的代码,没有他一样干活,只是不太方便而已;
- 安装直接跳过
- 创建版本库(repository)
- 又叫仓库,理解成一个简单的目录,目录中的所有文件都能被git管理,方便跟踪以及历史追踪和还原;
- 创建一个仓库:
- 创建一个目录
- 使用git init 命令,将目录变成git可以管理的仓库;
- 注:这里的.git文件最好不用随意修改;
- git 只能管理纯文本文件,像图片/视频/word(是二进制存储的),这样的只能知道图片从100变成了120kb,至于具体改了什么,版本控制系统无法知道;
- 因为文本是有编码的,建议使用标准统一的UTF-8编码,这样既没有冲突,又被所有平台支持;
- 添加文件到Git仓库,分两步:
- 使用命令git add <file>,注意,可反复多次使用;这个完成文件添加;
- 使用命令git commit -m <message>,完成文件提交
- 时光穿梭机
- 总揽
- git status : 时刻掌握仓库当前的状态
- git diff <filename> : 查看某个文件的修改内容
- 版本回退
- 当你觉得文件修改到一定的程度后,就可以保存一个"快照",这个快照就是一个commit,一旦文件该乱了或者误删了,还可以从最近的一个commit回复,然后继续工作。而不是把这几个月的成果全部丢失;
- git log :查看版本的历史记录,看看有哪些commit
- 这里的commitId是SHA1计算出来的非常大的数字,是十六进制表示的
- 将文件回退到上以版本:
- 首先要知道在那个版本,Git中HEAD表示当前版本,HEAD^表示上一版本,网上100个版本用HEAD~100表示;
- 如过想回到上一个版本,使用命令 git reset --hard HEAD^(不支持HEAD^直接使用commitId)
- 如果我们想让远程分支也进行回退,在加上命令:git push origin HEAD --force
- 回到上一个版本后,我们git log 就没有当前的commitId了,如果还想在回来,要提前记得commitId哦
- Git的版本回退速度非常快,在git的内部有个指向当前版本HEAD的指针,当你进行版本回退的时候,Git仅仅是把指针的指向进行移动;
- git reflog : 查看你的所有命令的历史;
- 工作区和暂存区
- 工作区(work Directory):执行git init所在的文件夹就是一个工作区;
- 版本库(Repository):工作区中有.git文件,这个不是工作区,而是git的版本库;
- 版本库中有:Stage(暂存区)
- git add :实际上是将文件添加到了暂存区中了,
- git commit :将暂存区中的代码提交到了当前分支,
- 管理修改
- 为什么git比其他版本管理工具设计的优秀,因为git的跟踪管理对象是文件的修改,而并不是文件的本身;
- 这个修改包括:文件的修改和创建新文件;
- idea中的git commit 的图形话操作实际上是包含了git add 和 git commit 两步操作;
- 为什么git比其他版本管理工具设计的优秀,因为git的跟踪管理对象是文件的修改,而并不是文件的本身;
- 撤销修改
- 情况一:修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;使用命令
- git checkout -- fileName 使用版本库的版本完全替换工作区的版本
- 情况二:已经添加到暂存区,使用命令
- git reset HEAD fileName : 将暂存区的代码撤回到本地工作区
- git checkout -- fileName :撤销工作区代码修改
- 实际上idea中的revert选项帮我们做的就是这件事情;
- 情况一:修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;使用命令
- 删除文件
- 总揽
- 远程仓库
- 将本地库添加到远程库:需要的时候再看
- 从远程库克隆:git clone
- 分支管理
- 创建与合并分支
- git会把每次提交都串成一个时间线,这条时间线就是一个分支,严格来说HEAD不是指向的某一次提交,指向的是分支,分支再指向某一次提交,如此,HEAD就唯一的指向了一个分支的某次提交;
- 当我们使用git checkout -b dev 创建了一个新的分支时,git相应的操作是:
- 创建一个新的dev的指针,指向某一次提交;
- 相应的,删除分支就是将对应分支的指针删除;
- 解决冲突
- git log --graph可以查看分支合并图
- idea自带的图形化界面,解决冲突是很好用的;
- 分支管理策略
- 合并分支的时候,git默认是使用fast forward模式,--no-ff参数可以强制禁用fast forwart分支,这样的好处是合并的时候会创建一个commit,使用git log能查看合并的时候创建的commitId,
- 命令:$ git merge --no-ff -m "merge with no-ff" dev
- Bug分支
- 使用场景:当我们正在dev分支进行开发工作,突然领导让我修改一个bug,2小时内立即上线,但是dev中的开发工作还没有完成,此时使用
- git stash
- git stash pop 弹出清空
- git stash apply 弹出不清空
- git stash clear 清空所有
- git stash list 列出所有
- Feature分支
- 开发一个新功能叫feature分支
- 强制删除分支 :
- git branch -D feature
- 多人协作
- 当我们在本地分支使用git pull命令时,报错:no tracking information,是因为本地狠远程没有建立关联关系,可以使用如下命令建立关联关系:
- git branch --set-upstream branch-name origin/branch-name
- 拉去远程分支并创建关联关系
- git checkout -b 本地new的分支名 origin/远程分支名
- 将本地分支推送到远程并建立关联关系
- git push --set-upstream origin 分支名
- 当我们在本地分支使用git pull命令时,报错:no tracking information,是因为本地狠远程没有建立关联关系,可以使用如下命令建立关联关系:
- Rebase - “变基”
- 作用:让使用git log --graph命令展示出来的分支合并线编程一个干净的直线 。 貌似没什么卵用;
- 创建与合并分支
- 标签管理
- 标签的概念:
- 发布一个版本的时候,我们先从版本库中的打一个tag,这样就唯一确定了一个打标签的时刻,将来无论什么时候,取的时候都这打标签的这个版本。
- 标签也是版本库的一个快照;
- 其实他指向的是某个commit的指针(和分支的含义是一样的,但是分支是可以移动,标签是不能够移动的);
- 此时思考:git已经有conmit了,为什么还是要引入tag?
- 就是某个版本的快照,针对的的是某个时间点的版本做标记,发布和寻找起来很方便啊;
- 创建标签
- 打标签的步骤:
- 1.首先切换到要打tag的分支上
- 2.使用命令 git tag 标签名;
- git tag :可以查看所有的标签
- 标签默认是打在最新提交的commit上的,如果想打到之前的commit上,使用命令
- git tag 标签名 commitid
- 标签不是按照时间排序的,是按照字母排序的
- git show 标签名 :可以查看标签信息;
- 可以创建带有说明的标签,-a 指定标签名,-m 指定说明文字;
- git tag -a 标签名 -m “说明”
- 注意:标签总是和某个commit挂钩的,如果这个commit既出现在master分支,又出现在test分支,那么在这两个分支上都能看见这个标签;
- 打标签的步骤:
- 操作标签
- 命令git push origin <tagname>可以推送一个本地标签;
- 命令git push origin --tags可以推送全部未推送过的本地标签;
- 命令git tag -d <tagname>可以删除一个本地标签;
- 命令git push origin :refs/tags/<tagname>可以删除一个远程标签
- 从线上最新的tag拉分支
- git branch <new-branch-name> <tag-name>
- 标签的概念:
- Fork开源仓库
- 在GitHub上,可以任意Fork开源仓库;
- 自己拥有Fork后的仓库的读写权限;
- 可以推送pull request给官方仓库来贡献代码。
- cherry-pick用法
- 使用场景:
- 想在A分支的将B分支的一些commit弄到当前分支上来
- 步骤:
- 1,切换到B分支,用git log 查看commitId
- 2,切换至分支A,使用:
- (1)单个commit只需要git cherry-pick commitid
- (2)多个commit 只需要git cherry-pick commitid1..commitid100
- 放弃cherry-pick:git cherry-pick --abort
- 使用场景:
- 关于git的dangling(悬空文件)问题
- git删除分支或者清空stash的时候,这些其实还没有真正删除,成为悬空对象
- 此时我们的dangling对象太多的时候,git pull就会报错了:Auto packing the repository in background for optimum performance
- 此时我们使用命令git fsck就可以查看悬空文件;
- 然后使用git gc 进行回收
- 使用git gc时候如果报错,要使用命令:mv .git/refs/remotes/origin/HEAD /tmp
- 然后再git gc
- 在gitHub网页上提交mergeRequest时候,出现了WIP的标志:work in process:这样的状态是无法合并的;
Git常用命令总结
最新推荐文章于 2025-01-10 18:26:23 发布