论文笔记:ICLR 2019 How Powerful Are Graph Neural Networks

2023-11-20 15:20

本文主要是介绍论文笔记:ICLR 2019 How Powerful Are Graph Neural Networks,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

虽然 GNN 提供了在深度学习层面解决非欧式空间图结构数据的一系列方法,但人们对其表示学习方法的特点和局限性认识有限。因此作者提出了一个理论框架来分析GNNs 捕获不同图结构的表达能力。作者主要分析了主要的 GNN 方法的辨别力,尤其是 GCN 和 GraphSAGE 并证明它们不能对不同的简单图结构进行区分。并且作者提出了一个新的框架来完成图表示学习并在图级别的分类任务上进行了测试。

论文链接:https://arxiv.org/abs/1810.00826
github:https://github.com/weihua916/powerful-gnns

1. Introduction

1. 1 Weisfeiler-Lehman(WL)算法和WL Test

内容参考于知乎:https://zhuanlan.zhihu.com/p/90645716

GCN模型可以看作图上非常有名的 Weisfeiler-Lehman 算法的一种变形

一维的Weisfeiler-Lehman如下所示:对于任意的节点 v i ∈ G v_i \in \mathcal{G} viG :

  1. 获取节点 v i v_i vi 的所有邻居节点 j j j 的特征 h v j h_{v_{j}} hvj
  2. 更新该节点的特征 h i ← h a s h { ∑ j h v j } h_i \leftarrow hash\{\sum_jh_{v_j}\} hihash{jhvj},其中 h a s h hash hash 是一个单射函数,也就是说对于不同的节点特征一定有不同的消息传递信息
  3. 重复以上步骤 K K K 次直到收敛

事实上,Weisfeiler-Lehman 算法在大多数图上会得到一个独一无二的特征集合,这意味着图上的每一个节点都有着独一无二的角色定位(例外在于网格,链式结构等等)。因此,对于大多数非规则的图结构,得到的特征可以作为图是否同构的判别依据,也就是WL Test(例如两个图是否是同质的,取决于节点的排列方式)。

对于 GCN 的信息传播策略,可以表示为 h v i l + 1 = σ ( ∑ j 1 c i j h v j l W l ) h_{v_i}^{l+1}=\sigma(\sum_j\frac{1}{c_{ij}}h_{v_j}^lW^l) hvil+1=σ(jcij1hvjlWl),其中 c i j = d j d j , j ∈ N i c_{ij}=\sqrt{d_jd_j},j\in N_i cij=djdj jNi N i N_i Ni 是节点 i i i 的邻居节点。 d i , d j d_i,d_j di,dj 分别是节点 i , j i,j i,j 的度。本质上是在模型中使用了对称规范化之后的邻接矩阵 D − 1 2 A D − 1 2 D^{-\frac{1}{2}}AD^{-\frac{1}{2}} D21AD21,可以看出这个传播规则其实是加了参数 W l W^l Wl 后略微变化的 hash函数。如果我们采用合适的非线性函数 σ \sigma σ 然后随机初始化参数矩阵那么这个矩阵就会是正交的,这个更新策略就会非常可靠。这样子我们就可以通过局部图结构中的距离得到非常有意义的平滑嵌入表示。

上述过程举个例子:

在这里插入图片描述

  1. 网络中每个节点有一个label,如图中的彩色的1,2,3,4,5
  2. 标签扩展:只遍历自己的邻居。比如在图(a)网络G中原(5)号节点,变成(5,234),这是因为原(5)节点的一阶邻居有2,3和4
  3. 标签压缩:仅仅只是把扩展标签映射成一个新标签,如 5,234 => 13
  4. 压缩标签替换扩展标签
  5. 数标签:比如在G网络中,含有1号标签2个,那么第一个数字就是2。这些标签的个数作为整个网络的新特征

1.2 Introduction

作者提出了一个理论框架来分析不同的 GNN 方法的表达能力,并且正式地描述了不同的 GNN 方法在学习表示和区分不同图结构时的表达方式。该框架的提出主要是受到 Weisfeiler-Lehman (WL) graph isomorphism test (WL算法)和不同 GNN 的之间的联系所启发。

