Git是目前最流行的版本管理系统,用于文件管理。
一、Git 版本模型
我们把文件往Git版本库里添加的时候,是分两步执行的:
1、git add
把文件添加进去,实际上就是把文件修改添加到暂存区。
2、git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支(创建Git版本库时,Git自动创建了master
分支; 所以,目前 git commit
就是往master
分支上提交更改;)
可简单理解为,为了防止本地工作区向本地仓库提交过多版本的代码,需要提交的文件修改通通放到暂存区;然后,一次性提交暂存区的所有修改。
每个version都是一次add+一次commit
二、Git常用操作
0. git init
命令创建一个空的Git仓库或重新初始化一个现有仓库。
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
.git里面管理了所有跟git相关的东西,如本地仓库、index等。隐藏文件,怕你不小心给改了。。。
1. git add
若大批量 增、删、改文件,显然一个个添加或删除是不可取的,以下命令可快捷操作暂存区:
git add -A 暂存区与工作区保持一致(stages All)
git add . 暂存区新建文件及更改文件(stages new and modified, without deleted)
git add -u 暂存区删除文件及更改文件(stages modified and deleted, without new)
2. git commit
git commit
如果不指定要提交的文件,默认把暂存区的所有修改提交到分支
也可以不写-m "
(1)写错了,可以改
(2)merge的时候,如果前面添加了很多次message,可以都删掉,统一添加一次message。
3. git status
用来查看仓库的状态,仓库一共有如下状态:
4. git log
(1) 如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明
(2) git log -n 如果不想向上面那样全部显示,可以选择显示前N条。
5. git checkout
(1) checkout最常用的用法是工作分支的切换:
git checkout branchName
该命令会将当前工作分支切换到branchName。另外,可以通过下面的命令在新分支创建的同时切换分支:
git checkout -b newBranch
该命令相当于下面这两条命令的执行结果:
1. git branch newBranch
2. git checkout newBranch
可以通过查看.git/HEAD文件内容,看看当前指向了哪个分支。
(2) 恢复本地工作区
1. git checkout //将index里的filename覆盖到本地工作区,本地工作区内容被冲刷掉
2. git checkout . //将index里的全部文件覆盖到本地工作区,本地工作区内容被冲刷掉
6. git branch
(1)创建一个分支
$ git branch testing
创建完成后并不会将HEAD指针切换到新分支上,需要checkout操作,然后再提交,就是在新分支上操作了
$ git checkout testing
上面两步操作合并简写,新建分支,并将本地HEAD切换到新分支上
$ git checkout -b testing
(2)删除一个分支
$ git branch -d branchname
7. git merge
git-merge命令是用于从指定的commit(s)合并到当前分支的操作,例如把branch1合并到master:
(1)切换到master
(2)git merge branch1
如果A拉下来了branch1,B拉下来了branch2,两个人都做了修改,A先提交,B后提交。
不存在冲突的时候,会自动给合并;
存在冲突的时候,需要后提交的人手动解析冲突
8. git stash/git stash apply
把本地index中的文件移到stash草稿箱中,index清空 / 把本地stash草稿箱中的文件移到index中
如果unindexed的文件也要清空,可以通过git add -A / git add .,再git stash
应用场景:我实际想在branch上面操作,但是我一开始忘了切分支了,一直在master上面操作。然后我突然间发现这个问题:
(1)通过git stash把现在index里面的内容放到草稿箱里
(2)切到branch
(3)通过git stash apply把branch里的东西从stash草稿箱中拿回index中
9. git diff
用于比较两次修改的差异:
(1)比较工作区与暂存区
git diff 不加参数即默认比较工作区与暂存区
(2)比较暂存区与最新本地版本库(本地库中最近一次commit的内容)
git diff --cached [
(3)比较工作区与最新本地版本库
git diff HEAD [
(4)比较工作区与指定commit-id的差异
git diff commit-id [
(5)比较暂存区与指定commit-id的差异
git diff --cached [
(6)比较两个commit-id之间的差异
git diff [
a表示本地工作区(源),b表示暂存区(目的),本地工作区第一行删除line1,第一行添加line,第二行添加line2
接下来这两个命令涉及到远程操作,我们先去github上面建一个远程仓库,然后通过SSH协议把它和本地仓库关联起来。
这两天收到了一封邮件,那么这个邮件说了一件什么事呢?
github分为公共仓库和私有仓库。公共仓库大家都能访问,私有仓库,有几个合作者做一个小项目,不允许外人访问。
github被微软收购之前,私有仓库的业务是收费的。
被微软收购之后有钱了,在限制合作总人数之内,不收费的。
现在变得更阔绰了,不限制合作者的总人数了。。。
如何通过SSH协议把远程仓库和本地仓库关联起来?
Settings -> SSH and GPG keys -> New SSH key -> generating SSH keys -> Generating a new SSH key and adding it to the ssh-agent ->本地输入如下命令,生成带密码的公私钥
$ ssh-keygen -t rsa -b 4096 -C "[email protected]"
-> github中New SSH key中把生成的公钥贴进去
-> 输入如下命令,让本机的这个git仓库和这个SSH key 关联上:
ssh-add "你的 id-rsa 文件地址"
add之后可以用
$ ssh [email protected]
验证是不是添加成功,验证成功出现如下页面:
10. git clone
git clone <目标地址> mydir
目标地址可以是http协议,也可以是ssh协议,因为刚刚已经关联起来了
11. git pull
把远程分支拉到本地分支
12. git push
把本地分支推到远程分支
13. git fetch TD
14. git revert TD
15. git reset TD