git学习笔记

96 阅读9分钟

何为git?

Git是目前世界上最先进的分布式版本控制系统, 为了快速高效地处理小或大型项目的所有内容。通过对信息的压缩和摘要,使得所占空间非常小,但能够支持项目版本迅速迭代的开发工具。

SVN与Git的的区别?

所有的版本控制系统只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

Git的分区

工作区,也叫Working Directory 暂存区,也叫Stage 或 Index 版本库,也叫本地仓库,Commit History

工作区

工作区应该不陌生,就是我们能看见,直接编辑的工作区域。对于一些新增的文件,如果没有被add到暂存区,就会以红色的形式放置在工作区。

暂存区

数据暂时存放的区域,对于执行 add . 后的文件就算是进入暂存区啦。可以理解为数据进入 本地代码仓库 之前存放的区域。由于还没对本地仓库生效,所以是数据暂时存放的区域。 对暂存区的文件修改后,会以蓝色的形式显示。如果第一次创建并add到暂存区的文件,由于远程仓库没有同步,所以会显示绿色。 注:存放在 ".git目录下" 下的index文件 .git/index

版本库

对暂存区的代码执行 commit 会被放入版本库中。可以理解为一个本地的代码仓库push 的时候,才会把版本库的数据全都发送到远程仓库中。 注:存放在工作区中“.git”目录下,.git

图示

|-------|                    |----------------------------------|
| 工作区 |                    | 版本库                            |
|       |                    |  |-----|               |------|  |
|       |--------add-------> |  |index| ---commit---> |master|  |
|       |                    |  |     |               |      |  |
|       |                    |  |-----|               |------|  |
|-------|                    |----------------------------------|

git的指令

创建新的仓库

创建新文件夹,终端进入,然后执行 git init 以创建新的 git 仓库。

检出仓库

执行如下命令以创建一个本地仓库的克隆版本: git clone /path/to/repository 如果是远端服务器上的仓库,你的命令会是这个样子: git clone username@host:/path/to/repository

添加与提交

你可以把文件添加到缓存区,使用如下命令: git add <filename> git add * 然后使用如下命令以实际提交改动: git commit -m "代码提交信息" 现在,你的改动已经提交到了 本地仓库,但是还没到你的 远端仓库

推送改动

你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库git push origin master 当然,可以把 master 换成你想要推送的任何分支。 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加: git remote add origin <server> 如此你就能够将你的改动推送到所添加的服务器上去了。

提交后,查看工作区和版本库里面最新版本的区别: git diff HEAD -- <file-name>

更新与合并

要更新你的本地仓库至最新改动,执行: git pull 以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。 要合并其他分支到你的当前分支(例如 master),执行: git merge <branch-name> 两种情况下,git 都会尝试去自动合并改动。不幸的是,自动合并并非次次都能成功,并可能导致 冲突(conflicts)。 这时候就需要你修改这些文件来人肉合并这些 冲突(conflicts) 了。改完之后,你需要执行如下命令以将它们标记为合并成功: git add <filename> 在合并改动之前,也可以使用如下命令查看: git diff <source_branch> <target_branch>

版本回退

用HEAD表示当前版本,上一个版本就是 HEAD^, 上上一个版本就是 HEAD^^, 当然往上100个版本写100个^比较容易数不过来,所以写成 HEAD~100

例如:后退到上一个版本 git reset --hard HEAD^

后退到指定版本 git reset --hard commit_id

穿梭前,用git log可以查看提交历史, 项目修改过程,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本

撤销操作

  1. 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; 丢弃工作区的修改: git checkout -- filename
  2. 另一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。 把暂存区的修改撤销掉(unstage),重新放回工作区: git reset HEAD <file-name> 然后丢弃工作区的修改: git checkout -- <file-name>

总之,就是让这个文件回到最近一次 git commitgit add 时的状态。可以用 git status 查看一下文件状态。

文件删除

  1. 确定删除 文件中删掉该文件 rm <file-name> git版本中删除 git rm <file-name> 提交 git commit -m "remove <file-name>"
  2. 误删并撤回 文件中误删该文件 rm <file-name> git撤销操作 git checkout -- <file-name>

添加远程库

  • 背景:先有本地库,后有远程库的时候,如何关联远程库 ?
  1. 登陆GitHub,然后在右上角找到 “Create a new repo” 按钮,创建一个新的仓库。

  2. 目前,在GitHub上的这个仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

  3. 现在,我们根据GitHub的提示,在本地的这个仓库下运行命令: git remote add origin git@github.com:wenzonghui/object-name.git

  4. 下一步,就可以把本地库的所有内容推送到远程库上(因为第一次push,要加上 -u) git push -u origin master

  • 把本地库的内容推送到远程,用 git push 命令,实际上是把当前分支 master 推送到远程。 推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样: 从现在起,只要本地作了提交,就可以通过命令: git push origin master 把本地master分支的最新修改推送至GitHub

从远程仓库克隆

  • 背景:假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆
  1. 首先,登陆GitHub,创建一个新的仓库,名字叫 object-name 勾选 Initialize this repository with a README ,这样GitHub会自动为我们创建一个 README.md 文件
  2. 现在,远程库已经准备好了,下一步是用命令 git clone 克隆一个本地库: git clone git@github.com:wenzonghui/object-name.git (注:这个链接可以在guthub上复制下来)
  3. 然后进入 object-name 目录看看,已经有 README.md 文件了.

分支管理

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支上。

图示

       /----------test--------\
      /                        \
-----/------------master--------\----------->
   branch                     merge

创建一个叫做“test”的分支,并切换过去: git checkout -b test 切换回主分支: git checkout master 再把新建的分支删掉: git branch -d test 除非你将分支推送到远端仓库,不然该分支就是不为他人所见的: git push origin <branch-name>

应用

  1. 首先,我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

切换分支另一个属性-switch 我们注意到切换分支使用 git checkout <branch> ,而前面讲过的撤销修改则是 git checkout -- <file> ,同一个命令,有两种作用,确实有点令人迷惑。 实际上,切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的 git switch 命令来切换分支:

创建并切换到新的dev分支,可以使用: $ git switch -c dev

直接切换到已有的master分支,可以使用: $ git switch master

使用新的git switch命令,比git checkout要更容易理解。

  1. 然后,用git branch命令查看当前分支:
$ git branch
* dev
  master

git branch命令会列出所有分支,当前分支前面会标一个*号。

此时,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

Creating a new branch is quick. 然后提交:

$ git add readme.txt 
$ git commit -m "branch test"
[dev b17d20e] branch test
 1 file changed, 1 insertion(+)

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout master
Switched to branch 'master'

切换回master分支后,再查看一下readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变 所有,现在我们要把dev分支的工作成果合并到当前的master分支上:

git merge dev

git merge 命令用于合并指定分支到当前分支。合并后,再查看 readme.txt 的内容,就可以看到,现在 masterdev 分支的最新提交是完全一样的。

合并完成后,就可以放心地删除dev分支了

git branch -d dev

删除后,查看branch,就只剩下master分支了:

git branch

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

标签

在软件发布时创建标签。可以执行如下命令以创建一个叫做 1.0.0 的标签: git tag 1.0.0 1b2e1d63ff 1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。使用如下命令获取提交 ID: git log