官方文档:Github doc

Git 与 SVN 区别

Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
Git 与 SVN 区别点:

  • 1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
  • 2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
  • 3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
  • 4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
  • 5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。


image.png

Git 工作区、暂存区和版本库

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
Git总结 - 图2

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
  • 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个”游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
  • 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
  • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
    • 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
    • 当执行 git rm —cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
    • 当执行 git checkout . 或者 git checkout — 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
    • 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

配置

git 的设置使用 git config 命令。
显示当前的 git 配置信息:

  1. $ git config --list
  2. credential.helper=osxkeychain
  3. core.repositoryformatversion=0
  4. core.filemode=true
  5. core.bare=false
  6. core.logallrefupdates=true
  7. core.ignorecase=true
  8. core.precomposeunicode=true

编辑 git 配置文件:$ git config -e # 针对当前仓库

  1. user.name=luckpoy
  2. user.email=986827989@qq.com
  3. push.default=matching
  4. core.repositoryformatversion=0
  5. core.filemode=true
  6. core.bare=false
  7. core.logallrefupdates=true
  8. remote.origin.url=https://github.com/luckpoy/web_course.git
  9. remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
  10. branch.master.remote=origin
  11. branch.master.merge=refs/heads/master

或者:
$ git config -e —global # 针对系统上所有仓库

  1. [user]
  2. name = luckpoy
  3. email = 986827989@qq.com
  4. [push]
  5. default = matching

设置提交代码时的用户信息:

  1. $ git config --global user.name "runoob"
  2. $ git config --global user.email test@runoob.com

如果去掉 —global 参数只对当前仓库有效。

Git基本命令

提交

git add 添加文件到仓库
git status 查看仓库当前的状态,显示有变更的文件。
git diff 比较文件的不同,即暂存区和工作区的差异。
git commit 提交暂存区到本地仓库。
git reset 回退版本。
git rm 删除工作区文件。
git mv 移动或重命名工作区文件。

远程操作

命令 说明
git remote 远程仓库操作
git fetch 从远程获取代码库
git pull 下载远程代码并合并
git push 上传远程代码并合并

Git 分支管理

创建分支命令:

  1. git branch branchname

切换分支命令:

  1. git checkout branchname

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
合并分支命令:

  1. git merge

删除分支命令:

  1. git branch -d branchname

远程仓库

要添加一个新的远程仓库:

  1. $ git remote add origin git@github.com:michaelliao/learngit.git
  2. # git push -u origin master 第一次提交加-u

删除远程库:

  1. $ git remote rm origin

可以先查看远程信息:

  1. $ git remote -v
  2. origin git@github.com:michaelliao/learn-git.git (fetch)
  3. origin git@github.com:michaelliao/learn-git.git (push)

生成 SSH Key:

  1. $ ssh-keygen -t rsa -C "youremail@example.com"

.gitignore

push忽略文件常用格式:

  1. /mtk/ 过滤整个文件夹
  2. *.zip 过滤所有.zip文件
  3. /mtk/do.c 过滤某个具体文件

还可以指定要将哪些文件添加到版本管理中:

  1. !src/ 不过滤该文件夹
  2. !*.zip 不过滤所有.zip文件
  3. !/mtk/do.c 不过滤该文件

基本语法:
以斜杠/开头表示目录;
以星号*通配多个字符;
以问号?通配单个字符
以方括号[]包含单个字符的匹配列表;
以叹号!表示不忽略(跟踪)匹配到的文件或目录;
此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;
#为注释 可以使用shell所使用的正则表达式来进行模式匹配 。

总结

  1. 提交的文件中不能包含多余的.git文件夹,否则会发生不可预测的问题;
  2. 修改分支名:

image.png(git官方指令)
实操:

  1. web_course git:(main) git branch
  2. * main
  3. web_course git:(main) git branch -m main master
  4. web_course git:(master) git fetch origin
  5. 来自 https://github.com/luckpoy/web_test
  6. * [新分支] master -> origin/master
  7. web_course git:(master) git branch -u origin/master master
  8. 分支 master 设置为跟踪来自 origin 的远程分支 master
  9. web_course git:(master) git remote set-head origin -a
  10. origin/HEAD set to master
  11. web_course git:(master) git branch
  12. * master
  13. web_course git:(master)
  1. 使用git clone 后绑定远程的任务就已经完成了,可以直接推送;