Git 剖析,以及Git相关操作
Posted gongyalei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git 剖析,以及Git相关操作相关的知识,希望对你有一定的参考价值。
Git的安装: Windows上操作。
1、安装安装包地址: http://msysgit.github.io/
一路next,直接安装上,完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。
在开始菜单里找到"Git"->"Git Bash",会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。
2、安装完成之后一系列命令操作
一般公司申请账户,邮箱,相对用的注册账户邮箱方式:
$ git config --global user.name "gongxiaozhu"
$ git config --global user.email "[email protected]"
3、查看配置信息
git config --list
Git config user.name
git config user.email
Git 工作区、暂存区和版本库
我们先来理解下Git 工作区、暂存区和版本库概念
工作区:就是你在电脑里能看到的目录。
暂存区:英文叫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 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
Git 工作流程
一般工作流程如下:
克隆 Git 资源作为工作目录。
在克隆的资源上添加或修改文件。
如果其他人修改了,你可以更新资源。
在提交前查看修改。
提交修改。
在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
Git 的常用命令:
git clone
git remote
git fetch
git pull
git push
下图展示了 Git 的工作流程:
Git 创建仓库
git init
Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。
在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。
使用方法
使用当前目录作为Git仓库,我们只需使它初始化。
git init
该命令执行完后会在当前目录生成一个 .git 目录。
使用我们指定目录作为Git仓库。
git init newrepo
初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
$ git add *.c
$ git add README
$ git commit -m ‘初始化项目版本‘
以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。
git clone
我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。
克隆仓库的命令格式为:
git clone <repo>
如果我们需要克隆到指定的目录,可以使用以下命令格式:
git clone <repo> <directory>
参数说明:
repo:Git 仓库。
directory:本地目录。
比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
$ git clone “地址”
执行该命令后,会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。
如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone "地址"
Clone 完之后我们操作
添加文件,添加文件包
$ git touch “文件名称”, git makdir 新建文件
新建完之后编辑
$ vi “文件名” $ : wq 保存文件编辑
查看文件
$ ls -a 查看所有文件 ll 以一种怕列方式展示 git status 提交状态 git diff 查看不同文件
添加文件、删除文件
$ git add ./ git add "文件名称" git rm
提交到缓存到本地文件
$ git commit -m "说明" git pull git push
Git 分支管理
git branch -a 查看远程分支。
git checkout (branch) 切换分支
git merge 合并分支
- 一般配置
git --version //查看git的版本信息 git config --global user.name //获取当前登录的用户 git config --global user.email //获取当前登录用户的邮箱
- 登录git
/* 如果刚没有获取到用户配置,则只能拉取代码,不能修改 要是使用git,你要告诉git是谁在使用*/
git config --global user.name ‘userName‘ //设置git账户,userName为你的git账号,
git config --global user.email ‘email‘
- 创建一个文件夹
mkdir nodejs //创建文件夹nodejs cd nodejs //切换到nodejs目录下
- 初始化git仓库
git init //在nodejs文件夹下初始化一个仓库,此时文件里会到一个.git的隐藏文件夹
- 创建忽略文件
touch .gitignore //不需要服务器端提交的内容可以写到忽略文件里 /* .git .idea /*
- 查看目录
ls -al
- 创建文件并写入内容
// 如果文件不存在则会创建文件 // 单个>箭头表示写入, >>表示追加 echo "hello git" > index.html //将‘hello git‘ 写入到index.html中
- 查看文件内容
cat index.html
- 增加到暂存区中
git add index.html git add -A //全部添加到缓存区
- 增加到版本库(仓库)中
git commit -m ‘备注时间、次数、版本号等信息‘
- 查看版本
git log --oneline
- 比较差异
// 比较的是暂存区和工作区的差异 git diff //比较的是暂存区和历史区的差异 git diff --cached //比较的是历史区和工作区的差异(修改) git diff master
- 撤回内容
// 如果修改了工作区的文件后发现改错了 // 可以用暂存区或者版本库里的文件替换掉工作区的文件 // 用暂存区中的内容或者版本库中的内容覆盖掉工作区 git checkout index.html
- 取消增加到暂存区的内容(添加时)
git reset HEAD index.html
//显示目录的状体 有没有添加或者修改文件
git status
- 删除本地文件
rm fileName
- 删除暂存区
// 保证当前工作区中没有index.html // 使用--cached 表示只删除缓存区中的内容
git rm index.html --cached
- 回滚版本
回滚最近的一个版本 git log git reset --hard HEAD/commit_id
- 回滚到未来
git reflog
- 创建分支
git branch dev
- 切换分支
git checkout dev
- 创建分支并切换分支
git checkout -b dev
- 删除分支
git branch -d dev
- 在分支上提交新的版本
git commit -a -m ‘dev1‘
- 合并分支
git merge dev
- 分支的合并后显示log
git log --oneline --graph --decorate
- 在分支开发的过程中遇到其他问题需要切换其他分支
// 保留写好的内容在切换到主干 // 保留内容 git stash
- 再次切换分支后,需要应用一下保留的内容
git stash apply
- 丢掉保存的内容
git stash drop
- 使用并丢掉
git stash pop
- 最佳分支
// 有的时候开发需要合并指定的内容,而不是合并所有的提交
// 所以我们需要挑选最好的,自己生产版本
- 合并分支把树杈掰到主干上
git rebase
- 添加远程的仓库
// push -u // -u参数 upstream git push origin master -u //获取最新代码
- 连接远程仓库
git remote add origin 仓库的地址
- 查看远程仓库
git remote -v
- 删除远程仓库
git remote rm origin
- git常用命令
// 安装及配置:
Ubuntu下安装:sudo apt-get install git 配置用户名:git config --global user.name "你的名字" 配置e-mail:git config --global user.email "你的邮箱@xx.com" // 与添加有关的: 将当前目录变为仓库:git init 将文件添加到暂存区:git add 文件名 [可选:另一个文件名] 将暂存区提交到仓库:git commit –m "描述" // 与查询有关的: 查询仓库状态:git status 比较文件差异(请在git add之前使用):git diff 文件名 查看仓库历史记录(详细):git log 查看仓库历史记录(单行):git log --pretty=online 或 git log --online 查看所有版本的commit ID:git reflog // 与撤销有关的: 撤销工作区的修改:git checkout -- 文件名 撤销暂存区的修改:git reset HEAD 文件名 回退到历史版本:git reset --hard 该版本ID 回退到上个版本:git reset --hard HEAD^ 上上版本是HEAD^^,也可用HEAD~2表示,以此类推 // 与标签有关的: 为当前版本打标签:git tag 标签名 为历史版本打标签:git tag 标签名 该版本ID 指定标签说明:git tag –a 标签名 –m "标签说明" [可选:版本ID] 查看所有标签:git tag 查看某一标签:git show 标签名 删除某一标签:git tag –d 标签名 // 与GitHub有关的: 先有本地库,后有远程库,将本地库push到远程库 关联本地仓库和GitHub库:git remote add origin 网站上的仓库地址 第一次将本地仓库推送到GitHub上:git push –u origin master 先有远程库,后有本地库,从远程库clone到本地库 从远程库克隆到本地:git clone 网站上的仓库地址
网站地址可以选择HTTPS协议(https://github.com...
)、SSH协议([email protected]
)。
如果选择SSH协议,必须将Ubuntu的公钥添加到GitHub上。见下一步
SSH Key
生成SSH Key:ssh-keygen –t rsa –C "你的邮箱@xx.com"
生成Key时弹出选项,回车选择默认即可。
Key保存位置:/root/.ssh
登陆GitHub,创建new SSH key,其内容为/root/.ssh/id_rsa.pub
中文本
已经有了本地库和远程库,二者实现同步
本地库的改动提交到远程库:git push origin master
更新本地库至远程库的最新改动:git pull
以上是关于Git 剖析,以及Git相关操作的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段15——git命令操作一个完整流程
VSCode自定义代码片段15——git命令操作一个完整流程