再看git

目录

前言—— git 配置

1、查看配置

(1)、查看关于git配置的帮助(说明文档)

(2)、查看配置

2、增加配置

3、编辑配置

4、删除配置

一、git 基础

1、跟踪新文件

2、检查当前文件状态

3、查看具体修改

4、提交更新

5、移除文件

6、移动文件

7、查看提交历史

8、撤消操作

(1)、取消已经提交的修改

(2)、取消暂存的文件

(3)、取消对文件的修改

9、远程仓库的使用

(1)、查看远程仓库

(2)、添加远程仓库

(3)、切换远程仓库

(4)、从远程仓库中抓取与拉取

(5)、推送到远程仓库

(6)、查看某个远程仓库

(7)、远程仓库的重命名

(8)、远程仓库的移除

10、打标签

(1)、查看标签

(2)、创建标签

(3)、后期打标签

(4)、共享标签

(5)、删除标签

二、Git 分支

1、git 分支简介

2、查看分支

3、分支创建

4、删除分支

5、分支切换

6、分支的合并

(1)、新建分支并合并

(2)、合并分支

(3)、遇到冲突时的分支合并

(4)、案例

7、本地与远程分支建立链接和取消链接

(1)、建立链接

(2)、取消链接

(3)、恢复本地分支与远程分支的关联

(4)、推送本地的新分支到远程仓库

8、变基

9、分支重命名

三、分布式 Git

四、Git 别名

五、Git 内部原理

六、忽略文件

七、git 跳过 ESLint 检查

八、git clone 子模块

1、加载子模块

2、更新子模块


前言—— git 配置

1、查看配置

(1)、查看关于git配置的帮助(说明文档)

git config -h

用法:git config [<options>]

配置文件位置
    --global 使用全局配置文件
    --system 使用系统配置文件
    --local 使用存储库配置文件
    --worktree 使用每个工作树的配置文件
    -f, --file <file> 使用给定的配置文件
    --blob <blob-id> 从给定的 blob 对象读取配置

行动
    --get 获取值:名称 [value-regex]
    --get-all 获取所有值:key [value-regex]
    --get-regexp 获取正则表达式的值:name-regex [value-regex]
    --get-urlmatch 获取特定于 URL 的值:section[.var] URL
    --replace-all 替换所有匹配的变量:名称值 [value_regex]
    --add 添加一个新变量:名称值
    --unset 删除变量:名称 [value-regex]
    --unset-all 删除所有匹配项:name [value-regex]
    --rename-section 重命名部分:旧名称新名称
    --remove-section 删除一个部分:名称
    -l, --list 列出所有
    -e, --edit 打开编辑器
    --get-color 查找配置的颜色:slot [default]
    --get-colorbool 找到颜色设置:slot [stdout-is-tty]

类型
    -t, --type <> 值被赋予这种类型
    --bool 值为“真”或“假”
    --int 值为十进制数
    --bool-or-int 值为 --bool 或 --int
    --path 值是路径(文件或目录名)
    --expiry-date 值是到期日期

其他
    -z, --null 用 NUL 字节终止值
    --name-only 只显示变量名
    --includes 尊重包含查找指令
    --show-origin 显示配置的来源(文件、标准输入、blob、命令行)
    --default <value> 和 --get,缺少条目时使用默认值

(2)、查看配置

git config [–local|–global|–system] -l

命令参数 -list,简写 -l。 

  • 查看仓库级的 config,命令:git config –local -l
  • 查看全局级的 config,命令:git config –global -l
  • 查看系统级的 config,命令:git config –system -l
  • 查看当前生效的配置,  命令:git config -l 

2、增加配置

git config [–local|–global|–system] –add section.key value
// 默认是添加在 local 配置中

参数 -add。 

【注意】 add 后面的 section,key,value 一项都不能少,否则添加失败。

3、编辑配置

git config [–local|–global|–system] -e

