Git学习

目录

1.基础介绍

分区

基础指令

git的工作流程图

2.本地仓库

创建本地仓库

提交

查看状态

查看文件修改情况

查看历史记录

回退版本

撤销修改

删除文件

3.远端仓库

操作远端仓库

拉取

推送

分支

分支策略

分支冲突

bug分支处理

rebase变基

建立追踪关系

标签

4.github

Pull Request

5.自定义Git

忽略特殊文件

6.推荐学习网站


1.基础介绍

分区

Git 本地仓库管理,可以分为三个区:

  • 工作区(Working Directory):是可以直接编辑的地方。

  • 暂存区(Stage/Index):数据暂时存放的区域。

  • 版本库(commit History):存放已经提交的数据。

基础指令

命令作用
cat 文件名查看文件具体内容
vim 文件名与Linux的vim操作类似
clear清空终端

git的工作流程图

2.本地仓库

创建本地仓库

命令作用
git init创建本地版本库

提交

命令作用
git add 文件名提交文件到暂存区
git add提交所有修改文件到暂存区
git commit -m "提交说明"提交暂存区文件到版本库
git revert <commit>对指定创建⼀个undo的 commit,并应⽤到当前分⽀

查看状态

命令作用
git status获取当前仓库的状态,查看是否有修改未提交的文件

查看文件修改情况

命令作用
git diff 文件名查看工作区文件具体修改内容。(工作区与暂存区)
git diff --cached 文件名查看暂存区区文件具体修改内容。(暂存区与版本库)
git diff HEAD -- 文件名查看文件在工作区和版本库里面最新版本的区别。(工作区与版本库)

查看历史记录

命令作用
git log查看提交历史记录,可以看到版本号、分支、修改者、修改时间以及提交说明
git log --pretty=oneline查看提交历史记录,只显示版本号、分支与提交说明
git log --graph查看分支的合并图
git log --oneline查看提交历史记录,更进一步,只显示简短版本号、分支与提交说明
git reflog查看命令的历史记录

按Q可以退出log状态。

回退版本

命令作用
git reset --hard HEAD^回退到上个版本
git reset --hard head^^回退到上上个版本(以此类推)
git reset --hard head~回退到上个版本
git reset --hard head~100回退100个版本
git reset --hard 版本号回退到指定commit-id的版本

reset 回滚有三种类型:

  • Mixed 此为默认方式 回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也不受影响)
  • soft 回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)
  • hard 回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换

撤销修改

命令作用
git checkout -- 文件名若暂存区有文件,回退到暂存区所在状态;否则回退到版本库状态。(其中 -- 不可缺 ,否则为切换分支命令,--前后有空格)
git reset head 文件名丢弃暂存区修改

删除文件

命令作用
rm 文件名删除工作区的文件
git rm 文件名删除工作区文件,并且将这次删除放入暂存区(注意: 文件修改后加入暂存区无法删除)
git rm -f 文件名强制删除工作区文件,并且将这次删除放入暂存区
git rm --cached 文件名删除暂存区文件,但保留工作区的文件,并且将这次删除放入暂存区

3.远端仓库

操作远端仓库

命令作用
git remote add <remote> git@....本地仓库连接GitHub远程仓库(<remote>一般取名为origin)(该操作一般是处理先有本地仓库,推送至远端新仓库)
git remote查看所有关联的远程主机的名称
git remote -v查看所有关联的远程主机的名称与其对应的 URL
git remote show <remote>查看某一个远程仓库的更多信息
git remote rename <pb> <paul>远程仓库重命名,将 pb 重命名为 paul
git remote rm <remote>移除与某一个远程仓库的关联。(不是删除远程库)
git clone git@...克隆远端仓库(现有远端仓库)

Git支持多种协议,包括https,但ssh协议速度最快。

拉取

命令作用
git pull <remote> <branch>从远程库的<branch>分支拉取内容合并到本地库的当前分支
git pull <remote> <remote-branch>:<local-branch>从远程库的<remote-branch>分支拉取内容合并到本地库的<local-branch>分支(不存在则新建)
git pull从远程库相关联的分支拉取内容合并到本地库的当前分支。(注意是在建立追踪关系后)
git pull --rebase origin <branch>从远程库拉取内容合并到本地库。(加上 --rebase 选项,git内部会自动检测,合并的结果会丢弃一些提交)
git fetch <remote>更新所有分支
git fetch <remote> <branch>更新远端指定分支到当前分支
git fetch <remote> <remote-branch>:<local-branch>更新远端指定分支到本地指定分支

推送

命令作用
git push <remote> <branch>把当前分支推送到远程库<remote>的<branch>分支。远程库没有<branch>分支默认会创建
git push <remote> <local-branch>:<remote-branch>把本地库的<local-branch>分支推送到远程库<remote>的<remote-branch>分支。远程库没有<branch>分支默认会创建
git push -u origin <branch>把本地库的<branch>分支推送到远程库的<branch>分支。第一次推送加上 -u 参数,建立了追踪关系
git push把本地库当前分支的内容推送到远程库相关联的分支。(注意是在建立追踪关系后)
git push <remote> --delete <branch>删除远程分支

