目录
前言
版本控制神器git
集中式版本控制与分布式版本控制图解
图解快照原理
图解git三种状态
git命令操作解析
用户身份
检查个人设置
获取git仓库
git仓库中记录变更
查看当前文件状态
暂存已修改的文件
提交变更拉取分支
查看分支,查看git提交记录
分支的使用
分支的总结
分支命令
分支冲突
暂时保存
哈希
关于各个部分如何撤回的问题
合并多个commit
总结
这篇文章都是参考《Pro Git》中文《精通 Git》主要对前三章进行了总结精简,网上有很多文章已经对git进行解释
但是要么不完整不系统,要不互相模仿看着很凌乱,我顺着这本书的思路对git进行简单的剖析,如果是小白对文章仔细
浏览一定会很有收获,文章不像书上那么冗杂,尽可能精简加上我个人理解,都是最常用最重要的东西!如果只想知道
如何使用,可直接通过目录跳转到总结
git是一款分布式版本控制工具,使用这个工具可以轻易的将文件或整个项目恢复到先前的版本,
还可以对比文件随时间的变更,查看什么人最后做出了修改,谁在何时引入了问题,等等,不但
可以恢复原状而且付出的开销也很低。
git大部分操作只需要用到本地资源,一般无需从网络中获取信息,即使断网了仍可以执行几乎所有操作
之前的旧版本也可以在本地直接找到,不像集中控制版本那样多数操作都有网络延时的开销。
优势:
这种方案可以保证不同系统开发人员之间的协作,一定程度上可以掌握其他人在项目中做了什么
管理员可以精细的控制每人权限,但是维护一个集中式版本控制系统的最显著的问题就是,服务器单点故障,
如果服务器宕机一小时,这期间任何人都不能更改提交,如果中央数据库受损,备份也没保住,那么就可能
一无所有。
分布式版本控制系统就是为了解决上述问题,客户端并非是仅仅是检查出最新快照。而是对代码
仓库进行完成的镜像,这样一来不管服务器是否完好,都可以从本地进行恢复,每一次下载库
都是对库的完整备份。
git与其他版本控制系统最大的不同在于对待数据的方式,其他大多数版本控制系统以文件的变化列表
方式存储,将每次储存的信息视为一组文件对这些文件随时间做出变更。
git则更像是将数据视为一个微型文件系统的一组快照,每次提交时,git会抓取一个当前所有文件状态的
快照,然后储存一个指向该快照的引用,高效的地方在于如果文件没有变动,git不会在重新保存文件
而是会留下一个指向先前保存过文件的链接。
快照顾名思义就是相当于一张照片,这个在git回滚的过程用得到,每次的commit就会形成一个id,这个id值就是你项目提交的快照,回滚的时候,找到这次id就能回滚到这次的commit的内容。
快照是整个系统或者应用在某个时刻的状态记录,而不是对文件的存贮
应该理解为对每部分文件最新状态的“指针”
git中文件可以处于三种状态
已提交committed :表示数据以及被安全的存入本地数据库
已修改modifide : 以改动了数据但是尚未提交
已暂存staged : 对已修改的文件当前版本做出了标识并加入了下次以提交的快照中
Git目录(本地仓库)就是最重要的储存项目的地方
工作目录:就是从Git目录下载以供使用或修改
暂存区:其实就是一个索引文件,一般位于Git目录中,它保存了下次所要提交的内容相关信息,其实就是一个索引文件
工作目录(就是拷贝下来的使用的代码)-->使用git add可以添加至缓存区 (暂存待提交的文件信息)
-->git commit 添加至本地仓库(添加到远程仓库前最后一次修改机会)-->git push添加到远程仓库
前三区都在本地称为git的三大区域
git config --global user.name "wang"
git config --global user.email "[email protected]"
安装git后第一件事就是设置用户名和电子邮件地址,因为每次提交都会被写入所创建的提交中。
如果么每次使用不用户可以不见 --global .
git可以使用不同的协议传输数据,https,ssh
使用ssh时必须先配置密钥,但是在以后使用时不需要再重复输密码
需要检测个人配置和身份信息只需在所属用户下使用:git confit --list
//查看用户名
git config user.name
//查看用户邮箱地址
git config user.email
//修改用户名称
git config --global user.name "username"
//修改邮箱地址
git config --global user.email "[email protected]"
在git上建立项目的方式主要有两种,第一个就打本地项目导入git中,第二就是从服务器是clone
一:在现有项中初始化git仓库
对现有项目进程跟踪管理。只需进入目录:
git init
会创建一个.git目录,包含所有构成git仓库的必备文件
然后对项目进行初次提交
git add . //提交当先目录下所有文件
git add LICENSE //获取许可
git commit -m "inital project version" //初始版本提交
二:现有仓库的clone
git clone [URL] 后面路径和生成文件名可以指定,默认当前文件下并使用库名。
对项目进行修改完下一个操作就是向仓库提交这些变更的快照
每一个文件都处于两种状态之一:
已追踪tracked :指的是上次提交快照总包含的文件,这些文件可以分为已修改,未修改,以暂存
未追踪untracked:不在上一次快照中,也不再暂存区的文件(新建文件,在vscoed上使用绿色U标记)
git status
//使用这个命令可以检测当前文件状态
//可以获取当前分支
//列出已跟踪文件中 已修改和以提交的记录
//未跟踪的文件 (尚未提交以备变更的文件)
+ -s 以简约方式显示
+ -u 默认显示所有未跟踪文件
也可以使用 git diff
会打印出所有已经改动的细节,但是只限于未进入暂存区的变更
如果所有文件都进入暂存区则不会有任何输出
在大型的项目很多时候会生成很多相关文件,比如日志文件,编译文件,动态库等等
不需要上传的冗余文件,git提供文件的忽略方式
可以创建名为 .gitignore 的文件
举个例子:
第一行:忽略以.a .o 结尾的文件 第二行:忽略以~结尾的文件,
git add
这个命令主要有两个功能:
1:跟踪未跟踪的文件
2:将文件添加到暂存区
这个命令的理解方式为“添加内容到下一次提交”而不是“把文件加入项目中”
git commit
将缓存区文件推送到Git目录
使用命令时会打开文本编译器添加注释
可直接添加 -m
git commit -m "提交说明"
将远程指定分支 拉取到 本地指定分支上:
git pull origin <远程分支名>:<本地分支名>
git pull
可以直接git pull 更新到最新分支
主分支git pull后其他分支可使用 git merge master 更新
将本地当前分支 推送到 远程指定分支上(注意:pull是远程在前本地在后,push相反):
git push origin <本地分支名>:<远程分支名>
git push 可以直接将本地库提交到远程库
如果远程库已经跟新,应先git pull 更新在git push
因为要确保本地master是最新的,否则出现问题,你的分支可能无法合并
再git rebase master 将master最新的分支同步到本地,这个过程可能需要手动解决冲突(如果进行了上一步的话,只用解决一次冲突)
git branch 查看分支
git log 查看更新记录
git branch -r -D origin/BranchName(删除本地的远程分支:)
git push origin --delete BranchName(远程删除git服务器上的分支)
git branch -m 要改的本地分支名 修改后的分支名(修改本地分支)
git push origin 修改后的分支名:修改后的分支名(push 到远程分支)
git stash
命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,
后续可以在某个分支上恢复出堆栈中的内容。
stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。
git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
git stash --git stash pop
哈希是一个系列的加密算法,各个不同的哈希算法加密强度不同,但是有共同点
如果 git add 进入暂存区后需要撤回暂存
git reset HEAD 文件名 撤销暂存
git checkout -- 文件名 丢弃工作区改动
当我们git commit -m “test” 之后
会提交至本地库,git log可以查看记录
撤销时 git reset --soft HEAD~1
回到提交前 git log 日志也会取消
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
~ 和 ^ 不区分
参数:
--mixed:不删除工作空间改动代码,撤销commit,并且撤销git add .
这个是默认参数,不加参数默认是这个
--soft:不删除工作空间改动代码,撤销commit,不撤销git add .
--hard:删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态
如果仅仅是注释写错了:
修改注释:git commit --amend
在提交时如果本地库有多个commit 备份,push需要合并:
首先git log 查看记录
git rebase -i comitID 所有需要合并项前一项的ID
pick ---》 s 执行到合并
继续修改commit
保存退出
https://blog.csdn.net/u013276277/article/details/82470177
一.基本工作流的使用
* git init 创建新的git仓库
* git clone 克隆
* Git add . 提交自己的改动
* git commit -m 提交代码信息
* git push + 任何自己想推送的分支 推送到分支合并
* git pull 更新本地仓库至最新
二. 其他使用
* git remote add origin
* git log 查看提交的信息
* Git stash 保存当前进度的代码
* git status 查看当前分支
* Git config 可以修改仓库拥有者
三.分支
* 创建一个叫做"feature_x"的分支,并切换过去:
git checkout -b feature_x
* S再把新建的分支删掉:
git branch -d feature_x
* 除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:
git push origin
消除git diff中 ^M的差异
git config --global core.whitespace cr-at-eol
将远程的git仓库的指定分支拉取到本地(本地不存在的分支)
git checkout -b 本地分支命名 origin/远程分支名
若出现提示,先git fetch
如何删除远程仓库
git branch -a
查看远端所有分支
git push origin --delete branch1
新建分支的推送
git push --set-upstream origin testname
远程代码更新之后:
使用git stash 保存本地修改的代码到缓存区,此时代码会还原为没修改之前的,
此时在使用git pull拉取代码,然后使用git stash pop恢复缓存区的代码,此时解决冲突即可提交