git简介
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。分布式版本控制系统没有中央服务器的概念,每个人的电脑上都是一个完整的版本库,git的绝大多数操作都只需要访问本地的文件和资源。 Git 中所有的数据在存储前都计算校验和,然后以校验和来引用。Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。
git的工作原理
git直接记录文件的快照,而非差异,在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件,因此在git中切换分支和代码回退的速度极快。
git的三种状态
Git 有三种状态,你的文件可能处于其中之一: 已提交(committed)、已修改(modified) 和 已暂存(staged)。
- 已修改表示修改了文件,但还没保存到数据库中。
- 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
- 已提交表示数据已经安全地保存在本地数据库中。
git常用命令
1、配置和帮助命令
配置用户名:git config --global user.name “your name”
配置email: git config --global user.email “your email”
配置编辑器:git config --global core.editor vim
git help <verb>
git <verb> -h
2、远程仓库操作
克隆远程仓库:git clone <url>
查看远程仓库的url:git remote -v
查看远程仓库:git remote show origin
同步远程仓库到本地仓库:git pull(在push前,一般要git pull --rebase)
同步本地仓库到远程仓库:git push origin 远程分支名
打tag:git tag -a tag_name commit id(附注标签,不加-a就是轻量标签)(标签的本质就是某次commit的别名,表示某一个开发节点,一般使用附注标签)
3、提交命令
add指定文件:git add 文件名
add所有已经追踪的文件并且修改的文件:git add –u
提交命名:git commit -m
git commit --amend 重新提交是在日志看不到操作记录的
4、代码回退
回退已经修改的代码:git checkout -- file & git checkout .
回退暂存区的代码:git reset HEAD
回退已提交的代码:git reset HEAD^ & git reset commit id --soft/--mixed/--hard
--hard:回退到指定的commit id,工作区和暂存区会被清空,重置程commit id的内容。
--soft:回退到指定的commit id,工作目录的修改不变,暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进暂存区。
--mixed:默认参数回退到指定commit id,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。
5、查看状态和制作patch
查看仓库状态:git status
查看已修改文件的差异:git diff
查看暂存区的差异:git diff --cached
查看提交log:git log
查看某次提交的内容:git log commit id –p
查看某次提交的某个文件的内容:git log commit id –p file
制作patch:git diff commit1 commit2 > patch (与commit1相比,commit2修改的内容)
应用patch:git apply patch
6、分支操作
查看分支:git branch
查看远程分支和本地分支:git branch -al
创建分支:git branch分支名
切换分支:git checkout 分支名
删除分支:git branch -d 分支名
创建和切换分支:git checkout -b 分支名
保存工作区:git stash save “message”
恢复工作区:git stash apply stash@{id}
删除stash的内容:git stash drop stash@{id}
stash有一个应用场景很好用,就是在当前仓库修改代码,但是还没有改完,不能提交,但是又有一个紧急bug需要修复,就可以先stash save暂存起来,修复完了bug,提交代码,再stash apply恢复代码,继续开发,如果有冲突需要手动解决冲突。
同步一个分支的commit到另一个分支:git cherry-pick commit id(需要先切换到待同步的分支)