git push 失败可以试试命令git pull --rebase origin <branch>,或者是检查有没有commit之类的。

分支

命令作用
git branch <branch-name>创建新分支<branch-name>
git branch查看分支及当前所在分支
git branch -v查看本地所有分支的最后一次提交
git branch -vv查看本地所有分支的最后一次提交。(包括和远程分支的追踪关系。)
git branch -r查看远程分支
git branch -a查看本地分支和远程分支
git merge <branch-name>Fast-forward模式合并指定分支<branch-name>到当前分支(Fast-forward:快进模式,也就是直接把master指向dev的当前提交,所以合并速度非常快。)
git merge --no-ff -m "提交说明" <branch-name>强制禁用Fast-forward模式合并指定分支<branch-name>到当前分支(这样从分支历史上就可以看出分支信息)
git branch -d <branch-name>删除分支<branch-name>(对象是已经合并到当前分支且要删除的分支)
git branch -D <branch-name>强行删除分支<branch-name>(对象是没有合并到当前分支但要删除的分支)
git switch <branch-name>切换到分支<branch-name>
git switch -c <branch-name>创建并切换到新分支<branch-name>
git checkout <branch-name>切换到分支<branch-name>(区别此前撤销修改的命令git checkout -- 文件名)
git checkout -b <branch-name>创建并切换到新分支<branch-name>
git checkout -b <branch-name> <remote>/<branch>创建并切换到新分支<branch-name>,并链接追踪到远端仓库<remote>的<branch>分支

分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

分支冲突

master分支和feature1分支各自都分别有新的提交,分支树变成了这样:

直接使用git merger会提示合并冲突,可以使用git status查看冲突的文件名。

打开冲突文件会看到Git用<<<<<<<=======>>>>>>>标记出不同分支的内容。

修改后add、commit并再次push即可解决问题。

bug分支处理

当前工作区任务还未达到提交的时刻,却要到其他分支处理任务。直接切换分支会导致当前工作内容清空,可以把工作现场存储起来,事后恢复。

命令作用
git stash把当前工作现场存储起来
git stash list查看stash列表
git stash apply恢复工作现场
git stash apply <stash-num>恢复到指定的工作程序(<stash-num>通过git stash list查看)
git stash drop删除存储的工作现场
git stash pop恢复的同时把stash内容也删了
git cherry-pick <commit-id>复制某次提交操作到当前分支并自动提交(可用于处理修改源分支bug后,到子分支修改bug的情况)

rebase变基

  • rebase操作可以把本地未push的分叉提交历史整理成直线;

  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

例:

在这里,你可以用”pull“命令把”origin“分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的”合并的提交”(merge commit):

 使用命令:

 $ git checkout mywork
 $ git rebase origin

这些命令会把你的”mywork“分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到”.git/rebase“目录中),然后把”mywork“分支更新 到最新的”origin“分支,最后把保存的这些补丁应用到”mywork“分支上。

建立追踪关系

命令作用
git push -u origin <branch>把本地库的<branch>分支推送到远程库的<branch>分支。第一次推送加上 -u 参数,建立了追踪关系
git branch --set-upstream-to=<remote>/<branch> <local-branch>手动建立本地分支与远程分支的关联
git checkout -b <local-branch> origin/<branch>在本地创建和远程分支相关联的分支。本地和远程分支的名称最好一致

标签

命令作用
git tag <tagname>给当前所在分支的最新commit打上标签
git tag <tagname> <commit-id>给指定<commit-id>打上标签
git tag -a <tagname> -m "说明文字" <commit-id>创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag查看所有标签
git show <tagname>查看具体标签信息
git tag -d <tagname>删除本地指定标签
git push <remote> <tagname>推送标签到远端仓库
git push <remote> --tags一次性推送全部尚未推送到远程的本地标签
git push <remote> :refs/tags/<tagname>删除远端标签

4.github

Pull Request

这里以廖老师的pull request仓库GitHub - michaelliao/learngit: 教程→ https://www.liaoxuefeng.com/wiki/896043488029600 推送请使用UTF-8编码https://github.com/michaelliao/learngit进行测试:

首先点击右上角fork到自己的github仓库:

在自己仓库进行某些修改后,申请pull request:

 

当然,别人不一定接受。。。

5.自定义Git

忽略特殊文件

对于某些配置文件例如数据库密码的配置文件,我们不希望push到远端仓库。

可以在Git工作区根目录下创建一个.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:GitHub - github/gitignore: A collection of useful .gitignore templates

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;

  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;

  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

命令作用
git add -f <file>强制添加被忽略的文件
git check-ignore检查.gitignore文件错误

把指定文件排除在.gitignore规则外的写法就是!+文件名

6.推荐学习网站

本文学习整理自:

Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)

git-cheat-sheet (gitee.io)

Git:常用命令汇总_Samven_7的博客-CSDN博客

git rebase命令 - Git教程™ (yiibai.com)

github的pull Request使用 - 俄小发 - 博客园 (cnblogs.com)

感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值