git学习

本文主要总结自菜鸟教程,感谢

Git安装配置
  • linux系统安装git如下(图片来自菜鸟教程在这里插入图片描述
  • Git配置
    • git config命令: 用于配置或读取相应的工作环境变量
    • 如Git安装后,要配置用户名和电子邮件地址:
      • $ git config --global user.name “your user name”
      • $ git config --global user.email “your email”
      • $ git config --global core.editor emacs (可选的-配置编辑器)
      • $ git config --global merge.tool vimdiff(可选的-配置差异化分析工具)
    • 上述–global指定命令后续配置的使用范围,各配置范围如下:在这里插入图片描述
    • 查看配置信息:git config --list

    http.postbuffer=2M
    user.name=your user name
    user.email=your email

    • 直接查阅某个环境变量的设定:
      • $ git config user.name
Git工作流程
  • 一般工作流程如下(图片来自菜鸟教程):

    • 克隆 Git 资源作为工作目录(不能直接改别人的代码)
    • 在克隆的资源上添加或修改文件(根据自己需要修改)
    • 如果其他人修改了,你可以更新资源(源代码有更新再次拉取)
    • 在提交前查看修改(自己修改好后,查看一下是否有错)
    • 提交修改(没错就可以提交到特定仓库)
    • 在提交完成后,如果发现错误,可以撤回提交并再次修改并提交(有需要可撤回)在这里插入图片描述
  • Git工作区、暂存区、版本库(重要!!!

    • 工作区:workspace/ws,一般clone别人的代码后,得到的目录就是工作目录/工作区,你在该目录写自己的代码;
    • 版本库:工作区下有个 .git 目录,称为Git的版本库
    • 暂存区:官方英文术语叫stage/index;一般在 工作区/.git/index,即版本库里面的一个文件夹;也叫索引区在这里插入图片描述
    • 基本工作机制
      • 如上图,左侧工作区、右侧版本库,版本库中有文件夹stage/index,即暂存区;HEAD->master(类似指针),master代表master分支/目录树;objects是Git的对象库,用于存储对象的更改操作以及暂存区目录树,用于回退操作;
      • git add:工作区变动的文件内容更新到 stage/index目录树,同时被写入到objects中的一个new object,new object的ID又被记录到stage中的索引文件;
      • git commit:stage中目录树写到objects,master分支指向该目录树(即与stage目录树保持一致)
      • git reset HEAD:把HEAD/master指向的目录树还原到stage中,不影响工作区;
      • git rm --cached anyFile:从stage中删除特定文件,不影响工作区;
      • git checkout . 或者git checkout --anyFile:用stage中的全部或特定文件替换工作区的文件【危险!!!会清除工作区中未添加到stage的改动,努力就白费了
      • git checkout HEAD . 或者 git checkout HEAD anyFile:用HEAD/master分支的全部/部分文件替换 stage 以及 工作区 相应文件【危险!!!会清除工作区和stage为提交的改动,努力就白费了
  • Git创建仓库([*]表示可选参数)

    • git init [dir]:使用特定目录dir作为Git仓库,我们只需使它初始化
    • git clone other_repo [new name]:从别人的Git仓库拷贝项目到自己目录;
    • git config -e [–global]:编辑配置文件,–global指定对当前用户所有仓库有效;
    • 几种等价的git clone写法,常用SSH协议,较快,且可以配置公钥免密:

    git clone git@github.com:fsliurujie/test.git --SSH协议
    git clone git://github.com/fsliurujie/test.git --GIT协议
    git clone https://github.com/fsliurujie/test.git --HTTPS协议
    git clone http://github.com/CosmosHua/locate [new_name]
    git clone http://github.com/CosmosHua/locate.git [new_name]

  • Git基本操作(命令介绍)

    • Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比
    • Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull在这里插入图片描述
    • 几个术语介绍
      • workspace:工作区;
      • staging area:暂存区/缓存区;
      • local repository:本地仓库;
      • remote repository:远程仓库;
    • 一些命令(图片来自菜鸟教程)在这里插入图片描述
      在这里插入图片描述
Git分支管理
  • 分支相关命令:
    • git branch [-b] branch_name:创建分支,没有参数则列出本地分支,加上-b选项则为创建并立即切换到新分支;
    • git checkout branch_name:切换分支(Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录)
    • git merge:合并分支
  • 一个例子-开始(来自菜鸟教程)
> $ mkdir gitdemo
> $ cd gitdemo/
> $ git init  # 初始化一个仓库
> $ touch README  # 创建一个文件
> $ git add README  # add 把改动添加到stage,版本库对象objects创建新obj_new保存改动,obj_new的ID保存到stage中的索引文件
> $ git commit -m '第一次版本提交'  # stage的目录树保存到objects,HEAD/master指向该目录树
> ### 分支操作介绍 ###
> $ git branch  # 显示本地分支
>>> * master  # *表示当前工作分支
> git branch testing  # 创建testing分支,若已存在则切换
> git branch  # 再次显示本地分支
>>> * master
>>>   testing  # 结果显示新增了一个分支
> ### 一个tip介绍如下 ###
> ls  # 显示当前分支的文件
>>> README  
> echo 'runoob.com' > test.txt  # 新建文件test.txt
> git add .  # 添加所有文件到stage
> git commit -m 'add test.txt'  # 
>>> [master 3e92c19] add test.txt  # 注意是添加到master分支
> ls  # 当前分支为master,因此能看到test.txt
>>> README test.txt
> git checkout testing  # 切换到testing分支
> ls
>>> README  # 没有test.txt,因为test.txt是master分支创建的;但是有README,也就是创建testing分支时,共享了master已有的文件;
> ### 创建分支命令介绍2 ###
> git checkout -b newtest  # 该命令创建新分支newtest并立即切换到该分支下
>>> Switched to a new branch 'newtest'
> git rm test.txt  # 删除当前分支的test.txt文件
> touch runoob.php  # 新建文件
> git add .
> git commit -am 'removed test.txt and add runoob.php'
> ls
>>> README runoob.php  # newtest分支的所有文件
> git checkout master
> ls
>>> README test.txt  # newtest分支的操作不会影响master分支
> git branch -d testing  # 新命令,删除testing分支
> git branch  # 查看本地所有分支
>>> * master  # 只剩下master/newtest分支
>>>   newtest
> ### 分支合并命令介绍 ###
> git branch master  # 切换到master分支
> ls
>>> README  test.txt  # master分支所有文件
> git merge newtest  # 合并newtest分支到master分支
>>> Updating 3e92c19..c1501a2
>>> Fast-forward
>>> runoob.php | 0  # 合并会把newtest的操作带到master,因此新增runoob.php
>>> test.txt   | 1 -  # 去除test.txt
>>> 2 files changed, 1 deletion(-)
>>> create mode 100644 runoob.php
>>> delete mode 100644 test.txt
> ls  # 显示当前master分支内容
>>> README  runoob.php  # test.txt文件被删除
> git branch -d newtest  # 合并后可以删除newtest分支
> ### 合并冲突介绍 ###
> git branch
>>> * master
> cat runoob.php  # 显示为空,即此时没有内容
> git checkout -b change_site  # 创建冲突测试分支并切换到该分支
> vim runoob.php  # 修改该分支的runoob.php文件,添加如下内容
>>> <?php
>>> echo 'runoob';
>>> ?>
> git commit -am 'change the runoob.php in change_site'  # 提交
> git checkout master  # 切换回master分支
> cat runoob.php  # 显示仍然为空,change_site分支变动不影响master分支
> vim runoob.php  # 修改当前master分支的runoob.php文件,添加如下内容
>>> <?php
>>> echo 1;
>>> ?>
> git diff  # 差异化分析命令,查看目前变动,会看到runoob.php增加上面3行(此处不另外展示输出结果)
> git commit -am 'change the runoob.php in master'  # 提交
> git merge change_site  # !!!开始合并change_site分支到master分支
>>> Auto-merging runoob.php
>>> CONFLICT (content): Merge conflict in runoob.php  
>>> Automatic merge failed; fix conflicts and then commit the result.
>>> # 报错如上,提示合并冲突:因为两个分支对同一个文件同一个地方做了修改,git不知道要采用哪一个分支的结果,注意没有默认采用当前分支的说法;
>>> # 此时可手动处理冲突文件(IDE会提供更好的修改方式),也可abort(暂略)
> cat runoob.php  # git会把冲突部分在要合并的文件上展示出来,如下
>>> <?php
>>> <<<<<<<<< HEAD  # 冲突提示符:master此处是echo 1;
>>> echo 1;
>>> =========  # 冲突提示符
>>> echo 'runoob';
>>> >>>>>>>>> change_site  # 冲突提示符:change_site 此处是 echo ’runoob';
>>> ?>
> # 手动处理冲突,保留自己想要的内容,并删除冲突提示符,修改后演示结果如下:
> cat runoob.php
>>> <?php
>>> ehco 1;
>>> echo 'runoob';
>>> ?>
> git status -s  # 冲突修改后查看状态,-s表示 简写short
>>> UU runoob.php  # UU表示新添加未跟踪,此时冲突已解决
> git commit  # 提交结果
Git查看提交历史
  • 常用两个命令
    • git log:查看提交历史记录
    • git blame file:以列表形式查看指定文件的历史修改记录
  • git log
> git log --oneline  # --oneline选项指定查看历史记录的简洁版本
>>> d5e9fc2 (HEAD -> master) Merge branch 'change_site'
>>> c68142b 'change the runoob.php in master'
>>> (change_site) 'change the runoob.php in change_site'
>>> ...
> git log --oneline --graph  # --graph选项以图形是查看历史中出现的分支、合并
>>> *   d5e9fc2 (HEAD -> master) Merge branch 'change_site'
>>> |\
>>> | * 7774248 (change_site) change the runoob.php in change_site
>>> * | c68142b change the runoob.php in master
>>> |/ 
>>> ...
> git log --author=xxx --oneline  # --author 指定查看提交作者的历史记录
> git log --oneline --before={2.weeks.ago} --after={2020-10-10}  # before、after指定查看日期范围
  • git blame your_file:列表形式查看特定文件的修改记录
> git blame README
>>> ^d2097aa (tianqixin 2020-08-25 14:59:25 +0800 1) # Runoob Git 测试(直接copy菜鸟教程的输出结果,大家知道就好)
>>> db9315b0 (runoob    2020-08-25 16:00:23 +0800 2) # 菜鸟教程 
Git标签
  • 开发进行到特定节点,可能希望记住这个提交节点(提交快照),可以用git tag打标签;
> git tag -a v1.0  # 给最新一次提交(HEAD)打上'v1.0'标签,-a表示可以注解,类似commit -m提供提交说明
> git tag -a v0.9 85fc7e7  # 给某个提交追加标签
> git tag  # 查看所有标签
>>> v0.9
>>> v1.0
> git tag -d v1.0  # 删除标签
>>> Deleted tag 'v1.0' (was 91388f0)
> git show v0.9  # 查看标签对应版本的修改内容

git 标签介绍–菜鸟教程@宋某人c
1、发布一个版本时,我们通常先在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。
所以,标签也是版本库的一个快照。
Git 的标签虽然是版本库的快照,但其实它就是指向某个 commit 的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的
2、Git有commit,为什么还要引入tag?
“请把上周一的那个版本打包发布,commit号是6a5819e…”
“一串乱七八糟的数字不好找!”
如果换一个办法:
“请把上周一的那个版本打包发布,版本号是v1.2”
“好的,按照tag v1.2查找commit就行!”
所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

Git远程仓库(Github)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值