小谈GIT原理和使用
小谈GITGit诞生集中式和分布式git指令版本回退Git诞生大家都知道linux 那你知道linux是谁开发的吗? 不错是linus开发的在1991年linus 创建了开源的linux但linux的功能强大的完善却靠的是全世界的热心的代码志愿者完成的在2002年之前代码的管理是由各个大牛们将源代码通过diff的方式发给linus 然后由linus本人来手动合并代码也许你会有疑问为啥不讲这些代码放
Git诞生
大家都知道linux 那你知道linux是谁开发的吗? 不错是linus开发的 在1991年linus 创建了开源的linux
但linux的功能强大的完善却靠的是全世界的热心的代码志愿者完成的 在2002年之前代码的管理是由各个大牛们将源代码通过diff的方式发给linus 然后由linus本人来手动合并代码 也许你会有疑问 为啥不讲这些代码放到版本控制器里 因为linus坚决的反对使用CVS和SVN 这些免费的集中式的版本控制不仅需要连接网络 并且使用速度超级慢 当时也由商用的版本控制管理系统 但这些都是收费的 跟Linus的开源精神不符合
这样的局面一直持续 到2002年 至今为止 Linux开源至今已经10年了 代码库之大已经让Linus 很难通过手工的方法来管理代码 于是Linus 选择了一个商业版的版本控制BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。这样平静的日子一直持续到2005年 Linux社区的兄弟们 在使用BitKeeper的同时 也在破译BitKeeper公司的协议 ( 这件事情还不止一个人在进行 ) 这件事情被BitKeeper公司发现了 于是BitKeeper 公司怒了 要收回Linux社区的免费使用权 Linus大神了 没有办法 也不想向BitKeeper公司低头 于是就花了两周的时间写了一个分布式的版本控制 于是风靡全球的GIT就此诞生了 !!!
集中式和分布式
集中式的版本控制 版本库是放在中央服务器的 我们干活的时候先去中央服务器上进行拉取代码 然后进行修改 再推送到远程 它最大特点是不安全性和低效性
如果中央服务器坏掉了 那么所有的人都不能干活了 它还是必须要有网络的 如果你们再局域网内网速够快的时候还好 如果网路慢 你可能提交一个代码需要5分钟 那还部的憋屈死啊
分布式的版本控制 和 集中式的相比 没有中央服务器的概念 我们那个人自己的电脑就是一个版本控制库 我们在本地可以进行增删改查 还不需要联网 多人协作 比如你修改了一个A文件 你同事B也修改了A文件 你们彼此都在本地进行修改了 不知道彼此改了啥 所以就需要一个中间点 来向你们传达对方修改了什么 这个中间点只是为了方便大家交流修改点 没有它大家一样干活 只是交流不方便而已 这个中间点就是远程服务器上的版本控制
git几个概念
工作区
我们自己电脑上项目的目录 就是我们日常开发的项目
版本库
也叫暂存区
用来管理你的代码的仓库 可以这么理解 相当于是一个目录 这个目录所有的文件均被git管理
git指令
我们的每一次操作都会被git 记录下来 就像一条时间线 每条线上有很多节点 每个节点就代表了我们的操作记录
版本回退
– git log 查看所有提交的日志
– git log --pretty=oneline 日志一行显示
回退到首次提交记录
git resegitt --hard [hardId]
此时的git log中 没有修改首次提交的记录
如果你此时你发现你不用回退版本 还是要用回退前的代码 如果此时你的命令行没有关闭 你可以直接找到最新提交的HEAD 那么直接回退到这个HEAD就行 如果你的命令行窗口关闭了 你不知道你最新的HEAD 那么你需要有用git reflog 查看所i有的记录
git reset --hard HEAD@{10} 回退到指定的版本
git log 查询是所有的正常的操作记录 不会记录回退操作记录
git reflog 查看所有历史版本 由于 查看历史版本信息太多 大多数是为了版本回退和恢复操作使用的
撤销文件
git checkout -- readme.txt
文件没有被保存在暂存区 修改后就是回到编写之前的状态 即跟版本库是一摸一样的
文件已保存在暂存区 修改就是回到添加到暂存区之后的状态
删除文件
rm test.txt
已存在暂存区
未存在暂存区
在status中没有记录
如果你不小删除了文件 可以用 checkout 撤销上一步的操作
git checkout -- test2.txt
关联远程仓库
如果你需要将你的代码作为一个备份 或者让别人来协助你完成 那么你可以在github上建一个远程仓库
当你建完仓库后 需要获取远程的仓库链接 将你的本地项目和远程仓库进行一个关联
git remote add origin https://github.com/sthbb/test-demo.git
接下来就是推送代码了 第一步是将你本地分支和远程的分支进行关联
git push -u origin master
-u 就是进行关连的
以后推送代码直接push就行了
上面 sthbb 就是你自己远程库列表 如果你写成别人的 关连是没有问题的 但是由于ssh不对 密钥不对 那么往远程推送代码是不行的
克隆项目
克隆项目有两种方式 git 和 http 由于git 支持很多种协议 默认的git://使用ssh,但也可以使用https等其他协议。
打标签
git 打标签打在之分支上的
打标签
git tag v1.0
查看标签
git tag
如果你对历史提交记录想打标签 那么你要先找到对应的head 然后在该head上打标签
f52c633 历史head的简写
git tag v0.9 f52c633
查看标签的详细信息
git show v1.0
创建带有说明的tag
-a 标签名 -m 标签说明
git tag -a v0.1 -m "version 0.1 released" 1094adb
删除标签
git tag -d v1.0
将标签推送到远程
git push origin v1.0
将所有的标签推送到远程
git push origin --tags
删除远程tag
先删除本地的tag
git tag -d v1.0
删除远程
git push origin :refs/tags/v0.9
创建并切换分支
查看分支
git branch
创建分支
git branch dev
切换分支
git checkout dev
创建并切换分支
git checkout -b dev
合并分支
在当前分支上合并dev分支
git merge dev
删除分支
git branch -d dev
如果你删除的分支还没有被合并会提示你慎重删除 删除后你的修改将被丢失
强制删除分支
git branch -D dev
由于checkout和撤销操作冲突了 所以在最新版本里面用switch 代替checkout
创建并切换分支
切换分支
git switch -c dev
```typescript
git switch master
代码暂存
我们经常会遇到比如我现在正在开发一个功能 在我自己本地的分支上 突然测试说 发现一个线上bug 需要马上修改 那么你需要暂停你手上现有的工作 去修改 bug 此时你需要把你之前开发的代码存储起来
暂存
git stash
当你修改完线上的bug之后 需要继续你之前的操作
找到你之前暂存代码的stash Id
查看所有的stash
git stash list
恢复代码
一是使用 git stash apply 问题是代码恢复之后 暂存区里面依然有之前的代码
二是使用 git stash pop 恢复并删除之前的代码
在实际开发中 你可能存了很多的stash 恢复的时候 只能恢复一个stash @{0} stash Id
git stash apply stash@{0}
复制某一次提交的内容
比如在master分支上发现你一个bug 你可能从master上切了一个分支来hotfix 等hotfix后又合并到master分支上 但dev分支上并没有你刚刚修改的内容 此时你不想把整个master分支合并到dev分支上 只是想合并刚刚修改的bug
那么你需要找到你commit的id 然后cherry-pick一下
git cherry-pick 4c805e2
这样你就把 4c805e2 上修改的代码的合并了你当前的分支上
远程
查看远程库的信息
git remote
查看远程库的详细信息 如果没有权限就会看不到push的信息 只能看到fetch信息
git remote -v
向远程推送分支
git push origin dev
一种情况是你建立的分支已经和远程进行了关联那么就可以直接推送代码
在本地创建和远程分支对应的分支
git checkout -b dev origin/dev
一种是你建立你的分支和远程没有关联 那么需要你手动进行关联
在实际开发时 比如你准备开发一个功能 在本地拉了一个分支 然后开发完成后 往远程推送
可能会遇到 你修改的代码和你同事修改的代码是一个文件 那么你需要先更新再推送
To github.com:michaelliao/learngit.git ! [rejected] dev -> dev
(non-fast-forward) error: failed to push some refs to
‘git@github.com:michaelliao/learngit.git’ hint: Updates were rejected
because the tip of your current branch is behind hint: its remote
counterpart. Integrate the remote changes (e.g. hint: ‘git pull …’)
before pushing again. hint: See the ‘Note about fast-forwards’ in ‘git
push --help’ for details.
git pull 也报错 说你的本地分支和远程没有进行关联
$ git pull There is no tracking information for the current branch.
Please specify which branch you want to merge with. See git-pull(1)
for details.git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so
with:git branch --set-upstream-to=origin/<branch> dev
与远程进行关联
git branch --set-upstream-to=origin/dev dev
如果你与远程进行关联后 再pull 报冲突 你解决冲突后再重新提交
注意:
- 标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
- git 标签不是按照时间顺序进行排序的 而是按照字母排序的
git log --graph --pretty=oneline --abbrev-commit
可以看到分支的合并情况,包括分支合并图(–graph)、一行显示(–pretty=oneline)、提交校验码缩略(–abbrev-commit)显示
Rebase
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)