WL 算法通过聚合当前节点的邻居特征迭代的更新给定的节点特征信息,令 WL 算法具有强大表现能力的原因是因为 WL 算法的聚合函数将不同的邻居节点特征映射到不同的特征空间,这意味着对于一张图中的所有节点来说都有其对应的一个身份属性。也就是说对于大多数非规则的图结构,特征可以作为判断是否图同构的判别依据。

因此判断一个 GNN 方法的表达能力的方法就是对比其是否和 WL 算法一样具有对不同图结构的判别能力。数学形式化上述表述就是,将当前节点的邻居节点集合表示为 m u l t i s e t multiset multiset。之后 GNN 中的聚合函数可以被认为是作用在 m u l t i s e t multiset multiset 上的,因此为了获得更有力的表示信息,GNN 方法必须可以针对于多组 m u l t i s e t s multisets multisets 得到不同的表示结果。作者通过实验发现,当聚合函数对于不同 m u l t i s e t multiset multiset 的判别能力越强则意味着 GNN 方法的表达能力越强。

本文的创新点如下:

  1. 本文证明 GNN 方法在区分不同图结构的能力方面不会超过 WL 算法
  2. 作者通过优化邻居信息聚合函数和以图中所有节点特征生成图特征表示的读出函数实现了与 WL 算法相同性能的 GNN。
  3. 作者证明比较经典的 GNN 方法例如 GCN 和 GraphSAGE不能有效的对简单图的结构进行区分。并且作者对 GCN 和 GraphSAGE 可以捕获的普通图结构进行了描述
  4. 作者提出了一种简单的神经结构 Graph Isomorphism Network (GIN) 图同构网络,并且证明它的判别能力和表达能力和 WL 算法一样强大。

2. Preliminaries

图定义为 G = ( V , E ) G=(V,E) G=(V,E),节点特征定义为 X v X_v Xv。图表示学习主要用于两个基本的任务:图节点分类任务和图分类任务。

  1. 图节点分类任务:每一个节点 v ∈ V v \in V vV 有一个标签 y v y_v yv,目标是根据学习到的节点 v v v 的特征表示 h v h_v hv 来预测节点标签,也就是 y v = f ( h v ) y_v = f(h_v) yv=f(hv)
  2. 图分类任务:给出一个图集合 { G 1 , … , G N } ⊆ G \{G_1,\dots,G_N\} \subseteq \mathcal{G} {G1,,GN}G,它们的标签是 { y 1 , … y N } ⊆ Y \{y_1,\dots y_N\} \subseteq \mathcal{Y} {y1,yN}Y,目标是学习到图的特征表示 h G h_G hG 来完成图分类任务,也就是 y G = g ( h G ) y_G=g(h_G) yG=g(hG)

2.1 Graph Neural Networks

GNN 方法通过图结构和节点特征 X v X_v Xv 来学习节点的特征表示 h v h_v hv 或者是整张图的特征表示 h G h_G hG,现在的 GNN 方法大多数是基于邻居聚合理论,也就是说通过聚合邻居的特征表示迭代的更新当前节点特征,经过 k k k 次聚合之后,节点表示就捕获了图结构中当前节点 k k k-hop 的邻居节点信息。上述过程可以表示为:
a v ( k ) = A G G R E G A T E ( k ) ( { h u ( k − 1 ) : u ∈ N ( v ) } ) h v ( k ) = C O M B I N E ( h v ( k − 1 ) , a v ( k ) ) a_v^{(k)}=AGGREGATE^{(k)}(\{h_u^{(k-1)}:u\in\mathcal{N}(v)\})\\h_v^{(k)}=COMBINE(h_v^{(k-1)},a_v^{(k)}) av(k)=AGGREGATE(k)({hu(k1):uN(v)})hv(k)=COMBINE(hv(k1),av(k))

