git入门

Git是目前最流行的版本管理系统,用于文件管理。

一、Git 版本模型

git入门_第1张图片

  • Remote: 远程仓库(github,gitlab)
  • Respository:本地仓库
  • Workspace:本地工作区
  • Index(stage): 暂存区

我们把文件往Git版本库里添加的时候,是分两步执行的:

1、git add 把文件添加进去,实际上就是把文件修改添加到暂存区。

2、git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支(创建Git版本库时,Git自动创建了master分支; 所以,目前 git commit 就是往master分支上提交更改;)

可简单理解为,为了防止本地工作区向本地仓库提交过多版本的代码,需要提交的文件修改通通放到暂存区;然后,一次性提交暂存区的所有修改。

git入门_第2张图片

 

git入门_第3张图片

                                                             每个version都是一次add+一次commit

 

二、Git常用操作

0. git init

命令创建一个空的Git仓库或重新初始化一个现有仓库。

该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。

git入门_第4张图片

.git里面管理了所有跟git相关的东西,如本地仓库、index等。隐藏文件,怕你不小心给改了。。。

 

1. git add

  • 暂存区操作使用 git add 命令,git add 可以添加单个文件至暂存区。
  • 若新增或更改多个指定文件, 可使用空格分隔多个文件add,如:  git add 1.txt 2.txt 
  • 文件名称也可使用通配符 * 等进行操作,如:  git add *.txt,表示保存所有 .txt 后缀文件至暂存区
  • 工作区删除了文件,若暂存区也须删除,可用  git rm ;暂存区删除文件,可多个,空格分隔
  • 若大批量 增、删、改文件,显然一个个添加或删除是不可取的,以下命令可快捷操作暂存区:

    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 ""     把暂存区的指定文件提交到分支,须输入描述信息

如果不指定要提交的文件,默认把暂存区的所有修改提交到分支

也可以不写-m "",这时候输入git commit 之后会自动跳出来一个文件,把""加到第一行可以起到同样的效果。好处:

(1)写错了,可以改

(2)merge的时候,如果前面添加了很多次message,可以都删掉,统一添加一次message。

 

3. git status

用来查看仓库的状态,仓库一共有如下状态:

git入门_第5张图片

 

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 [...]  如果HEAD指向的是master分支,那么HEAD还可以换成master

(4)比较工作区与指定commit-id的差异

     git diff commit-id  [...] 

(5)比较暂存区与指定commit-id的差异

  git diff --cached [] [...] 

(6)比较两个commit-id之间的差异

     git diff [] []

       git入门_第6张图片

a表示本地工作区(源),b表示暂存区(目的),本地工作区第一行删除line1,第一行添加line,第二行添加line2

 

接下来这两个命令涉及到远程操作,我们先去github上面建一个远程仓库,然后通过SSH协议把它和本地仓库关联起来。

git入门_第7张图片

这两天收到了一封邮件,那么这个邮件说了一件什么事呢?

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协议,因为刚刚已经关联起来了

git入门_第8张图片 

 

11. git pull

把远程分支拉到本地分支

 

12. git push

把本地分支推到远程分支

 

13. git fetch TD

14. git revert TD

15. git reset TD

 

你可能感兴趣的:(开发工具)