0%

Git学习指南

Git学习指南

基础

Git是什么?
懂的人已经懂了,不懂的人就看下去.

安装:

  1. OSX: http://code.google.com/p/git-osx-installer/downloads/list?can=3
  2. Windows: https://git-for-windows.github.io/
  3. Linux: yum, apt …

初始化一个叫test的新仓库.

1
2
$ git init test
初始化空的 Git 仓库于 /data/git/test/.git/

配置用户信息,这些信息回在commit时用到.
--global是全局的设置.默认是非全局.

1
2
$ git config --global user.name "username"
$ git config --global user.email "username@yyland.com"

查看配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat ~/.gitconfig 
[user]
name = username
email = username@yyland.com

$ git config -l
push.default=simple
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=username
user.email=username@yyland.com

图解Git

git工作区

入门操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$ git
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]

这些是各种场合常见的 Git 命令:

开始一个工作区(参见:git help tutorial)
clone 克隆一个仓库到一个新目录
init 创建一个空的 Git 仓库或重新初始化一个已存在的仓库

在当前变更上工作(参见:git help everyday)
add 添加文件内容至索引
mv 移动或重命名一个文件、目录或符号链接
reset 重置当前 HEAD 到指定状态
rm 从工作区和索引中删除文件

检查历史和状态(参见:git help revisions)
bisect 通过二分查找定位引入 bug 的提交
grep 输出和模式匹配的行
log 显示提交日志
show 显示各种类型的对象
status 显示工作区状态

扩展、标记和调校您的历史记录
branch 列出、创建或删除分支
checkout 切换分支或恢复工作区文件
commit 记录变更到仓库
diff 显示提交之间、提交和工作区之间等的差异
merge 合并两个或更多开发历史
rebase 本地提交转移至更新后的上游分支中
tag 创建、列出、删除或校验一个 GPG 签名的标签对象

协同(参见:git help workflows)
fetch 从另外一个仓库下载对象和引用
pull 获取并整合另外的仓库或一个本地分支
push 更新远程引用和相关的对象

命令 'git help -a''git help -g' 显示可用的子命令和一些概念帮助。
查看 'git help <命令>''git help <概念>' 以获取给定子命令或概念的
帮助。

add

解释: 添加文件内容至暂存区

在仓库中增加一个文件a.txt

1
2
3
4
5
6
$ echo "test 1" > a.txt
$ cat a.txt
test 1

$ git add a.txt
$

git-add
红色箭头就是git add所做的动作.
但是还不算真正提交到仓库中.

status

解释: 显示工作区状态

再新建一个文件b.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ echo "b.txt" > b.txt
$ git status
位于分支 master

初始提交

要提交的变更:
(使用 "git rm --cached <文件>..." 以取消暂存)

新文件: a.txt

未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)

b.txt

可以看到a.txt是已提交变更(已提交到暂存区,非仓库),而b.txt是未跟踪的文件

1
2
3
4
5
6
7
8
9
10
11
$ git add b.txt 
$ git status
位于分支 master

初始提交

要提交的变更:
(使用 "git rm --cached <文件>..." 以取消暂存)

新文件: a.txt
新文件: b.txt

此时可以看到a.txt和b.txt都已被提交到暂存区.

commit

解释: 记录变更到仓库

1
2
3
4
5
$ git commit -m "add a.txt,b.txt"
[master (根提交) 0fed25b] add a.txt,b.txt
2 files changed, 2 insertions(+)
create mode 100644 a.txt
create mode 100644 b.txt

git-commit
红色箭头就是git commit干的工作.

log

解释: 显示提交日志

1
2
3
4
5
6
$ git log
commit 0fed25b391a44097c53e85c8b7a50d23d4312acb
Author: username <username@yyland.com>
Date: Fri Jul 22 15:09:46 2016 +0800

add a.txt,b.txt

注: 此处可以看到前面配置的user.name和user.email信息.
以及git commit -m "xxx"中填写的备注日志.

mv

解释: 移动或重命名一个文件、目录或符号链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ git mv a.txt c.txt
$ git commit -am "mv a.txt c.txt"
[master 85fe174] mv a.txt c.txt
1 file changed, 0 insertions(+), 0 deletions(-)
rename a.txt => c.txt (100%)
$ git log
commit 85fe174ba75d4d798476fa6f594368111d9f5fff
Author: username <username@yyland.com>
Date: Fri Jul 22 15:25:19 2016 +0800

