Git与github你必须学习的内容

参考:https://dp2px.com/2019/02/01/git1/

并补充、完善了部分内容。


参考链接:

起步

原理

git使用的是一种分布式的版本控制结构,通过记录文件快照来实现。

Git仓库之间关系

Git仓库之间关系

查看git命令帮助文档

git命令语法说明
  1. 方括号 [] 表示可选项
  2. 尖括号 <> 表示必须项
  3. 或号 | 表示 或,用 |前后2个命令是等价的,注意:这是在语法说明中的含义,而在实际命令行运行环境| 常用于管道操作
help doc
$ git help <verb>
$ git <verb> --help

# man 只能在 linux 中使用,windows系统 gitbash 和 cmder 中均无法使用 
$ man git-<verb>

如果您觉得手册或本书的内容还不够用,您可以尝试在Freenode IRC服务器 https://freenode.net 上的#git#github频道寻求帮助。这些这些命令很棒,因为您随时随地可以使用而无需联网。频道经常有上百人在线,他们都精通Git并且乐于助人。

此外,如果您不需要全面的手册,只需要可用选项的快速参考,那么可以用-h选项获得更简明的“ help”输出:

$ git add -h
usage: git add [<options>] [--] <pathspec>...

    -n, --dry-run         dry run
    -v, --verbose         be verbose

    -i, --interactive     interactive picking
...

基础

获取仓库

创建新仓库git init

初始化后,当前目录下就会多出一个.git的目录,所有git需要的数据和资源都存放在这个目录中。

添加到暂存区,提交到本地库

git add *.java
git commit -m "init project"

克隆仓库:

git clone
# eg
git clone https://github.com/test/gittest.git

这样默认目录会是gittest,如果要更改目录名称可以追加在后面。

git clone https://github.com/test/gittest.git 新仓库名称

运行前配置

查看所有配置信息
# 当前系统所有的git配置文件信息
$ git config --system --list # 或 git config --system -l

# 查看当前用户的git配置文件信息
$ git config --global | --system] --list # 或 git config --global -l

# 查看当前git目录(仓库)的git配置文件信息
$ git config [local] --list # 或 git config [local] -l
配置参数说明
$ git config [local] --list
# Git 当你尝试查看包含变更的比较结果时,所有匹配 astextplain 模式的文件都应该使用“astextplain”过滤器
# eg:diff.word.textconv docx2txt 
# 说明在git中查看word格式文档的差异时,使用 ”docx2txt“ 过滤器将二进制的差异转化为可查看的文本形式的差异,这样用户可以直观的看出 word 格式文档的修改变化,否则用2进制显示差异(默认的过滤器处理)无法直观给用户反馈具体的修改
# 关于过滤器的使用 和 引入原因 详细说明参看:
# https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E5%B1%9E%E6%80%A7
diff.astextplain.textconv=astextplain

# git lfs 默认配置选项 start
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
# git lfs  默认配置选项 end

# htpps 传输后端 为 openssl
http.sslbackend=openssl

# ssl证书位置
http.sslcainfo=D:/develop/versionControl/git/Git/mingw64/ssl/certs/ca-bundle.crt

# “在提交与检出代码的时候均对换行符进行转换,若为false,不处理
# 处理规则:linux/unix 转换为 \n , win 转换为 \r\n
core.autocrlf=true

# 是否将数据缓存到磁盘
# 关于 FS-Cache和CacheFS的区别,见 https://www.cnblogs.com/xuyaowen/p/fscache-and-cachefs.html
core.fscache=true

# git 提交时是否提交符号链接文件
core.symlinks=false

# git 默认的编辑器
core.editor="D:\\soft\\work-tool\\Notepad++\\notepad++.exe" -multiInst -notabbar -nosession -noPlugin

# 用 git-credential-manager 管理 http 凭证存储
# http 凭证存储:即用 HTTP协议 访问远程仓库时,输入的账户密码如何存储,存储在哪儿
# 详述见文末参考
credential.helper=manager

