Skip to content

Latest commit

 

History

History
1109 lines (702 loc) · 25.9 KB

1.git.md

File metadata and controls

1109 lines (702 loc) · 25.9 KB
title date categories tags description
Git
2019-04-10
Git
Git

查看Git配置信息

查看用户名和邮箱地址:

$ git config user.name

$ git config user.email

修改用户名和邮箱地址

$ git config --global user.name "xxxx"

S git config --global user.email "xxxx"

创建服务器端代码仓库

创建 git-test 代码仓库

git --bare init git-test
ShanhongdeiMac:gitserver shanhongfan$ git --bare init git-test

已初始化空的 Git 仓库于 /Volumes/Mechanical/E/Note/study/git/gitserver/git-test/

如果是客户端创建空的仓库

$ git init

检出仓库

执行如下命令以创建一个本地仓库的克隆版本:

git clone /path/to/repository 

如果是远端服务器上的仓库,你的命令会是这个样子:

git clone username@host:/path/to/repository

example:

创建A的代码仓库

git clone https://github.com/fanshanhong/git-demo.git  A

指定本地仓库的目录名称为A

git clone https://github.com/fanshanhong/git-demo.git

本地仓库使用默认的目录名称,一般就是远端服务器仓库的名称,这里是git-demo

在默认情况下,Git会把"Git URL"里目录名的'.git'的后辍去掉,做为新克隆(clone)项目的目录名: (例如. git clone http://git.kernel.org/linux/kernel/git/torvalds/linux-2.6.git 会建立一个目录叫'linux-2.6')

检查远端仓库的配置:

cd A

git remote

Git 将会显示以下信息

origin

git remote 命令的作用是显示本地所关联的远端仓库。因此,以上的输出意味着本地关联了一个叫做 origin 的远端 仓库。那么 origin 的地址是什么呢?我们可以进一步检查远端仓库的配置:

cat .git/config

可以看到如下内容:

ShanhongdeiMac:A shanhongfan$ cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = https://github.com/fanshanhong/git-demo.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main
ShanhongdeiMac:A shanhongfan$ 

origin 其实是一个远端仓库的别名(默认,origin 就指的是远端仓库,这个名字是可以改的),它实际的地址是有.git/config 中的 url 来决定的。因此在 A 的仓库中,origin 这 个别名实际上指向了'https://github.com/fanshanhong/git-demo.git'这个服务器端的代码仓库。

tip:

git clone 会自动将本地仓库连接到远程服务器仓库

如果只执行命令git init ,那只是创建了一个空的git 仓库,没有连接。想要连接的话,需要使用命令git remote add命令来添加一个远程仓库

git remote add origin <server>
git remote add origin https://github.com/fanshanhong/git-demo.git

来验证一下我说的:

ShanhongdeiMac:gitclient shanhongfan$ ls
A	B
ShanhongdeiMac:gitclient shanhongfan$ mkdir init
ShanhongdeiMac:gitclient shanhongfan$ cd init/
ShanhongdeiMac:init shanhongfan$ git init
已初始化空的 Git 仓库于 /Volumes/Mechanical/E/Note/study/git/gitclient/init/.git/
ShanhongdeiMac:init shanhongfan$ ls
ShanhongdeiMac:init shanhongfan$ cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
ShanhongdeiMac:init shanhongfan$ 
ShanhongdeiMac:init shanhongfan$ git remote
ShanhongdeiMac:init shanhongfan$ 

可以看到,config里,并没有url,git remote 也没有打印东西,就是因为我们没有关联到远端。

我们关联一下。使用 git remote add 命令。我这里没有origin这个别名,而是换了一个其他的名字othername

用法:git remote add [<选项>] <名称> <地址>

    -f, --fetch           抓取远程的分支
    --tags                抓取时导入所有的标签和关联对象
                          或不抓取任何标签(--no-tags)
    -t, --track <分支>    跟踪的分支
    -m, --master <分支>   主线分支
    --mirror[=(push|fetch)]
                          把远程设置为用以推送或抓取的镜像
ShanhongdeiMac:init shanhongfan$ git remote add othername https://github.com/fanshanhong/git-demo.git
ShanhongdeiMac:init shanhongfan$ git remote
othername
ShanhongdeiMac:init shanhongfan$ cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "othername"]
	url = https://github.com/fanshanhong/git-demo.git
	fetch = +refs/heads/*:refs/remotes/othername/*
ShanhongdeiMac:init shanhongfan$ 

移除本地缓存已有的remote信息

git remote remove origin 

创建 B 的代码仓库

git clone git@github.com:fanshanhong/git-demo.git  B

修改和提交代码

A 修改代码。A在README文件中添加了:A第一次修改。

ShanhongdeiMac:gitclient shanhongfan$ cd A
ShanhongdeiMac:A shanhongfan$ git status
位于分支 main
您的分支与上游分支 'origin/main' 一致。

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     README.md

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

我先尝试一下 git checkout -- 文件 这个命令、确实是把我的修改给丢弃了诶。

ShanhongdeiMac:A shanhongfan$ git checkout -- README.md 
ShanhongdeiMac:A shanhongfan$ git status
位于分支 main
您的分支与上游分支 'origin/main' 一致。

无文件要提交,干净的工作区

重新修改一下,再提交

ShanhongdeiMac:A shanhongfan$ git add .
ShanhongdeiMac:A shanhongfan$ git commit -m "A第一次提交"
[main 8ce1be7] A第一次提交
 1 file changed, 3 insertions(+)
ShanhongdeiMac:A shanhongfan$ 

此时,REAME修改被提交到本地的代码仓库中。

现在我们将本地的修改推送到服务器端的代码仓库:

ShanhongdeiMac:A shanhongfan$ git push
Username for 'https://github.com': 443710231@qq.com
Password for 'https://443710231@qq.com@github.com': 
枚举对象: 5, 完成.
对象计数中: 100% (5/5), 完成.
写入对象中: 100% (3/3), 298 bytes | 298.00 KiB/s, 完成.
总共 3 (差异 0),复用 0 (差异 0)
To https://github.com/fanshanhong/git-demo.git
   75b20a4..8ce1be7  main -> main
ShanhongdeiMac:A shanhongfan$ 

我这里不知道为啥分支是 main? 一般默认分支都是master

发现了:在这里设置的,也可以修改的。

git push 命令的作用是将本地仓库中的分支推送到远端仓库并与远端分支合并, 它的用法如下: git push <远端仓库> <远端分支>或 git push

当使用 git push <远端仓库> <远端分支>的时候,git 将当前的本地分支推送到<远端仓库>中的<远端分支>例如:

git push origin master

意味着将当前分支推送到 origin 中的 master 分支。

当使用 git push 的时候,git 会使用哪个<远端仓库>与<远端分支>呢? 首先,我们再次查看.git/config 文件

ShanhongdeiMac:A shanhongfan$ cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = https://github.com/fanshanhong/git-demo.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main

我们发现我的本地的 main 分支,它的 remote 为 origin。这意味着,当推送本地的 main 分支的时候,git 会向 origin 仓库推送。但是要推送到 origin 仓库中的哪个分支呢?答案是:git 默认会推送到同名的分支中去,也就是说 git 会将本地的 main 分支推送到远端的 origin/main 中去 。

因此,如果本地的分支为 topic/a,那么 git push 等价于 git push origin topic/a。

注意:

在大多数情况下,我们只需要使用 git push

我们尝试一下。

ShanhongdeiMac:A shanhongfan$ git checkout -b tt
切换到一个新分支 'tt'
ShanhongdeiMac:A shanhongfan$ git push 
fatal: 当前分支 tt 没有对应的上游分支。
为推送当前分支并建立与远程上游的跟踪,使用

    git push --set-upstream origin tt

ShanhongdeiMac:A shanhongfan$ git push --set-upstream origin tt
Username for 'https://github.com': 443710231@qq.com
Password for 'https://443710231@qq.com@github.com': 
枚举对象: 4, 完成.
对象计数中: 100% (4/4), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 322 bytes | 107.00 KiB/s, 完成.
总共 3 (差异 0),复用 0 (差异 0)
remote: 
remote: Create a pull request for 'tt' on GitHub by visiting:
remote:      https://github.com/fanshanhong/git-demo/pull/new/tt
remote: 
To https://github.com/fanshanhong/git-demo.git
 * [new branch]      tt -> tt
分支 'tt' 设置为跟踪来自 'origin' 的远程分支 'tt'。

这样在远程服务器就有了tt分支

修改后再提交,git push 命令成功推到tt分支

ShanhongdeiMac:A shanhongfan$ vim a.txt 
ShanhongdeiMac:A shanhongfan$ git add .
ShanhongdeiMac:A shanhongfan$ git commit -m "尝试推送到tt分支"
[tt 1b9dc8c] 尝试推送到tt分支
 1 file changed, 1 insertion(+)
ShanhongdeiMac:A shanhongfan$ 
ShanhongdeiMac:A shanhongfan$ git push
Username for 'https://github.com': 443710231@qq.com
Password for 'https://443710231@qq.com@github.com': 
枚举对象: 5, 完成.
对象计数中: 100% (5/5), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 298 bytes | 298.00 KiB/s, 完成.
总共 3 (差异 0),复用 0 (差异 0)
To https://github.com/fanshanhong/git-demo.git
   4ab2b2f..1b9dc8c  tt -> tt
ShanhongdeiMac:A shanhongfan$ 

这里有一个关于写commit注释的技巧和大家分享:commit注释最好以一行短句子作为开头,来简要描述一下这次commit所作的修改(最好不要超过50个字符);然后空一行再把详细的注释写清楚。这样就可以很方便的用工具把commit注释变成email通知,第一行作为标题,剩下的部分就作email的正文。

B 提取代码

假设 A 推送代码之后通知 B 将服务器端的代码更新到本地,那么 B 可以通过以下操作来提取代码:

ShanhongdeiMac:gitclient shanhongfan$ cd B
ShanhongdeiMac:B shanhongfan$ git pull 
remote: Enumerating objects: 11, done.
remote: Counting objects: 100% (11/11), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 9 (delta 0), reused 9 (delta 0), pack-reused 0
展开对象中: 100% (9/9), 完成.
来自 github.com:fanshanhong/git-demo
   75b20a4..8ce1be7  main       -> origin/main
 * [新分支]          tt         -> origin/tt
更新 75b20a4..8ce1be7
Fast-forward
 README.md | 3 +++
 1 file changed, 3 insertions(+)
ShanhongdeiMac:B shanhongfan$ ls
README.md
ShanhongdeiMac:B shanhongfan$ cat README.md 
# git-demo
git demo


A第一次修改

git pull 命令的作用是将远端仓库的远端分支下载到本地, 并将下载的远端分支合并到本地的分支中。 它的 用法如下: git pull <远端仓库> <远端分支>或 git pull

当使用 git pull <远端仓库> <远端分支>的时候,git 将<远端仓库>/<远端分支>提取到本地,然后与当前分支合并。 例如:

git pull origin master

意味着 git 会:1)将 origin/master 下载到本地,2)再将 origin/master 与当前分支合并

当使用 git pull 的时候,git 会从使用哪个<远端仓库>与<远端分支>呢?首先,我们再次查看.git/config

ShanhongdeiMac:B shanhongfan$ cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = git@github.com:fanshanhong/git-demo.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main

remote = origin,(因为origin 是 remote的别名)意味着当前分支(main)会从 origin 远端仓库提取分支。 fetch = +refs/heads/:refs/remotes/origin/,意味着会将远端仓库中所有位于 refs/heads 目录下的分支下载到本地 的 refs/remotes/origin 目录下面 merge = refs/heads/main,意味着 git 会将远端仓库中 refs/heads 目录下的 main 分支与当前分支合并。 因此,在默认情况下,当使用 git pull 时,git 会:1)从当前分支 remote 属性指定的远端仓库下载所有的分支 2) 将当前分支 merge 属性所指定的远端分支合并到当前分支。 在本例中,git pull 等价于 git pull origin main。

那如果我切换到tt分支呢?

ShanhongdeiMac:B shanhongfan$ git checkout tt
分支 'tt' 设置为跟踪来自 'origin' 的远程分支 'tt'。
切换到一个新分支 'tt'
ShanhongdeiMac:B shanhongfan$ cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = git@github.com:fanshanhong/git-demo.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main
[branch "tt"]
	remote = origin
	merge = refs/heads/tt

可以看到,切换到tt分支(git checkout tt)后,再查看.git/config 文件,里面展示了 tt分支的remote 和 merge 属性

那,在tt分支上执行 git pull ,就是:

1)从tt分支 remote 属性(remote=origin)指定的远端仓库下载所有的分支

2) 将tt分支 merge 属性所指定的远端分支(也就是refs/heads/tt)合并到当前分支(tt)

这样就懂了哦

注意:

在大多数情况下,我们只需要使用 git pull

我们可以用 git branch 命令显示所有的本地分支

ShanhongdeiMac:B shanhongfan$ git branch 
  main
* tt

git branch -a 可以同时查看本地分支,当前分支,以及显示所有下载到本地的远端分支。

ShanhongdeiMac:B shanhongfan$ git branch -a
  main
* tt
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/tt
切换分支
> git checkout 分支名

我们可以用 git remote 命令显示所有的远端仓库。

ShanhongdeiMac:B shanhongfan$ git remote

origin
ShanhongdeiMac:B shanhongfan$ cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = git@github.com:fanshanhong/git-demo.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main
[branch "tt"]
	remote = origin
	merge = refs/heads/tt

[remote "origin"] – 表示此处配置一个远端仓库,本地名称为 origin。

url = git@github.com:fanshanhong/git-demo.git - 表示 origin 远端仓库的内容来源于 git@github.com:fanshanhong/git-demo.git

fetch = +refs/heads/:refs/remotes/origin/ - 表示在本地执行 git pull origin 的时候,git 会先将远端仓库的 refs/heads/* 下载到本地的 refs/remotes/origin/*中。

[branch "main"] - 表示此处配置一个本地分支,分支名称为 main。

remote = origin - 表示本地的 main 分支与 origin 远端仓库关联

git pull 是先fetch,再merge。那git 会先将远端仓库的 refs/heads/* 下载到本地的 refs/remotes/origin/*中 ,然后 merge = refs/heads/main - 表示git 会将 从origin.url/heads/main 下载下来的分支与本地的 main 合并。

B 修改代码

ShanhongdeiMac:B shanhongfan$ vim README.md 
ShanhongdeiMac:B shanhongfan$ 
ShanhongdeiMac:B shanhongfan$ git commit -m "B第一次修改"
位于分支 main
您的分支与上游分支 'origin/main' 一致。

尚未暂存以备提交的变更:
	修改:     README.md

修改尚未加入提交
ShanhongdeiMac:B shanhongfan$ git add .
ShanhongdeiMac:B shanhongfan$ git commit -m "B第一次修改"
[main 63643f5] B第一次修改
 1 file changed, 2 insertions(+), 1 deletion(-)
ShanhongdeiMac:B shanhongfan$ git push
枚举对象: 5, 完成.
对象计数中: 100% (5/5), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 307 bytes | 307.00 KiB/s, 完成.
总共 3 (差异 0),复用 0 (差异 0)
To github.com:fanshanhong/git-demo.git
   8ce1be7..63643f5  main -> main
ShanhongdeiMac:B shanhongfan$ 

A,B 同时修改代码

B修改后,A没拉代码,就相当于AB同时修改了。这样可能会冲突,试试

ShanhongdeiMac:A shanhongfan$ pwd 
/Volumes/Mechanical/E/Note/study/git/gitclient/A
ShanhongdeiMac:A shanhongfan$ git checkout main
切换到分支 'main'
您的分支领先 'origin/main' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)
ShanhongdeiMac:A shanhongfan$ vim README.md 
ShanhongdeiMac:A shanhongfan$ 
ShanhongdeiMac:A shanhongfan$ git add .
ShanhongdeiMac:A shanhongfan$ git commit -m "A第二次修改"
[main 6648a9f] A第二次修改
 1 file changed, 2 insertions(+), 1 deletion(-)
ShanhongdeiMac:A shanhongfan$ 
ShanhongdeiMac:A shanhongfan$ git push
Username for 'https://github.com': 443710231@qq.com
Password for 'https://443710231@qq.com@github.com': 
To https://github.com/fanshanhong/git-demo.git
 ! [rejected]        main -> main (fetch first)
error: 推送一些引用到 'https://github.com/fanshanhong/git-demo.git' 失败
提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。
ShanhongdeiMac:A shanhongfan$ 

这个错误意味着,git-server 中的 refs/heads/main 的版本比本地的 refs/heads/main 的版本新,因此不允许推送。

此时,我们应该尝试提取服务器上最新的代码并将代码合并到本地的分支中:按照他的提示做就好了。

ShanhongdeiMac:A shanhongfan$ git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 完成.
来自 https://github.com/fanshanhong/git-demo
   8ce1be7..63643f5  main       -> origin/main
自动合并 README.md
冲突(内容):合并冲突于 README.md
自动合并失败,修正冲突然后提交修正的结果。
ShanhongdeiMac:A shanhongfan$ 

可以看到REAME.md文件冲突了,并且自动合并失败了,我们来看一下

ShanhongdeiMac:A shanhongfan$ git status
位于分支 main
您的分支和 'origin/main' 出现了偏离,
并且分别有 2 和 1 处不同的提交。
  (使用 "git pull" 来合并远程分支)

您有尚未合并的路径。
  (解决冲突并运行 "git commit")
  (使用 "git merge --abort" 终止合并)

未合并的路径:
  (使用 "git add <文件>..." 标记解决方案)

	双方修改:   README.md

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
ShanhongdeiMac:A shanhongfan$ 

README.md中的内容

# git-demo
git demo


A第一次修改。
<<<<<<< HEAD
A第二次修改。
=======
B第一次修复。
>>>>>>> 63643f5db368aa62765ff4dc99bf557a30259715

处理冲突后提交

ShanhongdeiMac:A shanhongfan$ vim README.md 
ShanhongdeiMac:A shanhongfan$ 
ShanhongdeiMac:A shanhongfan$ git add .
ShanhongdeiMac:A shanhongfan$ git commit -m "处理冲突"
[main d103e18] 处理冲突
ShanhongdeiMac:A shanhongfan$ git push
Username for 'https://github.com': 443710231@qq.com
Password for 'https://443710231@qq.com@github.com': 
枚举对象: 10, 完成.
对象计数中: 100% (10/10), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (6/6), 完成.
写入对象中: 100% (6/6), 625 bytes | 312.00 KiB/s, 完成.
总共 6 (差异 1),复用 0 (差异 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/fanshanhong/git-demo.git
   63643f5..d103e18  main -> main
ShanhongdeiMac:A shanhongfan$ 

B 提取代码

ShanhongdeiMac:B shanhongfan$ pwd
/Volumes/Mechanical/E/Note/study/git/gitclient/B
ShanhongdeiMac:B shanhongfan$ git pull
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 8 (delta 1), reused 8 (delta 1), pack-reused 0
展开对象中: 100% (8/8), 完成.
来自 github.com:fanshanhong/git-demo
   63643f5..d103e18  main       -> origin/main
   1b9dc8c..b93da16  tt         -> origin/tt
更新 63643f5..d103e18
Fast-forward
 README.md | 1 +
 a.txt     | 0
 2 files changed, 1 insertion(+)
 create mode 100644 a.txt
ShanhongdeiMac:B shanhongfan$ cat README.md 
# git-demo
git demo


A第一次修改。
A第二次修改。
B第一次修复。
ShanhongdeiMac:B shanhongfan$ 

注意:

更新合并成功,因为 B 已经解决了冲突并将解决后的版本推送到了服务器。

直接运行 gitk 查看版本树。或者用source tree 看也可以

浏览提交历史

Git 的历史记录是由一系列彼此关联的提交(commit)记录构成的。与传统的版本管理工具不同,Git 不是通过版本号来表示提交记录的。Git 为每一个提交 记录分配一个 40 位的 16 进制数字来学标识它,不难理解,这串数字一定是唯一的。

在任何时刻,你都可以通过以下命令查看提交的历史记录

git log

如果你希望同时显示每一步的修改内容,可以使用:

git log -p

其中 p 是"patch"的缩写,意思是输出补丁。 很多时候,显示历史记录的概要内容就可以帮助我们大概了解每一次提交所做的改动:

git log --stat --summary
$ git log --pretty=format:'%h : %s' --graph

--graph 可视化提交视图

我们可以通过 git show 命令来查看某个提交的具体内容:

git show aa1e89f0ab6085f7cafc34cf970837b2fffdda2e

可以使用字符串前导部分,只要这部分字符串足够长不会与其他的提交记录重复:

git show aa1e
  • 使用 HEAD 变量:

    git show HEAD
    

    HEAD 是一个系统的变量(我们称之为分支末端),它的值是当前分支中最后一条提交记录的标示符

    因此,默认情况下,git show HEAD 等价于 git show

• 使用分支名:

git show master

在 git 中,分支名等价于分支最后一条提交记录的标示符

我们可以通过以下方式来访问提交记录的祖先节点:

显示 HEAD 的父节点

git show HEAD^

显示 HEAD 的 2 级祖先节点

git show HEAD^^

显示 HEAD 的 4 级祖先节点

git show HEAD~4

验证一下:是看那条蓝色的线。

ShanhongdeiMac:B shanhongfan$  git show HEAD^
commit 6648a9ff12acf059edd73d9320025159db170ccc
Author: fanshanhong <443710231@qq.com>
Date:   Tue Oct 13 16:50:47 2020 +0800

    A第二次修改

diff --git a/README.md b/README.md
index 0840dd7..962a28a 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,5 @@
 git demo
 
 
-A第一次修改。
\ No newline at end of file
+A第一次修改。
+A第二次修改。
ShanhongdeiMac:B shanhongfan$ git show HEAD^^
commit 4ab2b2fc4f6b448308858e69e7fe06a9f3d187d4
Author: fanshanhong <443710231@qq.com>
Date:   Tue Oct 13 15:18:11 2020 +0800

    添加了一个a.txt,测试一下push命令

diff --git a/a.txt b/a.txt
new file mode 100644
index 0000000..e69de29
ShanhongdeiMac:B shanhongfan$ 
ShanhongdeiMac:B shanhongfan$ git show HEAD~4
commit 75b20a40eeaa981a9254776bf547a5b7c462d650
Author: fanshanhong <443710231@qq.com>
Date:   Tue Oct 13 14:46:39 2020 +0800

    Initial commit

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a764dca
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# git-demo
+git demo
ShanhongdeiMac:B shanhongfan$ 

打Tag

我们也可以为某条提交记录添加一个标签(tag)

git tag v1.1.3 6648

此后,我们可以通过 v1.1.3 来访问 6648...这条提交记录。

ShanhongdeiMac:B shanhongfan$ git tag v1.1.3 6648
ShanhongdeiMac:B shanhongfan$ 
ShanhongdeiMac:B shanhongfan$ git show v1.1.3
commit 6648a9ff12acf059edd73d9320025159db170ccc (tag: B-v1.1.3)
Author: fanshanhong <443710231@qq.com>
Date:   Tue Oct 13 16:50:47 2020 +0800

    A第二次修改

diff --git a/README.md b/README.md
index 0840dd7..962a28a 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,5 @@
 git demo
 
 
-A第一次修改。
\ No newline at end of file
+A第一次修改。
+A第二次修改。
ShanhongdeiMac:B shanhongfan$ 

显示 v1.1.3 与当前分支顶端之间的差异

git diff v1.1.3 HEAD

基于 v1.1 创建一个名称为 topic/a 的分支

git branch topic/a v1.1.3

其实,这个v1.1.3的tag一直都没有推送到服务器上

删除tag

删除本地tag:

git tag -d v1.1.3

删除远程tag:

git push origin :refs/tags/v1.1.3

有用的贴士

内建的图形化 git:

gitk

彩色的 git 输出:

git config color.ui true

显示历史记录时,只显示一行注释信息:

git config format.pretty oneline

交互地添加文件至缓存区:

git add -i

到此 git常用的命令已经 讲解完毕,下面开始讲解Git 实例教程