git原理及操作简介

一、Git是什么

Git是目前世界上最先进的分布式版本控制系统

工作原理 / 流程:

git原理
  • Workspace:工作区

  • Index / Stage:暂存区

  • Repository:仓库区(或本地仓库)

  • Remote:远程仓库


二、SVN与Git的最主要的区别?

  • SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

  • Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。


三、Git操作

Git配置(Git Bash)

因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识

git config --global user.name "yourname"
git config --global user.email "your email"

注意:git config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱

1.创建版本库

版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。

使用git init命令即可将当前文件夹变为git管理仓库:

git初始化仓库

这时候你当前testgit目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。

  • 添加与提交

    • 添加命令git add 文件夹or文件
    • 提交命令git commit -m "注释"
  • 查看状态

    • 状态查询命令git status可查看是否还有文件未提交
  • 查看版本差异

    • 比较命令git diff 文件夹or文件名可查看提交版本与之前版本不同之处
  • Git bash 中文乱码处理

    • 更改Git的配置
git config --global core.quotepath false 
2.版本回退
  • 查看提交历史记录

    git log显示从最近到最远的显示日志,按q退出

    git log --pretty=oneline可以将信息整合为单行

  • 回退操作

    • git reset –hard HEAD^回退到上一版本,回退到上上个版本则将HEAD^改为HEAD^^,以此类推(数量过大时使用git reset --hard HEAD~100即可,数字100代表前100个版本)
  • 回退后回到最新版本

    • git reflog可查看历史版本号,git reset –hard 版本号即可恢复相应版本
3.撤销修改
  • 手动删除重新添加或回退到上一版本
  • git checkout -- <file>可丢弃工作区的修改(注意:若无--则变为创建分支)
4.删除文件
  • rm <file>可删除文件,再次commit可彻底删除

  • 在没有commit之前,能使用git checkout -- <file>恢复


四、创建远程仓库

1.创建与添加秘钥

ssh-keygen -t rsa -C “youremail@example.com”创建SSH key

ssh-add id_rsa本地添加密钥验证

github<settings<SSH and GPG keys<SSH keys<New SSH key远程添加公钥

2.创建新仓库
echo "# flask" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:ruishuai123/flask.git
git push -u origin master
3.Push已存在的仓库
git remote add origin git@github.com:ruishuai123/flask.git
git push -u origin master
4.clone远程仓库到本地

复制github远程仓库地址,使用git clone url#远程地址克隆到本地


五、创建与合并分支

1.创建与合并基本操作
  • 查看分支:git branch
  • 创建分支:git branch name
  • 切换分支:git checkout name
  • 创建+切换分支:git checkout –b name
  • 合并某分支到当前分支:git merge name
  • 删除分支:git branch –d name
2.解决冲突
  • 分支同文件内容与主分支不同时会产生冲突,冲突报错后使用git status查看状态

  • 使用cat 可查看该文件不同之处,<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>name 是指分支上修改的内容

  • git log可查看分支合并情况

3.分支管理
  • 合并分支时默认使用Fast forward模式,删除分支后,会丢掉分支信息
  • 建议合并分支时,使用命令 git merge –no-ff -m禁用Fast forward模式,可保留信息

分支策略:首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。

4.bug分支

在开发中,会经常碰到bug问题,那么有了bug就需要修复,在Git中,分支是很强大的,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。

  • 当在某分支工作未完成时,需临时修改bug,可使用git stash将当前工作现场储藏。

  • 在完成bug修复后,切换回原分支,使用git stash list查看储藏内容

  • git stash apply恢复储藏内容,修复后stash内容并不删除,可使用命令git stash drop删除


六、多人协作

当从远程库克隆时,Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin。

  • 要查看远程库的信息 使用 git remote
  • 要查看远程库的详细信息 使用 git remote –v
1.推送分支
  • 推送分支就是把该分支上所有本地提交到远程库中,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:使用命令 git push origin master

  • master分支是主分支,因此要时刻与远程同步

  • 一些修复bug分支不需要推送到远程去,可以先合并到主分支上,然后把主分支master推送到远程

2.抓取分支
  • 开始协作前首先要把dev分支推送到远程
  • 合作者可以在另一台电脑上(注意要把SSH key添加到github上)或者同一台电脑上另外一个目录克隆,要在dev分支上做开发,就必须把远程的origin的dev分支到本地来,可以使用命令创建本地dev分支:git checkout –b dev origin/dev
  • 开发完成后把dev分支推送到远程库,若其他合作者也在同一分支修改同一文件并推送,则会产生冲突,先用git pull(需指定本地dev分支与远程origin/dev分支的链接git branch --set-upstream dev origin/dev)把最新的提交从origin/dev抓下来,然后在本地合并,解决冲突,再推送
3.多人协作工作模式
  1. 首先尝试git push origin branch-name推送修改

  2. 若推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并

  3. 若合并有冲突,则需要解决冲突,并在本地提交,再用git push origin branch-name推送


七.gitignore忽略规则简单说明

  • 被过滤掉的文件不会出现在git仓库中,但任存在于本地库中,只是push的时候不会上传。
*.a       #表示忽略所有 .a 结尾的文件
!lib.a    #表示但lib.a除外
/TODO     #表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/    #表示忽略 build/目录下的所有文件,过滤整个build文件夹;
  • gitignore还可以指定要将哪些文件添加到版本管理中,只需在文件前加上!即可:
!*.zip           #添加所有zip文件
!/mtk/one.txt    #添加mtk目录下的one.txt
  • 若.ignore文件中只有过滤规则,而没有添加规则,就要把目录下除了需忽略的文件外所有的文件都列写出来。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,470评论 0 7
  • 文章来源: http://www.admin10000.com/document/5374.html 版权归属:涂...
    IT码哥阅读 278评论 0 0
  • 三大区域: 工作区 → 缓存区 → 本地仓库 一 、 使用 git config 命令进行配置: git ...
    Manchangdx阅读 2,888评论 0 2
  • 这篇博文是自己在学习git过程中的思考总结。本文仅仅代表个人的看法,如有不妥地方还请本文文末留言。 😊 原文链接g...
    Ming_Hu阅读 1,147评论 4 18
  • 周末参加小朋友作诗的体验课。姐姐说老师能让孩子们半天学会作诗。想着儿子也爱写,写日记还曾用过诗的形式,于是满怀期待...
    Wendy285385551阅读 701评论 4 6