版本控制是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
Git 不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。
Git有四个工作区域:
- 工作区(Working Directory):平时存放项目代码的地方
- 暂存区(Stage/Index):用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- 资源库(Repository或Git Directory):安全存放数据的位置,这里面有你提交到所有版本的数据
- 远程的git仓库(Remote Directory):托管代码的服务器
Git命令
1、基本信息设置
$ git config --global user.name 'xxx'
$ git config --global user.email 'xxx'
初始化Git仓库:git init
克隆远程仓库:$ git clone [url]
2、分支
创建并切换分支:$ git checkout -b dev
创建分支:$ git branch name
切换分支:$ git checkout name
查看分支:$ git branch
删除dev分支:$ git branch -d dev
合并指定分支到当前分支上:$ git merge dev
把远程的origin的dev分支到本地来: $ git checkout -b dev origin/dev
3、拉取、推送
远程分支的代码pull到本地分支 : git pull
添加到暂存区:$ git add hello.txt
添加当前目录的所有文件到暂存区: $ git add .
把文件提交到仓库:$ git commit -m "hello.txt提交"
推送远程仓库:git push
4、状态
通过命令git status来查看是否还有文件未提交:$ git status
文件改了什么内容:$ git diff hello.txt
查看下历史记录信息:$ git log
获取到版本号:$ git reflog
5、恢复工作区、复制提交、回退
丢弃工作区的修改:$ git checkout -- hello.txt
本地所有修改的,没有的提交的,都返回到原来的状态:$ git checkout .
删除掉没有add到仓库的文件:git clean -d -fx
复制提交:git cherry-pick <id>
回退版本:
git reset --hard <commit_id>
git push origin HEAD --force
6、git stash 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录
查看当前stash中的内容:git stash list
将当前stash中的内容弹出(删除),并应用到当前分支对应的工作目录上:git stash pop
清除堆栈中的所有 内容:git stash clear
查看堆栈中最新保存的stash和当前目录的差异:git stash show
恢复具体某一次的版本,如果不指定stash_id,则默认h恢复最新的存储进度:git stash pop [stash_id]
git reset 和 git revert 区别
git reset --hard :放弃工作区和index的改动,同时HEAD指针指向commit对象,当前版本,我们使用"HEAD^"
git revert :撤销提交,这条命令会把指定的提交的所有修改回滚,并同时生成一个新的提交。用新提交覆盖旧提交,因此,被覆盖的提交等于不会被采用了。
如果两个分支(假设是master和A分支)先合并再用revert回滚,之后又合并(A合并到master),就会发现在master分支上,A分支第一次合并之前的修改大部分不见了。这是因为从时间的发生顺序来看,A分支第一次合并之前的修改发生在revert之前,revert发生在后,而 revert抛弃了A第一合并之前的修改,那么再合并Git就认为你永远抛弃了A第一次之前的修改。