其中 h v ( k ) h_v^{(k)} hv(k) 代表经过 k k k 层之后节点 v v v 的特征表示。初始设置 h v ( 0 ) = X v h_v^{(0)}=X_v hv(0)=Xv,并且 N ( v ) \mathcal{N}(v) N(v) 代表与节点 v v v 邻接的节点。其中信息聚合函数 A G G R E G A T E ( ⋅ ) AGGREGATE(\cdot) AGGREGATE() 和 信息汇聚组合函数 C O M B I N E ( ⋅ ) COMBINE(\cdot) COMBINE() 是至关重要的。关于信息聚合函数,在 GraphSAGE中定义为:
a v ( k ) = M A X ( { R e L U ( W ⋅ h u ( k − 1 ) ) , ∀ u ∈ N ( u ) } ) a_v^{(k)}=MAX(\{ReLU(W\cdot h_u^{(k-1)}),\forall u \in \mathcal{N}(u)\}) av(k)=MAX({ReLU(Whu(k1)),uN(u)})
类似于一种池化的思想,信息汇聚组合函数被定义为 W ⋅ [ h v ( k − 1 ) , a v ( k ) ] W\cdot[h_v^{(k-1)},a_v^{(k)}] W[hv(k1),av(k)]。在 GCN 中信息聚合函数和信息汇聚组合函数在一步中完成,被定义为:
h v ( k ) = R e L U ( W ⋅ M E A N { h u ( k − 1 ) , ∀ u ∈ N ( v ) ∪ { v } } ) h_v^{(k)}=ReLU(W\cdot MEAN\{h_u^{(k-1)},\forall u \in\mathcal{N}(v)\cup\{v\}\}) hv(k)=ReLU(WMEAN{hu(k1),uN(v){v}})
对于节点分类任务来说,学习到的节点特征信息就可以直接用户分类,但是对于图级别的分类来说,还需要一个 R E A D O U T READOUT READOUT 函数来对最后一次迭代生成的所有节点表示的信息进行聚合得到整张图的特征表示 h G h_G hG,可以描述为:
h G = R E A D O U T ( { h V ( K ) ∣ v ∈ G } ) h_G=READOUT(\{h_V^{(K)}|v \in G\}) hG=READOUT({hV(K)vG})
其中 R E A D O U T READOUT READOUT 函数有多种方法,简单的可以是加和,还可以是更复杂的形式。

2.2 Weisfeiler-Lehman test

图同构问题是判断两个图是否在拓扑结构上相同。这是一个 np 完全问题。除了一些极端情况,图同构的Weisfeiler-Lehman (WL) 检验是一种有效的、计算效率高的方法,用于区分一类广泛的图。它的一维形式类似于 GNNs 中的邻居聚合。WL 算法迭代地进行如下操作

  • (1)聚合节点及其邻域的标签
  • (2)将聚合的标签散列成唯一的新标签。

如果在某一次迭代中两个图之间节点的标签不同,则该算法判定这两个图是非同构的。

基于 WL 算法,近年来提出了 WL 子树核算法,用于度量图之间的相似性。子树核方法使用 WL 算法运行时不同迭代次数的节点标签计数作为图的特征向量。从直观上看,一个节点在 WL 的第 k 次迭代时的标签代表了该节点根高度为 k 的子树结构。因此,WL 子树核考虑的图特征本质上是图中不同根子树的计数。

在这里插入图片描述
从图中可以看出,有根的子树结构(在蓝色节点),WL 使用它来区分不同的图。如果GNN的聚合函数捕获节点邻居的完整 m u l t i s e t multiset multiset,那么 GNN 可以以递归的方式捕获根子树,并且与 WL 算法一样具有强大的图同构的判别能力。

3. Theoretical Framework: Overview

从分析 GNNs 表达能力开始说明作者提出的框架。一个 GNN 递归地更新每个节点的特征向量,以捕获其周围其他节点的网络结构和特征,即其根子树结构。在文中假设节点输入特征来自一个可数的特征空间。对于有限图,任何固定模型较深层的节点特征向量也来自可数的特征空间。为了简化符号,可以为每个特征向量分配一个特殊的标签 { a , b , c … } \{a,b,c\dots\} {a,b,c}。然后,一组相邻节点的特征向量形成一个 m u l t i s e t multiset multiset。由于在不同的 m u l t i s e t multiset multiset 中同一个节点可能含有不同的特征信息,因此一个节点可以出现多次,从这里开始就与传统的 GNN 存在差别,因为同一个节点出现已经不受邻域范围得限制,而是在 m u l t i s e t multiset multiset 中的实际含义

Definition 1 (Multiset) m u l t i s e t multiset multiset 是一个集合的广义概念,它允许它的元素有多个实例。更正式地说,一个 m u l t i s e t multiset multiset 是一个二元组 X = ( S , m ) X = (S,m) X=(S,m),其中 S S S X X X 的基础集合,由不同的元素组成, m : S → N ≥ 1 m: S \rightarrow \mathbb{N}_{\ge1} m:SN1 给出了元素的多重性。