# 邮箱
user.email=2301879213@qq.com

# 用户名
user.name=juejian

# 用于未来能够兼容git版本,决定怎么处理git命令和文件的
# git 存储格式版本,默认 0. 详述参见文末参考
core.repositoryformatversion=0

# Git对文件的访问权限的管理与配置选项core.filemode有关。core.filemode选项默认true,即区分文件的执行权限,校验Git的Index中和工作目录中的文件权限。
# 详述参见文末参考
core.filemode=false

# 当前仓库是否为裸仓库(bare repository) git init --bare 创建
# git init --bare 创建的仓库 core.bare 为 true,其他false (git init)
core.bare=false

# 记录所有的ref更新:决定变更ref时,会不会被记录在`$GIT_DIR/logs/<ref>`目录下
# 值可选项 true | false | always
core.logallrefupdates=true

# Git 忽略文件名大小写
core.ignorecase=true

# 关联的远程库 url
remote.origin.url=git@github.com:juejian/GitTagDemo.git
# 远程库 fetch 指针
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

# 关联的远程库别名为 origin(默认),可自定义
branch.master.remote=origin
# 仓库合并指针
branch.master.merge=refs/heads/master
用户信息(必须)
参数说明文件目录
git config --system对应系统的所有用户的配置/etc/gitconfig文件
git config --global用户目录下的配置~/.gitconfig
git config当前git目录的配置.
git config --global user.name "shuihan"
git config --global user.email lxq_xsyu@163.com

# 省略参数值时,查看配置的用户名和邮箱,其他配置选项的配置和查看类似
git config --global user.name
git config --global user.email

用户名称和电子邮箱,git每次提交的时候都会引用这两条信息,说明是谁提交了代码。

默认编辑器
git config --global core.editor emacs
差异分析工具
git config --global merge.tool vimdiff

添加/提交文件

# 可添加1个/多个/全部文件 到缓存区 (可使用通配符)
git add

# 可提交1个/多个/全部文件 到本地库 (可使用通配符)
git commit

检查文件状态

git status
# 或

# 告诉命令自动暂存已修改和删除的文件,但是没有告诉Git的新文件不会受到影响。
git commit -a
# eg
git commit -a -m "跳过暂存区提交"

移动/重命名文件

# 支持通配符
git mv file_from file_to

删除文件

# 支持通配符
git rm 文件名

查看提交历史

git log

git log 有许多可选项帮助搜寻感兴趣的提交:

显示文件提交的内容差异: git log -p -2 //-2表示仅仅显式最近的两次更新

显示文件提交的内容差异(单词层面比较):git log -p -word-diff -2

修改最后一次提交

有时候我们提交完了,但是发现漏掉了几个文件,或者提交信息写错了,想要撤销刚才的提交,可以使用–-amend 追加提交暂存区

git commit --amend -m "新的提交信息"
# 或 
# 修改提交而不更改其提交消息
git commit --amend --no-edit

取消暂存区的文件

git reset HEAD 暂存区文件名

取消对文件的修改

git checkout -- 已经修改的文件名

查看远程仓库

git remote -v

添加远程仓库

git remote add [shortname] [url]
$ git remote
orign
$ git remote add pb git://github.com/pp/ppt.git
$ git remote -v
orgin git://github.com/test/gittest.git
pb git://github.com/pp/ppt.git

此时,本地仓库没有pb的信息,可以使用 git fetch pb.

修改远程仓库

git remote set-url [shortname] [url]

或者先删除原有仓库地址再添加新地址:

$ git remote rm origin
$ git remote add origin https://gitee.com/jouypub/json.git

从远程仓库抓取数据

git fetch [remote-name]

推送数据到远程仓库

git push origin master

查看远程仓库信息

git remote show origin

关联远程仓库删除和重命名

$ git remote rename 旧别名 新别名

$ git remote rename pb paul
$ git remote
orgin
paul

删除远程仓库可以使用 git remote rm

$ git remote rm paul
$ git remote
orgin

打标签

