Git 是什么?
那么,简单地说,Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余。 在学习 Git 时,请尽量理清你对其它版本管理系统已有的认识,如 CVS、Subversion 或 Perforce, 这样能帮助你使用工具时避免发生混淆。尽管 Git 用起来与其它的版本控制系统非常相似, 但它在对信息的存储和认知方式上却有很大差异,理解这些差异将有助于避免使用中的困惑。
直接记录快照,而非差异比较
Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方式。 从概念上来说,其它大部分系统以文件变更列表的方式存储信息,这类系统(CVS、Subversion、Perforce、Bazaar 等等) 将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异 (它们通常称作 基于差异(delta-based) 的版本控制)。
+++++++++++++++++++++++++++++++++++++++++++++
1.git是分布式的scm,svn是集中式的。(最核心)
2.git是每个历史版本都存储完整的文件,便于恢复,svn是存储差异文件,历史版本不可恢复。(核心)
3.git可离线完成大部分操作,svn则不能。
4.git有着更优雅的分支和合并实现。
5.git有着更强的撤销修改和修改历史版本的能力
6.git速度更快,效率更高。
基于以上区别,git有了很明显的优势,特别在于它具有的本地仓库。
————————————————
以上加号到此版权声明:本文为CSDN博主「hymKing」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hymking/article/details/53621908
git安装
mac安装git的命令:
第一步:看看git的官网
git下载的网址说明:https://www.git-scm.com/book/zh/v2
第二部:终端安装
brew install git
( 如果brew特别慢,参考下面的方法切换安装源,其他系统可以)
mac系统brew下载安装切换安装源
mac上在 ~/.zprofile中加入这句
export HOMEBREW_BOTTLE-DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles'
然后使其生效
source ~/.zprofile
完成以后显示如下:
git
The Tcl/Tk GUIs (e.g. gitk, git-gui) are now in the git-gui formula.
Subversion interoperability (git-svn) is now in the git-svn formula.
zsh completions and functions have been installed to:
/opt/homebrew/share/zsh/site-functions
Emacs Lisp files have been installed to:
/opt/homebrew/share/emacs/site-lisp/git
git的版本:
git version 2.30.1 (Apple Git-130)
git初始化
第一步 配置
个人信息配置 git config —global —edit
(刷新作者信息) git commit —amend —reset-author
第二步:开始使用 版本控制分步走,本质上是让git管理文件夹
- 进入要管理的文件夹
- 初始化 (提名) git init 生成一个 .git的隐藏文件夹
第三步: 提交到暂存库和本地仓库
- git add filename ( git add . 加入本文件夹所有的文件) # 将本地工作库文件转到暂存库
- git commit -m ‘版本名称’ # 将暂存库文件转到本地仓库
git commit -a 把已经监控过的,且修改过的和删除的文件自动加入暂存库,然后提交到版本库
这里涉及到三个区的概念
三大区: 工作区 暂存区 版本库
工作区是自己正在做的文件 (正在编辑的文件)
暂存区是临时觉得需要保存的版本,但还需考虑是否单独作为一个版本 (准备提交的临时版本)
版本库是一个觉得还可以拿的出手的一个版本 (存为一个版本的文件)
第四步: 查看
git log (查看日志)
git reflog (查看回滚记录)
git branch 查看分支
git log —graph —pretty=format:”%h %s” 图形化展示版本历史记录
第五步: 回滚 (返回到以前的版本)
git reset —hard 版本的哈希码 (通过git log查看对应的哈希码)
在git add 命令后 如何撤销已经加入到暂存区的文件呢?
1.git reset HEAD — . 撤销所有
2. git reset HEAD — filename 撤销特定目标
3.git rm -cached filepath 将文件从缓存中删除 (从暂存区退回到工作区)
++++++
就是提交错了,不应该提交的。
把工作副本更新为最新。
把目标文件或文件夹删除。
再提交,推送。
修改 .gitignore , 把文件或文件夹加上。
再提交,推送。
git commit -a (加入并提交 )一句搞定
Git ignore (忽略部分文件)
- 创建一个.gitignore的文件,用于指定需要忽略的文件或者文件夹
2. 在文件中写入以下内容:
vim .gitignore
a.h (文件名)
b.h (文件名)
*.h (通配符)
files/ (files文件夹下的所有文件)
!a.h (排除a.h)
在github中搜索gitignore, 有高手写好的通用的ignore配置
git的分支与合并
第一步:创建分支 git branch dev
第二步:查看分支 git branch
第三步:切换分支环境 git checkout dev
第四步: 把dev分支合并到当前分支上 git merge dev
第五步: 删除dev分支 git branch -d dev
第六步: merge冲突解决
git会自动在文件中提示冲突的部分,然后手动解决冲突
或者使用beyond compare 工具来做,具体方法如下:
本地安装beyond compare, 这是付费软件,官网安装试用30天
https://www.scootersoftware.com/shop.php 标准版本30USD
然后配置git
git config --local merge.tool bc3 # 给工具起个别名
git config --local mergetool.path '/usr/local/bin/bcomp' #bc的安装目录
git config --local mergetool.keepBackup false # bc不保存备份
第七部: 合并时遇到的问题和警告
warning: 不建议在没有为偏离分支指定合并策略时执行 pull 操作。 您可以在执行下一次
pull 操作之前执行下面一条命令来抑制本消息:
git config pull.rebase false # 合并(缺省策略)
git config pull.rebase true # 变基
git config pull.ff only # 仅快进
这里面涉及到rebase # 变基的问题。
什么是变基,为什么要变基
github 远程仓库
github与git没有任何实质上的绑定关系,只是一个能与git对接的远程仓库而已,也有很多其他的远程库。只是github被微软买了以后,服务还不错。
第一步:github.com上 注册账号 -》brankwong2008 开仓库 -》 推送
新建仓库以后提示:
ssh https://github.com/brankwong2008/paycrm.git
第二步骤:
本机上给远程仓库起别名 git remote add origin https://github.com/brankwong2008/paycrm.git
第三步:向远程仓库推送
推送 git push -u origin master 推送master分支
第四步:从远程仓库完整拷贝到本地
第一次更新 git clone https://github.com/brankwong2008/paycrm.git
第五步:已经有了基本文件后,拉取dev分支的更新
git pull origin dev
等价于:
git fetch origin dev
git merge origin/dev
合并中的警告和冲突报错
warning: 不建议在没有为偏离分支指定合并策略时执行 pull 操作。 您可以在执行下一次
pull 操作之前执行下面一条命令来抑制本消息:
git config pull.rebase false # 合并(缺省策略)
git config pull.rebase true # 变基
git config pull.ff only # 仅快进
git的rebase
场景一:
当多个中间提交版本没有什么意义,需要简化版本的时候,可以使用rebase进行整合。整合的语法有两种:
git rebase -i xxxxxxxx # hardcopy_number 把当前记录到xxxx的n条记录合并
git rebase -i HEAD~3 # 从HEAD指针开始回溯三条记录合并
提示了三条记录信息,需要做一个操作,把第二行和第三行的pick改成s, 表示把s合并到上一个版本,保存退出
然后编辑提交信息, 把版本备注改一下,保存退出,然后合并完成
注意千万不要把已经提交到远程仓库的记录与目前的记录合并
场景二 : 把某个分支合并到主分支,并放弃该分支
第一步到 dev分支
第二部 git rebase master
第三步 checkout master
第四步 git merge dev, 这样就不显示dev分支了
git log --graph --pretty=format:"%h %s" 图形化展示版本历史记录
rebase以后的记录就只显示一个主线了
场景三: 如果两个端都有开发功能,变基合并
如果服务器端开发了一个功能,而没有提交远程,本机也开发了一个功能。此时服务器端从远程pull origin
时会产生分叉,这是应该用rebase将其合并,
不用git pull origin dev (因为等于 git fetch origin dev / git merge dev )
而用:
git fetch origin dev
git rebase origin/dev
注意:如果rebase过程中产生冲突怎么办
git rebase 产生冲突
解决冲突
修改文件
git add .
解决完回来继续
git rebase --continue # 继续变基
git协同开发
- 直接增加一个合作者 : 增加collabator, 对方收到邮件,接受即加入项目组
先新建一个组织,然后把合作者拉入一个组织,组成一个team
github组织间合作 新增一个 organization
echo “# paycrm” >> README.md
git init
git add README.md
git commit -m “first commit”
git branch -M main # 重命名, -M 必须是存在的分支
git remote add origin https://github.com/kaifeng-pals/paycrm.git (普通密码登录方式的url)
git push -u origin main合作者在dev分支上新建一个分支进行自己的开发
git checkout -b dev
git branch doudizhu f
- 开发完以后提交上github,然后pull request,请求doudizhi向dev的合并
- 小组leader审核完毕既可以和dev分支合并
tag 版本号的别名
git tag -a v1.0 -m ‘版本介绍’ 创建版本号
git tag -d v1.0 # 删除版版本号
git push origin —tags 推送到github
git pull origin —tags 从github上获取并更新本地版本号
git checkout v1.0 切换tag
git clone -b v1.0 用指定tag 下载代码
给开源项目贡献代码 fork, pull request
配置文件的三个位置
项目配置文件 /.git/config
git config —local user.name ‘’
git config —local user.email ‘wupeiqi@xx.com’
全局配置文件 : ~/.gitconfig
git config —global user.name ‘wupeiq’
git config —global user.name ‘wupeiqi@xx.com’
系统配置文件 /etc/.gitconfig
免密登录的三种方式
url中加入用户名和密码
https://github.com/WuPeiqi/dbhot.git https://:@github.com/WuPeiqi/dbhot.git
git remote add origin https://:@github.com/WuPeiqi/dbhot.git
git push origin master
ssh 登录方式 公钥和私钥方式
从2021.8.31日以后github从安全起见不支持密码直接登录,只能采用秘钥模式
第一步:在本机生成密钥对ssh-keygen 不断回车在~/.ssh/下生成两个id_ksa.pub id_ksa
把id_ksa.pub的内容拷贝到github
~/.ssh/下的文件说明: id_ksa.pub 公钥 id_ksa 私钥 known_hosts存储登录过的host
第二部:在github的用户logo下拉选择settings,左侧选择SSH and GPG keys
把第一步的拷贝内容添加一个新的key中
第三步:
回到本机再来测试ssh -T git@github.com 连接github
如果显示 authenticate successfully, but cannot provide shell access. 就说明没问题。
第四步:
git remote add homebase git@github.com:brankwong2008/newpaycrm.git
特别注意:ssh登录方式,github.com后面是冒号,不能是/, git的名称是这样的, 中间是冒号
如果原来已经设好了,可以使用如下命令直接修改url
git remote set-url homebase git@github.com:brankwong2008/newpaycrm.git
在这个冒号问题上,花了大概30多分钟的时间,一堆各种解决方案,都是瞎扯。😭
百度有时候是害人不浅。每个团队都应该建立自己独有的wiki
- 生成公钥和私钥
ssh-keygen
在目录 ~/.ssh下生成两个秘钥文件 id_rsa.pub id_rsa
2. 拷贝公钥的内容复制到 github中
3. 在github中配置ssh公钥的内容
获取github的ssh地址,然后使用它
git remote add origin git@github.com/brankwong2008/paycrm.git
git push -u origin master