命令参数 -edit,简写 -e。 

  • 查看仓库级的config,命令:git config –local -e    //与–list参数不同的是,git config -e默认是编辑仓库级的配置文件。
  • 查看全局级的config,命令:git config –global -e
  • 查看系统级的config,命令:git config –system -e 

【注意】执行这个命令的时候,git 会用配置文件中设定的编辑器打开配置文件。

4、删除配置

git config [–local|–global|–system] --unset value

命令参数 -unset,简写 -u。 

一、git 基础

1、跟踪新文件

将文件存进暂存区。

git add <file>

拓展:

git add .:跟踪当前所有文件。

2、检查当前文件状态

git status

拓展:

git status -s 或 git status -short:状态简览。

3、查看具体修改

git diff

拓展:

git diff --staged 或 git diff --cached:查看已暂存文件与最后一次提交的文件的差异。

4、提交更新

将暂存区的文件提交到本地仓库。

git commit -m ""

拓展:

 git commit -a -m "":跳过使用暂存区域(git 会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤)。

5、移除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(即从暂存区域移除),然后提交。

git rm <file>

【拓展】:

git rm -f <file>:删除之前修改过或已经放到暂存区的文件(不可被修复)。

git rm --cached <file>:把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中(换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪)——当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。

(1)、如何删除远程 gitlab 上的 node_modules 文件夹呢?

若开始没有加 .gitignore 忽略文件,将 node_modules 文件夹提交到了远程的 gitlab 上。
当前在本地新建了 .gitignore 文件。

git rm -r --cached node_modules
git commit -m "remove node_modules dir"
git push

6、移动文件

Git 中对文件改名

git mv <原来的文件名> <新的文件名>

7、查看提交历史

git log

git log 的常用选项

git log --pretty=format 常用的选项

限制 git log 输出的选项

8、撤消操作

(1)、取消已经提交的修改

git commit --amend

例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

最终你只会有一个提交——第二次提交将代替第一次提交的结果。

(2)、取消暂存的文件

git reset --hard HEAD <file>

我们将会在 重置揭密 中了解 reset 的更多细节以及如何掌握它做一些真正有趣的事。

(3)、取消对文件的修改

git checkout -- <file>

记住,在 Git 中任何 已提交 的东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以恢复 (阅读 数据恢复 了解数据恢复)。

9、远程仓库的使用

(1)、查看远程仓库

git remote -v

(2)、添加远程仓库

git remote add <shortname> <url>

(3)、切换远程仓库

git remote set-url origin <url>

(4)、从远程仓库中抓取与拉取

git fetch <remote>

必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。git pull 命令来自动抓取后合并该远程分支到当前分支。

(5)、推送到远程仓库

git push origin <分支名>

(6)、查看某个远程仓库

git remote show origin

(7)、远程仓库的重命名

git remote rename

例如,想要将 pb 重命名为 paul,可以用 git remote rename 这样做:

$ git remote rename pb paul
$ git remote
origin
paul

(8)、修改远程分支名称

git branch -m main master 修改本地分支名称
git push -d origin main 删除远程仓库原分支
git push origin master 提交新分支到远程仓库
git branch --set-upstream-to origin/newBranch 本地分支与远程仓库分支关联

 (9)、远程仓库的移除

git remote remove 或 git remote rm

10、打标签

(1)、查看标签

git tag 或 git tag -l 或 git tag -list

(2)、创建标签

Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。

创建附注标签

git tag -a <标签>

若需要添加注释说明:

git tag -a <标签> -m "说明"

例如: git tag -a v1.4 -m "my version 1.4"

创建轻量标签

git tag <标签>

例如:git tag v1.4-lw

(3)、后期打标签

你也可以对过去的提交打标签。

git tag -a <标签> <哈希版本号>

(4)、共享标签

默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。

git push origin <tagname>

一次性推送很多标签用 --tags

git push origin --tags

(5)、删除标签

git tag -d <tagname>

二、Git 分支

参考官方文档:Git - 分支简介

1、git 分支简介

Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。