为了研究GNN的表示能力,作者分析了当一个 GNN 方法对于两个不同的节点得到了相同嵌入的情况。直观地说,只有当两个节点具有相同的子树结构和相应节点上相同的特征时,最优的 GNN 才会得到两个节点相同的嵌入结果。由于子树结构是通过节点邻域递归定义的,可以归纳为:一个 GNN 是否将两个邻域(即两个 m u l t i s e t multiset multiset )映射到相同的嵌入。一个最强大的 GNN 永远不会将两个不同的邻域,即多个特征向量集映射到相同的表示。这意味着它的聚合模式必须是单射的。因此,作者将GNN的聚合方法抽象为它们的神经网络可以表示的多集上的一类函数,并分析它们是否能够表示单射多集函数。接下来,作者使用这个推理来提出一个表达能力最强的 GNN。现有 GNNs 的聚合方案本质上不是单射,因此表达能力有限,但它们可以捕获图的其他属性。

4. Building Powerful Graph Neural Networks

作者构建 GNN 方法的假设基础是:表达能力越强大的 GNN 方法可以根据图拓扑结构的不同生成不同的嵌入,也就说对同构图和异构图的学习具有敏感性,其次对比的方法就是前面提到的 WL 算法。论文中指明,如果要使 GNN 与 WL 算法一样具有强大的表达能力,前提条件是邻居聚合函数和图级别的 READOUT 函数均为单射函数,上述表示可以总结为:
h v ( k ) = ϕ ( h v ( k − 1 ) , f ( { h u ( k − 1 ) : u ∈ N ( v ) } ) ) h_v^{(k)}= \phi(h_v^{(k-1)},f(\{h_u^{(k-1)}:u\in\mathcal{N(v)}\})) hv(k)=ϕ(hv(k1),f({hu(k1):uN(v)}))

其中邻居信息聚合函数 f ( ⋅ ) f(\cdot) f() 和 节点信息汇聚更新函数 ϕ ( ⋅ ) \phi(\cdot) ϕ() 均为单设函数。并且对于图级别的 READOUT 函数也就是作用于 h v ( k ) h_v^{(k)} hv(k) 的 READOUT 函数也是单射的。对于可数点集来说,单射是反应一个函数是否可以分辨不同输入的很好的指标。而对于不可数点集,也就是输入的节点是连续的情况下需要进一步讨论,在本文中的基础是节点集是连续的,特征空间和计算映射的特征空间同样是可数的。

理想的 GNN 算法除了判别图的同构,还可以捕获图结构的相似性,WL 算法的节点特征向量本质上是 one-hot 编码,因此无法捕获子树之间的相似性。相反,一个理想的 GNN 算法通过学习将子树嵌入到低维空间来推广 WL 。这使 GNN 不仅能够区分不同的结构,而且能够学习将类似的图结构映射到类似的嵌入,并捕获图结构之间的依赖关系。捕获节点标签的结构相似性对于一般化是有帮助的,特别是当子树的共生在不同的稀疏图上或者边和节点的特征具有噪声的时候。

4.1 Graph Isomorphism Network(GIN)

本文提出的 GIN 的核心出发点在于构建单射函数,因此作者提出两个推论分别是:

  1. 假设 X \mathcal{X} X 是可数结合,存在一个函数 f : X → R n f:\mathcal{X}\rightarrow\mathbb{R}^n f:XRn,基于此可以得到描述节点特征的表达方式 h ( X ) = ∑ x ∈ X f ( x ) h(X)=\sum_{x\in X}f(x) h(X)=xXf(x),其中 X ⊂ X X \subset \mathcal{X} XX X X X 代表上文提到的一个对于当前节点的 M u l t i s e t Multiset Multiset 的 bounded size 的概念。基于此作用于 M l u t i s e t Mlutiset Mlutiset 的函数 g ( ⋅ ) g(\cdot) g() 可定义为 g ( X ) = ϕ ( ∑ x ∈ X f ( x ) ) g(X)=\phi(\sum_{x\in X}f(x)) g(X)=ϕ(xXf(x)) ,在这里 ϕ ( ⋅ ) \phi(\cdot) ϕ() 不是非线性激活函数的概念。
  2. 基于 1,认为 M u l t i s e t Multiset Multiset 的 bounded size 为 X X X,如果将当前节点表示为 c c c,描述节点特征就可以表示为 h ( c , X ) = ( 1 + ϵ ) ⋅ f ( c ) + ∑ x ∈ X f ( x ) h(c,X)=(1+\epsilon)\cdot f(c)+\sum_{x \in X}f(x) h(c,X)=(1+ϵ)f(c)+xXf(x),在这里要注意,因为强调单射的概念,因此对于每一组不同的 ( c , X ) (c,X) (c,X) ϵ \epsilon ϵ 的选择是不同的。完整的形式就可以表示成 g ( c , X ) = ϕ ( ( 1 + ϵ ) ⋅ f ( c ) + ∑ x ∈ X f ( x ) ) g(c,X)=\phi((1+\epsilon)\cdot f(c)+\sum_{x \in X}f(x)) g(c,X)=ϕ((1+ϵ)f(c)+xXf(x))

