ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(真正的质量意味着让程序员为他们写的代码自豪,参与到编写代码之中并把它当做自己个人的事情。——Linus Torvalds)
ㅤㅤㅤ
ㅤㅤㅤ
Git
Git 诞生于 Linux 内核社区对可用的 VCSs(版本控制系统)的挫败感。Linux 内核的发展在当时是相当不寻常的:项目中有大量的贡献者而且贡献者的参与程度和对代码知识库的了解有很大的差异。由于 Linux 内核不寻常的发展状况,开发人员很难找到适合他们需求的 VCSs(版本控制系统)。于是他们选择了 BitKeeper 和并发修订系统(CVS),每个系统有一组核心开发人员去负责管理内核的开发。BitKeeper 提供分布式版本控制,而 CVS 是一个客户端-服务端版本控制系统,它可以让开发人员“签出”项目的副本,进行更改,然后将他们的改变“签入”到服务端
Git安装-Ubuntu
sudo apt-get install git
然后输入git help 出现帮助语句后就证明git安装成功
Git初始化账户配置
- git config --global user.name “your use name”
配置用户名
- git config --global user.email “your email”
配置邮箱
- git config --list
查看git相关配置
user.email=17319132391@163.com
user.name=zhangzw
https.proxy=https://127.0.0.1:1080
http.proxy=http://127.0.0.1:1080
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=git@github.com:820465323/demo.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.dev.remote=origin
branch.dev.merge=refs/heads/dev
或者通过查看.git目录下的config文件,其中也有git相关的配置
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@github.com:820465323/demo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "dev"]
remote = origin
merge = refs/heads/dev
Git配置ssh密钥和公钥
- ssh-keygen -t rsa -C “your email”
生成ssh密钥
- cat ~/.ssh/id_rsa.pub
查看私钥
- 复制id_rsa.pub文件内的密钥并配置在github/gitlab/gitee等
配置ssh,这样就可以对应的代码仓库进行ssh通信
github为例
- ssh -T git@github.com
验证ssh连接
Git仓库初始化以及各项配置
- git init
在当前目录下初始化一个新的git仓储,并生成一个隐藏的.git文件
文件/文件夹名称 | 文件/文件夹描述 |
---|---|
branches | 用于支持从svn(subversion)中复制到git的存储库 stackoverflow解释 |
hooks | 存放可在某些指令前后触发运行的钩子脚本(hook scripts),默认包含一些脚本样例 Git钩子 |
info | 存放项目信息,默认包含一个全局exclude文件, 用来放置不希望记录在.gitignore 中的忽略模式 |
logs | 用于记录分支提交记录等信息的文件夹 |
logs/HEAD | 存放了当前分支的所有引用记录,就像.git/HEAD一样存放着当前分支的指向,但在logs下该文件存放着该分支所有的提交记录![]() |
logs/refs | 存放了heads,remotes,stash |
logs/refs/heads | 记录了当前git仓库下分支所做的所有更改![]() |
logs/refs/remotes | 记录了当前git仓库各分支commit的更新记录![]() |
logs/refs/stash | 记录了当前git仓库下的储藏记录![]() |
objects | git的核心,存储所有Git的数据对象,用来维护与管理项目的修订版本和历史信息 Git背后的Objects / Git对象 官方解释![]() |
refs | 存储各个分支的最新指向和存储记录等 Git refs官方解释![]() |
refs/heads/branches name | 记录着当前git仓储的最新分支引用![]() |
refs/remotes/repo name/ | 记录了当前所在分支以及分支的最新提交记录 ![]() |
COMMIT_EDITMSG | 当前分支最新commit提交备注 ![]() |
config | git相关配置![]() |
description | 一个文本文件,在Web前端中显示为项目描述 Git官方解释 |
FETCH_HEAD | FETCH_HEAD指的是: 某个branch在服务器上的最新状态,当前分支指向的FETCH_HEAD, 就是这个文件第一行对应的那个分支 FETCH_HEAD相关资料 |
HEAD | 描述了当前的指向分支 Git寻根 ^和~的区别 |
- 或使用命令查看.git内文件夹的相关描述
git help gitrepository-layout
官方描述连接 https://git-scm.com/docs/gitrepository-layout
Git常用命令
git add 将文件添加至暂存区
将我们需要提交的代码从工作区添加到暂存区
- git add .
将所有文件添加至暂存区,但不包含已删除文件
- git add -A .
将所有文件添加至暂存区,包含删除文件
- git add -u .
将所有文件添加至暂存区,但不包含新增文件
- git add file
将指定文件添加至暂存区
- git restore file
撤销指定文件的更改
- git reset HEAD file
撤销暂存区的指定文件
- git reset HEAD .
撤销所有暂存区文件
- git add -h
查看git add 命令相关的帮助
git commit 将暂存区的更改提交至版本库
将暂存区的更改提交至版本库
- git commit -m “message”
将暂存区中所有文件提交至版本库 -m后的参数是本地提交的备注,如果不带-m 则会生成一个vim编辑器来填写备注
- git reset HEAD^ / git resetHEAD^
撤销最近的一次父提交至工作区
- git reset --hard HEAD^n / HEAD~n
将当前指针重置为指定的commit,会造成当前commit的丢失
- git commit -h
git commit 命令帮助
git pull 拉去远程仓储最新的commit至本地并合并
拉取远程仓库代码至本地 git pull = git fetch + git merge
- git pull origin master
拉取master分支并和当前分支合并
- git pull origing master:dev
拉取master分支并与本地的dev分支合并
- git pull -h
git pull 命令帮助
git push 将当前commit提交至远程仓储
将版本裤修改推送至远程分支
- git push -u origin master
指定默认主机进行关联,这样在推送的时候就不需要在git push后面带任何参数
- git push
将本地分支推送至远程master分支
- git push --force origin git push
如果当前版本低于远程版本,可以使用此命令强制提交,慎用
git diff 文件/版本比较
- git diff
比较当前工作区与暂存区的区别
- git diff --cached / git diff --staged
显示暂存区与最近一次commit之间的比较
- git diff HEAD branchName
显示工作区和指定分支最近一次commit之间的比较
- git diff branch1 branch2 --stat
比较两个分支之间的不同文件差异
- git diff branch1 branch2
比较两个分支之间不同文件的详细差异
- git diff branch1 branch2 file
比较两个分支指定文件之间的差异
git reset 版本回退
使用reset可以将当前commit指向更改为指定的commit进行回退,然后使用–force进行强制提交慎用,因为会丢失提交记录
- git reset --hard commidID
使当前指向指针指向指定的commit,然后使用git push --force强制提交
- 如何找回强制提交后的代码?
git reflog 可以找到本地所有分支的所有操作记录,包含已删除的commit和reset记录
在git reflog中找到所有更改后,再使用git reset --hard commitID更改执行即可
但值的注意的是如果你在强制提交时,没有先拉取别人的代码,那么本地就没有这个commit记录,那么他人的代码依靠你自己本地记录是无法修复的,此时需要和他人沟通,根据他的reflog来进行修复
git revert 代码撤回
对于版本回退最推荐的方式,因为他不会直接更改指针导致commit丢失,而是反做一个版本达到撤销的目的
Git Revert 官方解释
- git revert commitID -m “message”
撤回指定commit版本并生成新的commit
- 通常情况下该命令可以安全撤销指定commit的提交
- 如果遇到冲突,需要先解决冲突,再手动commit提交
- 还有一种情况,如果撤销的是一个经过合并状态的分支,则需要额外带上-m参数,指定需要回退合并的commit
什么意思呢,就是说因为该commit是一个合并的commit,需要你指定具体要回退哪一个commit
我们使用git show 查看这个commit
可以看到这是一个合并的commit,分别是394c430和2922122,我们再使用git log查看提交日志
然后选择要撤销的版本再push即可
git revert 394c430
git push当然,我们也可以采用在git revert -m 后缀的方式进行回退 git revert aa9f4553e47243edc7d12241d135566f3ddcf967 -m 2 这个2是当前commit的第几个父级 通过git log或者git cat-file -p commitID查看 第一个出现的就是1,第二个出现的就是2 上面的截图我们看到第一个是394c430,第二个是2922122 我们要保留2922122,删除394c430,所以需要选择2 git push 就可以完成代码撤销了
git merge 将指定commit合并至当前分支
用于将指定commit合并至当前分支
https://git-scm.com/docs/git-merge
- git merge dev
将远程仓储的dev分支合并至本地
- git merge --abort
在合并冲突时,使用此命令可以终止合并并回到合并前的状态,但如果在合并时有未提交的文件,使用此命令则无法完成回退
建议
- 在merge前先将本地的更改进行储藏git stash
- 或者在merge前先将本地更改提交
- git merge --continue
解决合并冲突后,运行此命令解决合并冲突继续运行
git stash 将当前分支所做的更改进行储藏
- git stash save “stash message”
将当前分支所做更改进行初中那个,默认git stash,但建议带上save “stash message” 方便查找
- git stash list
查看储藏列表
- git stash show stash@{num}
显示储藏所做更改,git stash show默认展示第一个储藏更改,可以查看指定储藏 stash@{通过查看储藏列表可以找到所要查看的编号}
- git stash show stash@{num} -p
显示储藏所做的具体更改,指定编号后,带上-p参数,可以查看储藏的具体更改
- git stash apply stash@{num}
应用某个储藏,但不会将该储藏从列表中删除,如果不指定储藏版本,则默认应用最近的一次储藏
- git stash pop stash@{num}
应用某个储藏,但同时也会将该储藏版本删除,如果不指定储藏版本,则默认应用最近的一次储藏并删除
- git stash drop stash@{num}
丢弃指定版本的储藏
- git stash clcear
丢弃所有储藏
git log 查看当前分支的提交日志
- git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明
- git log -p -num
会显示每次提交所引入的差异(按 补丁 的格式输出)。 你也可以限制显示的日志条目数量,例如使用 git log -p -2 选项来只显示最近的两次提交
- git log --stat
展示每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结
- git log --pretty=oneline
使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如 oneline 会将每个提交放在一行显示,在浏览大量的提交时非常有用。 另外还有 short,full 和 fuller 选项,它们展示信息的格式基本一致,但是详尽程度不一
- git log --pretty=format:"%h - %an, %ar : %s"
可以定制记录的显示格式。 这样的输出对后期提取分析格外有用——因为你知道输出的格式不会随着 Git 的更新而发生改变
git log --pretty=format 常用选项
git clone 将远程仓储克隆至本地
将远程仓库克隆至本地
- git clone url
将指定远程仓储克隆至本地
git 新建分支
- git checkou -b dev
从当前分支复制出新的分支并命名为dev
- git push origin dev
将新建的分支dev推送至远端
- git pull
更新本地仓储
- git branch --set-upstream-to=origin/dev
关联远程分支建立追踪信息
git 删除分支
- git push origin --delete dev
删除远程仓储dev分支
- git branch -d dev
删除本地仓储dev分支
关联远程仓储并推送
git remote add origin git@github.com:timelineHook/nest-pro.git
git branch -M master
git push -u origin master
BitKeeper与Linux,git史前琐事
https://blog.csdn.net/glory1234work2115/article/details/51277402
简单明了的Git入门
https://rogerdudler.github.io/git-guide/index.zh.html