mv a.txt c.txt

commit 0fed25b391a44097c53e85c8b7a50d23d4312acb
Author: username <username@yyland.com>
Date: Fri Jul 22 15:09:46 2016 +0800

add a.txt,b.txt

$ ls
b.txt c.txt

注: 上面的命令git commit -am "xxx"-a就是git add的意思.
这句命令可以分拆成git add filenamegit commit -m "xxx"两句命令.

rm

解释: 从工作区和索引中删除文件

1
2
3
4
5
6
7
8
$ git rm c.txt 
rm 'c.txt'
$ git commit -am "rm c.txt"
[master fab6a77] rm c.txt
1 file changed, 1 deletion(-)
delete mode 100644 c.txt
$ ls
b.txt

中级操作

远程仓库

之前我们在初级操作中所有的操作都是在本地进行的.如果我们需要和别人协同工作,就需要用到远程仓库.这个仓库可能是某一台服务器,24小时开机提供服务状态.类似SVN服务器.得到这样一台远程服务器的方式有:

  1. DIY.搭建一个gitlab服务器.https://about.gitlab.com/
  2. Github.使用全球最大的同性交友网站.https://github.com
  3. Gitshell.国内的一个网站.https://gitshell.com

使用方法:

  1. 注册帐号
  2. 生成sshkey
  3. 上传ssh public key
  4. 本地配置ssh key
  5. 创建一个新仓库

以github为例:

  • 第一步略……………
  • 第二步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ ssh-keygen -b 4096 -C test@yyland.com -f id_rsa_test_yyland_com
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_test_yyland_com.
Your public key has been saved in id_rsa_test_yyland_com.pub.
The key fingerprint is:
SHA256:1+a/++ts0QihcNDIdOF8Dbmlan9T382wiRgS+7e13Z8 test@yyland.com
The key's randomart image is:
+---[RSA 4096]----+
| oo+o... |
| ++o oo. |
| oo..=. |
| . .o+ |
| So..o. ..|
| o.+o o.o|
| + +...*=|
| o +o*+B|
| ..oBEB|
+----[SHA256]-----+
$ ls
d_rsa_test_yyland_com.pub id_rsa_test_yyland_com
  1. d_rsa_test_yyland_com.pub 公钥,需要上传到github
  2. id_rsa_test_yyland_com 私钥,除非要被打死了,不然不要给别人
  • 第三步上传public key

找到用户配置页(头像->settings).点击SSH and GPG keys
上传key1

点击New SSH key
上传key2

复制public key的内容,点击Add SSH key
上传key3

输入帐号密码
上传key4

查看已有的key
上传key5

  • 第四步配置SSH key
1
2
3
4
5
6
7
$ echo "# github
Host github.com
IdentityFile PATH/id_rsa_test_yyland_com" >> /etc/ssh/ssh_config

// 测试
$ ssh -T git@github.com
Hi yyland! You've successfully authenticated, but GitHub does not provide shell access.
  • 第五步创建test仓库

点击Repositories->NEW
创建仓库1

输入仓库名test->Create repository
创建仓库2

创建成功,并提示一些基础命令用法
创建仓库3

clone

解释: 克隆一个仓库到一个新目录

把在github上新建的test仓库clone到本地

1
2
3
4
$ git clone git@github.com:jasonyy77/test.git
正克隆到 'test'...
warning: 您似乎克隆了一个空仓库。
检查连接... 完成。

push

解释: 更新远程引用和相关的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cd test/
$ ls
$ touch aaa.txt
$ git add aaa.txt
$ git commit -m "add aaa.txt"
[master (根提交) c6bbf82] add aaa.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 aaa.txt
jason@jason-Pavilion-m4:/data/git/test$ git push origin master
对象计数中: 3, 完成.
写入对象中: 100% (3/3), 203 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:jasonyy77/test.git
* [new branch] master -> master

pull

解释: 获取并整合另外的仓库或一个本地分支

1
2
$ git pull
Already up-to-date.

没有变化.因为github上的内容和本地一样.所以本地的内容不需要更新.

branch

解释: 列出、创建或删除分支

高级操作