作者基于这两个推论,作者提出可以用 MLP 来建模和学习 f ( ⋅ ) f(\cdot) f() ϕ ( ⋅ ) \phi(\cdot) ϕ(),并且基于通用近似理论,使用一层的 MLP 来表示 f ( k + 1 ) ∘ ϕ ( k ) f^{(k+1)}\circ\phi^{(k)} f(k+1)ϕ(k)。这么做是因为 MLP 可以表示复合函数。在第一次迭代中,如果输入特征是 one-hot 编码,则在求和前不需要进行 MLP,因为它们单独的求和是单射的(也就是类似于 WL 算法中的形式)。设置一个固定大小的可学习参数 ϵ \epsilon ϵ。然后,(核心内容)GIN 将节点表示更新为:
h v ( k ) = M L P ( k ) ( ( 1 + ϵ ( k ) ) ⋅ h v ( k − 1 ) + ∑ u ∈ N ( v ) h u ( k − 1 ) ) h_v^{(k)}=MLP^{(k)}((1+\epsilon^{(k)})\cdot h_v^{(k-1)}+\sum_{u \in \mathcal{N}(v)}h_u^{(k-1)}) hv(k)=MLP(k)((1+ϵ(k))hv(k1)+uN(v)hu(k1))

相较于经典的 GNNs 方法,GCN 和 GraphSAGE 的方法选择对 h u h_u hu 进行复杂的学习,而不是本文中提出的这种,首先聚合邻居信息然后通过一个单射函数进行表示的概念。

并且作者在公式中对于 M u l t i s e t Multiset Multiset 的处理选择 SUM,原因在于作者认为 MEAN 和 MAX 从本质上来说不是单射的,因此判别能力不强

在这里插入图片描述
从图二可以看出,三种不同的聚合方式有如下特点

  • sum:学习全部的标签以及数量,可以学习精确的结构信息
  • mean:学习标签的比例(比如两个图标签比例相同,但是节点有倍数关系),偏向学习分布信息
  • max:学习最大标签,忽略多样,偏向学习有代表性的元素信息

在这里插入图片描述
从图三可以看出,作者给出了三种情况,MEAN 和 MAX 操作均不能对两种结构进行 100% 的判别,相反 SUM 操作均可以完成判断

总结一下:基于上述阐述,作者放弃了传统 GNNs 方法对于信息聚合函数的复杂操作,转而选择对 M u l t i s e t Multiset Multiset 采取简单的特征 SUM 操作。由此进行信息汇聚之后,通过MLP学习一个单射映射函数来表现 GNN 需要的强大表达能力。并且该方法可以解决传统 GNNs 对于同构图学习能力不强的问题

4.2 Graph-level Readout of GIN

本文给出的 READOUT 范式为
h G = C O N C A T ( R E A D O U T ( { h v ( k ) ∣ v ∈ G } ) ∣ k = 0 , 1 … , K ) h_G=CONCAT(READOUT(\{h_v^{(k)}|v \in G\})|k=0,1\dots,K) hG=CONCAT(READOUT({hv(k)vG})k=0,1,K)

其中 READOUT 函数可以是 SUM 等操作。

5. Experiments

在这里插入图片描述
在这里插入图片描述

这篇关于论文笔记:ICLR 2019 How Powerful Are Graph Neural Networks的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/395573

相关文章

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