显示已有标签
# 显示本地标签
git tag 

# 显示远程仓库的标签
git ls-remote --tags origin

可以使用通配符检索

git tag -l 'v1.2.*'
新建标签

git使用的标签有两种:轻量级的和含附注的。

创建轻量级标签:

git tag v1.3.1

创建一个含附注的标签,用 -a

git tag -a v1.3.0 -m "这是版本1.3.0"

可以使用show命令查看相应标签的版本信息: git show v1.3.0

分享标签(远程标签)

默认情况下,git push 并不能把标签传送到服务器,要使用命令:git push origin [tagname]

$ git push origin v1.3.0

如果要把本地所有标签传送上去,可以使用 --tags

$ git push origin --tags
删除标签
# 1.删除本地标签
git tag rd <tagName>
# 2.删除远程标签
git push origin :<tagName>

分支

分支的理解

假设此时我们的工作目录有三个文件,把它们暂存后提交。

第一步:暂存 git使用blob类型的对象存储了这些快照

第二步:提交

git add *
git commit -m "commit three files"

此时git仓库中有5个对象(三个文件快照内容的blob对象,一个记录着目录树内容及其各个文件对应blob对象索引的tree对象,一个指向tree对象的索引和其他提交信息数据的commit对象)

Git分支和目录树

Git分支和目录树

第三步:多做几次修改再提交 后一次提交的commit对象会指向前一次提交的commit对象

img-Git分支和目录树

Git分支和目录树

git中的分支实际上仅仅是一个指向commit对象的可变指针,git会使用master为分支的默认名字,每次提交后master(当前分支)都会自动向前移动。

Git分支和目录树

Git分支和目录树

第四步:创建一个新分支

$ git branch testing

Git分支和目录树

Git分支和目录树

那么git是如何知道你在哪个分支上工作呢?它保留着一个名为HEAD的特别指针。

Git分支和目录树

Git分支和目录树

第五步:切换分支

$ git checkout testing

这样HEAD就指向了testing分支。

分支合并

使用命令 git merge 来合并分支

Git分支和目录树

Git分支和目录树
$ git checkout master
$ git merge hotfix

Fast-forward

合并的时候出现了"Fast-forward"提示,因为此时只需要简单的将指针右移,这种合并称为快进(Fast Forward)

再来看一种情况:

Git分支和目录树

Git分支和目录树
$ git checkout master
$ git merge iss53

这种情况不可能简单的右移指针,会自动创建一个指向它的commit对象(如下图c6),如果有冲突需要合并冲突。

Git分支和目录树

Git分支和目录树

分支管理

git branch命令可以列出当前所有分支清单, 当前分支带 *

$ git branch
* master
work

查看各个分支最后一个提交对象的信息: git branch -v

删除本地分支 git branch -d <branch-name>
删除远程分支 git push <remote-name> --delete <branch-name>

$ git branch -d work
$ git push origin --delete work

工作流程

Git flow

该流程中项目存在两个长期分支。

主分支: master (存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版)

开发分支: develop (用于日常开发,存放最新的开发版)

其次,项目存在三种短期分支。

功能分支(feature branch) 补丁分支(hotfix branch) 预发分支(release branch)

一旦完成开发,它们就会被合并进develop或master,然后被删除。

img-GitFlow

关于Git的工作流其他请阅读 阮一峰 的博客,总结的很详细:

Git 工作流程 Git分支管理策略

补充知识

1.git init 与 git init --bare 的区别

refer

参考

  1. https://dp2px.com/2019/02/01/git1/
  2. 8.2 自定义 Git - Git 属性
  3. git-lfs插件
  4. FS-Cache和CacheFS的区别
  5. Git对库文件权限的管理与filemode配置详解
  6. Git凭证存储 - credentials.helper
  7. git init 与 git init --bare 的区别
  8. 在git中有什么不同的存储库格式版本(用于core.repositoryFormatVersion设置)?
  9. https://blog.zengrong.net/post/delete_git_remote_brahch/
(完)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值