声名
git场景操作均在gitee上进行实现
场景实现测试仓库链接: https://gitee.com/LaBiXiaoChen7/git-demo
现github中master已更名为main,以下操作按照gitee版本进行操作,敬请谅解
下载与相关资源
Mac 安装 brew(最新教程,绝对可行,一行代码搞定,不报错)
工作流程
一般工作流程如下:
克隆 Git 资源作为工作目录。
在克隆的资源上添加或修改文件。
如果其他人修改了,你可以更新资源。
在提交前查看修改。
提交修改。
在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
基本概念
工作区:存在于你pc端的本地文件目录
暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。
图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
说明:
workspace:工作区
staging area:暂存区/缓存区
local repository:或本地仓库
remote repository:远程仓库
gitee的连接验证
-
首先需要到github上去创建一个自己的帐户,记住用户名和邮箱。如果是windows系统,需下载git客户端;如果是苹果系统,则直接用终端就可以,无需下载。
-
在github上创建仓库。
-
ssh key是连接你的电脑和GitHub服务器的一把钥匙,只有两者建立了联系才能把你本地的代码提交到github上。首先要获取到ssh key公钥。
1.在终端输运行命令:
ssh-keygen
2.再运行:
pbcopy < ~/.ssh/id_rsa.pub
这时候会把公钥拷贝到剪贴板中
-
将剪贴板中ssh key粘贴到Key的位置上,title可以随便取。
-
回到终端,设置用户名和邮箱,最好与注册的github一致。这个用户名和邮箱是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中。在团队开发中,可以清楚地看到是谁的提交。在终端中输入命令:
git config user.name ‘XXX’
git config user.email ’XXX@XXX’
-
将github上的项目克隆到本地机子上。
git clone (这里面的内容是在下图红圈中复制的地址)
克隆下来后,本地就可以与远程仓库自由通信了。
配置用户名和邮箱
#去掉 --global 参数只对当前仓库有效
git config --global user.name 'your-name' 配置name
git config --global user.email 'your-email' 配置email
git config --global --list 查看用户名和邮箱信息
#编辑 git 配置文件
git config -e 针对当前仓库
git config -e --global 针对系统上所有仓库
配置.gitignore文件
.gitignore
为了解决有些文件,用户不想上传或者不想被其他人所看到而产生的解决办法。
在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
忽略文件的原则:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比 如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
gitignore 不是一开始就有的话~会造成gitignore无法生效的错觉 ~提示是缓存影响的。未能解决这个问题,中途添加.gitignore文件无法起作用
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
然后重新提交就可以
创建仓库
git init 本地生成仓库
在GitHub或者gitee中按照命令进行本地和远程仓库的连接即可
git clone repo-name 克隆项目到本地
git clone repo-name dir-name 克隆项目到指定的目录
提交与修改
git add ./file-name .代表当前文件夹下面所有文件,添加文件到仓库中
git status 查看仓库当前的状态,显示有变更的文件
git status -s -s参数来获得简短的输出结果
git diff <file-name> 比较暂存区和工作区的文件的不同
git commit <file-name> 提交暂存区文件到本地仓库
git rm file-name 删除工作区文件
git mv file-name dir-name 移动文件到其他位置
git mv old-file-name dir-name/new-file-name 将文件移动到一个文件夹下面,并且更改文件名
查看提交日志
git log 查看历史提交记录,使用commit命令的过程会被记录下来
#使用 --oneline 查看历史记录的简洁的版本
git log --oneline
#使用--reverse 逆向显示所有的日志
git log --reverse
#使用--graph查看历史中什么时候出现了分支、合并
git log --graph
#使用--author查看指定用户的提交日志
git log --author=user-name
#使用--since和--before 或者 --until和--after 来指定时间进行查看
#查看 Git 项目中三周前且在四月十八日之后的所有提交,执行代码(使用 --no-merges 选项以隐藏合并提交)
git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
git blame <file-name> 查看指定文件的修改记录,以列表形式显示修改记录
git show 查看最新的commit
git show <HEAD-id> 查看commit的所有修改
git show <HEAD-id> <file-name> 查看commit中的文件的修改
还原文件
git checkout -- file-name 还原工作区的文件修改内容,还原到上一步
git reset <HEAD>
#--soft 参数用于回退到某个版本
git reset --soft <HEAD>
#-hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
git reset --hard <HEAD>
注意:谨慎使用 –hard 参数,它会删除回退点之前的所有信息。
HEAD 说明:
HEAD 表示当前版本
HEAD^ 上一个版本
HEAD^^ 上上一个版本
HEAD^^^ 上上上一个版本
以此类推...
可以使用 ~数字表示
HEAD~0 表示当前版本
HEAD~1 上一个版本
HEAD^2 上上一个版本
HEAD^3 上上上一个版本
以此类推...
#还原已提交暂存区文件的场景
git add file-name #已将修改的内容文件提交到暂存区
git status file-name #查看文件是否被提交到暂存区的状态,显示为绿色,代表被git进行了文件追踪
git reset HEAD file-name 将暂存区文件还原到工作区,撤销文件追踪
git checkout -- file-name 将已撤销的文件进行文件还原
#将单个文件还原到某一个版本
git checkout HEAD-id -- file-name
添加标签
git tag 查看标签
git tag <tag-name> 添加标签到最近一次的commit
git tag <tag-name> <log-id> 添加标签到某一次commit
git push origin <tag-name> 将标签推送到远程仓库中
git tag -d <tag-name> 删除标签
git push --tags 将本地tag推送到远程仓库中
git push origin --tags
git push origin [tagname] push单个tag
git push origin v1.0 将本地v1.0的tag推送到远端服务器
分支处理
多用于合作协同开发
git brach 查看分支情况
git branch branch-name 创建分支
#演示
git branch Tom
git branch Jack
#输出:
Jack
Tom
* master
#此处按照name的首字母进行排序,不是按照创建时间进行排序
#*的位置标示当前所在的分支位置
git branch -d brach-name 删除分支
#不能删除当前所在的分支
#另一种情况就是当一个分支进行commit的时候,也不能直接删除
#如果你确定要删除的话,强制删除
git branch -D branch-name 强制删除分支
git checkout branch-name 切换分支
#切换分支时,Git会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录
git checkout -b new-branch-name 创建分支并直接切换到新分支中
git merge branch-name 合并分支
#当有冲突的时候,一般两种办法:
#1、协商之后手动删除冲突部分代码,进行提交
#2、使用一下命令来设置按照当前分支内容为主
git merge --abort
git log --graph 查看版本路线
操作远程仓库
git remote -v 显示所有的远程仓库
git remote show [remote] 显示某个远程仓库的信息
git remote add [repo-name] [url] 添加远程版本库
git remote rm repo-name 删除远程仓库
git remote rename old-name new-name 修改仓库名
#拉取远程仓库并且进行关联,修改操作远程仓库
git fetch 远程获取代码库
git log -av 查看本地代码与远程版本库之间的关系
git checkout -b new-branch-name remore-branch-name 创建本地分支,并且与远程分支进行关联
git push origin --delete <branch-name> 将远程仓库分支进行删除
#删除前确认分支处理情况,一定要完成对代码的处理
#主要用于删除本地没有,远程建立的分支
git checkout -b new-branch-name remore-branch-name 创建本地分支,并且与远程分支进行关联
git仓库中包含子仓库
项目遇到父目录下有一个子目录,并且父目录和子目录相互之间都有一个独立的git管理代码。这个时候如果想当然的将主目录提交到远程仓库是会弹出一个警告信息。(内部仓库可以完全按照正常仓库流程使用即可,但是外部仓库需要设置对子仓库的管理),生成.gitmodule文件进行对子仓库的管理
提示你要添加子模块的git 到远程仓库,否则这部分代码是不会同步上去的
#全流程创建子仓库
git init
git submodule add <url> <project-path>
#<url>表示子仓库的远程仓库地址
#<project-path>表示项目子仓库的本地位置,不能以/结束
#例如准备放在cms文件夹中,不能写成./cms/,只能是./cms,这样就能正常生成.gitmodule文件
git add .
git commit-m 'first commit'
git push
git push后远程仓库中显示包含一个仓库文件夹,可以直接跳转到指定子仓库中去
对子仓库进行操作,父仓库只会记录子仓库中的提交记录
github中的pull request的使用
当你想更正别人仓库里的错误时,要走一个流程:
1.先 fork 别人的仓库,相当于拷贝一份,因为不会直接让你修改原仓库。
2.clone 到本地分支,做一些 bug fix。
3.发起 pull request 给原仓库,让他看到你修改的 bug。
4.原仓库 review 这个 bug,如果是正确的话,就会 merge 到他自己的项目中
至此,整个 pull request 的过程就结束了。
tips:本文资源