举个例子分析一下:假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。

  • 暂存操作会为每一个文件计算校验和(使用 SHA-1 哈希算法),然后会把当前版本的文件快照保存到 Git 仓库中 (Git 使用 blob 对象来保存它们),最终将校验和加入到暂存区域等待提交。
  • 当使用 git commit 进行提交操作时,Git 会先计算每一个子目录(本例中只有项目根目录)的校验和, 然后在 Git 仓库中这些校验和保存为树对象。随后,Git 便会创建一个提交对象, 它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。 如此一来,Git 就可以在需要的时候重现此次保存的快照。

那么,此时 Git 仓库中有五个对象:三个 blob 对象(保存着文件快照)、一个 树 对象 (记录着目录结构和 blob 对象索引)以及一个 提交 对象(包含着指向前述树对象的指针和所有提交信息)。

首次提交对象及其树结构。

  • 做些修改后再次提交,那么这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针。

Git 的分支本质上是指向提交对象的可变指针。

2、查看分支

git branch

拓展:

-a:查看所有分支,包括远程的和本地的。

-v:查看每一个分支的最后一次提交。 

--merged 与 --no-merged:这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。

3、分支创建

Git 是怎么创建新分支的呢? 它只是为你创建了一个可以移动的新的指针。

git branch <分支名>

这会在当前所在的提交对象上创建一个指针。例如:创建一个 testing 分支——git branch testing。

两个指向相同提交历史的分支。

如果两个指向相同提交历史的分支,Git 又是怎么知道当前在哪一个分支上呢?

在 Git 中,有一个名为 HEAD 的特殊指针,指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。

在本例中,你仍然在 master 分支上。 因为 git branch 命令仅仅 创建 一个新分支,并不会自动切换到新分支中去。

HEAD 指向当前所在的分支。

4、删除分支

git branch -d <分支名>

拓展:

若分支中包含未合并的文件,使用 git branch -d 命令删除它时会失败,可以将 -d 改为 -D 来强制删除它。

5、分支切换

要切换到一个已存在的分支。

git checkout <分支名>

我们现在切换到新创建的 testing 分支去:git checkout testing。

HEAD 指向当前所在的分支。

6、分支的合并

(1)、新建分支并合并

新建一个分支并同时切换到那个分支上,你可以运行一个带有 -b 参数的 git checkout 命令:

git checkout -b <分之名>

(2)、合并分支

git merge <分支名>

举个例子:将 B 分支合并到 A 分支

首先查看当前分支,若不是 A 分支,就切换到 A 分支,然后合并分支:git merge B。

别忘了提交代码到远端服务器的 master 分支。

【拓展】当你切换到 A 分支后,现在 git 会提示你去 git pull ... 一下你的代码,尝试了下,发现:切换到 A 分支后,接下来也可以执行 git pull origin B,有冲突解决冲突合并代码,没有的话,为了以防万一,再执行下 git merge B,一般这时 git 会提示你没有更新可共合并,也就是说,此时 A 分支上的版本已经同步到最新的了,然后就可以提交代码了。

(3)、遇到冲突时的分支合并

如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,后者提交代码时就会产生冲突。此时 Git 做了合并,但是没有自动地创建一个新的合并提交。Git 会暂停下来,等待你去解决合并产生的冲突。所以,需要我们手动解决冲突,然后提交对这次冲突的解决。 出现冲突的文件会包含一些特殊区段,看起来像下面这个样子:

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>>

