什么是git?
- git是一款开源的分布式版本控制工具
- 在世界上所有的分布式版本控制工具中,git是最快、最简单、最流行的
- git的起源
- 作者是Linux之父:Linus Benedict Torvalds
- 当初开发git仅仅是为了辅助Linux内核的开发(管理源代码)
git有什么用?
- 在项目开发中,实行版本控制
- 分布式和集中式的最大区别在于:在分布式下
- 开发者可以本地提交
- 每个开发者机器上都有一个服务器的数据库
git工作流程
git的原理介绍
- 如果想了解git的工作原理,有几个核心概念必须知道
- 工作区(Working Directory):仓库文件夹里除.git目录以外的内容
- 版本库(Repository):.git目录,用于存储记录版本信息
- 暂缓区(stage)
- 分支(master):git自动创建的第一个分支
- HEAD指针:用于指向当前分支
- git add和git commit的原理
- git add :把文件修改或者新添加的文件添加到暂存区
- git commit :把暂存区的所有内容提交到当前分支
我们知道Git有 三大区 ( **工作区、暂存区、版本库 **)以及 几个状态 ( untracked、unstaged、uncommited ),下面只是简述下Git的大概工作流程,详细的可以参见本博客的其他有关Git的文章 【链接】 。
(1)打开你的项目文件夹,除了隐藏的.git文件夹,其他项目文件位于的地方便是工作区,工作区的文件需要添加到Git的暂存区(git add),随后再提交到Git的版本库(git commit)。
(2)首次新建的文件都是untracked状态(未跟踪),此时需要git add到暂存区,Git便会在暂存区中生成一个该文件的索引,文件此时处于uncommited状态,需要git commit生成版本库。添加到了版本库之后,再对文件进行修改,那么文件的状态会变为unstaged状态。
git基本使用
命令行相关补充
$ svn help
查看svn所有命令的帮助
$ svn help 子命令
git同上
- 要退出帮助信息,按"q"
- 翻看下页,按"空格"
- 翻看上页,按"CTRL+B"
- 要搜索相关文字,按"/"然后输入"相关文字"
- 退出当前命令行执行,按"CTRL+Z"
git的本地操作
只涉及到本地仓库的概念,commit就是提交到本地仓库的分支,就可以了
- 创建代码库
$ git init - 配置用户名和邮箱
$ git config user.name longxw
$ git config user.email longxw321@gmail.com
以上两个命令会将用户信息保存在当前代码仓库中
# 只有配置了用户和邮箱之后,git才能识别出操作的人员信息,通过钩子(hooks)程序可以设置一些动作
# 例如单元测试发现问题后,自动给相关人员发送电子邮件
# 注意 暂时不建议投入一毛钱精力深入学习git
- 如果要一次性配置完成可以使用一下命令,(全局配置)
$ git config --global user.name longxw
$ git config --global user.email longxw@gmail.com
以上两个命令会将用户信息保存在用户目录下的 .gitconfig 文件中
查看当前所有配置
$ git config -l实际开发中常用命令(重点)
创建代码,开始开发
$ touch main.c
$ open main.c-
将代码添加到代码库
- 查看当前代码库状态
$ git status - 将文件添加到代码库
$ git add main.c - 将修改提交到代码库
$ git commit -m "添加了main.c" - 将当前文件夹下的所有新建或修改的文件一次性添加到代码库
$ git add .
提示:
* 在此一定要使用 -m 参数指定修改的备注信息
* 否则会进入 vim 编辑器,如果对vim不熟悉,会是很糟糕的事情 - 查看当前代码库状态
添加多个文件
$ touch Person.h Person.m
$ git add .
$ git commit -m "添加了Person类"
$ open Person.h
$ git add .
$ git commit -m "增加Person类属性"
- 注意 使用git时,每一次修改都需要添加再提交(良好的习惯),这一点是与svn不一样的
- 别名 & 日志
$ git config alias.st status
$ git config alias.ci "commit -m"
个人建议:除非特殊原因,最好不要设置别名,否则换一台机器就不会用了
查看所有版本库日志
$ git log查看指定文件的版本库日志
$ git log 文件名配置带颜色的log别名
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
提示:在git中,版本号是一个由SHA1生成的哈希值
-
版本号,让我们在任意版本之间穿梭
- 查看分支引用记录
$ git reflog - 回到当前版本,放弃所有没有提交的修改
$ git reset --hard HEAD - 回到上一个版本
$ git reset --hard HEAD^ - 回到之前第3个修订版本
$ git reset --hard HEAD~(3) 可能失效
git reset --hard HEAD@{3} 用这个 - 回到指定版本号的版本
$ git reset e695b67 //可能会因为产生临时文件无法回退
$ git reset 59c58da
Unstaged changes after reset:
M Person.h
$ git reset --hard 59c58da //刚性回退,不会受临时文件影响
- 查看分支引用记录
单个文件的修改管理
$ git diff
1. cat 连续查看文件内容
2. more 分页查看文件内容
cat命令详解
git的远程操作
(除了涉及到本地仓库,还涉及到远程仓库到概念),用push,pull执行简单远程仓库操作
- 建立空白代码库(专门用于团队开发)
$ git init --bare - 建立忽略文件.gitignore
.gitignore可以指定哪些文件不纳入版本库的管理
参考网址:https://github.com/github/gitignore
- 将.gitignore添加到代码库
$ git add .gitignore - 创建项目
提交同时"push"到远程代码仓库
- 新人加入
创建新人分支
- 分支管理,标签
遇到错误
没有加入版本管理
快速解决方案,删除该文件(注意先对该文件备份)
然后添加进去,重新提交,push,就可以了
但是导致以前的版本库文件不存在了
管理多个ssh
- 创建生成多个ssh(公钥和私钥),如
ssh-keygen -t rsa -f ~/.ssh/id_rsa_coding -C “longxw1130@163.com”
注意:id_rsa_coding是生成的公钥和私钥的名字,需要换成自己的
- 在config文件中配置,新建一个config,打开如下配置
#个人coding
Host git.coding.net
User longxw1130@163.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_coding
貌似不在配置也行哦..没配置,系统弹出如下提示,还是配置下好
Warning: Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts.
- 添加进known_hosts(可忽略,原因如下)
ssh-add ~/.ssh/id_rsa_coding
- 注意:
The authenticity of host 'github.com (192.30.252.131)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
选了yes之后,会自动添加内容到known_hosts文件中