这表示 HEAD 所指示的版本(也就是你的 master 分支所在的位置,因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分(======= 的上半部分),而 iss53 分支所指示的版本在 ======= 的下半部分。 为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内容。

解决完冲突后,输入 git commit 来完成合并后的提交。

(4)、案例

假设你接到一个电话,有个紧急问题等待你来解决。怎么办呢? 你所要做的仅仅是切换回 master 分支。但是,在你这么做之前:

要留意你的工作目录和暂存区里那些还没有被提交的修改, 它可能会和你即将检出的分支产生冲突从而阻止 Git 切换到该分支。 最好的方法是,在你切换分支之前,保持好一个干净的状态。 有一些方法可以绕过这个问题(即:暂存(stashing) 和 修补提交(commit amending)), 我们会在 贮藏与清理 中看到关于这两个命令的介绍。 现在,我们假设你已经把你的修改全部提交了,这时你可以切换回 master 分支了。

7、本地与远程分支建立链接和取消链接

(1)、建立链接

git branch --set-upstream-to=orgin/<远程分支名> <本地分支名>

(2)、取消链接

git branch --unset-upstream <分支名>

(3)、恢复本地分支与远程分支的关联

先执行下:

git fetch

假设:你新建了一个项目,并在 master 分支的基础之上创建了 dev 分支,切换到 dev 分支,开发了一些代码,并提交到了远程分支。然后,你不小心把本地项目彻底移除了,怎么办呢?

首先,去查看在 github 远程仓库中的该项目,发现其存在两个分支,master 分支上没有提交的内容,dev 分支上有完整的提交内容。

然后,将 github 上的该项目 clone 下来,默认应该是 mater 分支,由于 master 分支上并没有提交的内容,所以是空文件夹。

然后,将 github 上的该项目的 dev 分支所有的内容 下载 下来,解压后将其内部文件全部拷贝到刚才 clone 下来的文件夹内,然后提交代码到远程 master 分支,然后切换代码到 dev 分支,此时切换的dev分支就是远程的dev分支了。

写至此,我有个新的思路或许更简单:直接去 github 上的该项目 clone 下来,默认应该是 mater 分支,然后随便改一点东西,提交代码到远程 master 分支,然后切换到 dev 分支,此时的 dev 分支应该是远程的 dev 分支。这样也能重新拿到远程 dev 上的所有内容了。

(4)、推送本地的新分支到远程仓库

git push -u

8、变基

整合分支最容易的方法是 merge 命令。 它会把两个分支的最新快照(C3 和 C4)以及二者最近的共同祖先(C2)进行三方合并,合并的结果是生成一个新的快照(并提交)。

其实,还有一种方法:你可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。 在 Git 中,这种操作就叫做 变基(rebase)。 

将 `C4` 中的修改变基到 `C3` 上。

git rebase <分支名>

将 C4 分支变基到 C3 分支上:

首先查看当前分支,若不是 C4 分支,就切换到 C4 分支,然后变基分支:git rebase C3。(注意,这里与合并(marge)相反。)

然后还需要切换到 master 分支上,进行一次快进合并:

$ git checkout master
$ git merge experiment

`master` 分支的快进合并。

请注意,无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。

变基的风险:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

更多问题请参考:Git - 变基

9、分支重命名

git branch -m 原分支名 新的名字

 

三、分布式 Git

Git - 分布式工作流程

四、Git 别名

如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。 

例如:

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

这意味着,当要输入 git commit 时,只需要输入 git ci。

五、Git 内部原理

Git - 底层命令与上层命令

六、忽略文件

只有先将 .gitignore 的文件提交合并到远程仓库中,在这之后改变的文件 git 才会按照 .gitignore 文件里的规则忽略掉相应的文件,否则无效。

创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。

文件 .gitignore 的格式规范如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。

  • 星号(*)匹配零个或多个任意字符;
  • [abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
  • 问号(?)只匹配一个任意字符;
  • 如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
  • 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。

举个.gitignore 文件的例子:

# 忽略所有的 .a 文件
*.a

# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a

# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO

# 忽略任何目录下名为 build 的文件夹
build/

# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt

# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表

七、git 跳过 ESLint 检查

git commit --no-verify -m "备注"

具体与 git hooks 有关。 

八、git clone 子模块

1、加载子模块

首先将项目 clone 下来,然后 cd 到项目根目录下,然后依次执行下面的命令:

// 子项目初始化:
git submodule update --init --recursive

2、更新子模块

在项目根目录下执行:

git submodule foreach --recursive git checkout master

git submodule foreach git pull

关于 git clone 的使用,可通过 git clone --help 查看其选项的具体用法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值