git教程

Git 读音为/git/ ,是一个开源的分布式版本管理系统,是Linux Torvalds为了帮助管理Linux内核开发而开发的一个版本控制软件。

git 和svn的区别:

1 工作原理

1.1 git的四个工作区域

image-20210409050441248

  • 远程仓库:Github、Gitee、GitLab,存储在远程服务器上的仓库。
  • 本地仓库:git clone或者git init之后存储在本地的仓库,HEAD指向最新放入仓库的版本。
  • 暂存区:也叫待提交更新区,存放临时变动,本质上是文件,保存即将提交的文件列表。
  • 工作区:也叫工作目录,本地工作目录

1.2 git的文件状态

  • 未跟踪(Untracked):文件在本地,未添加到git仓库,不参与版本控制,执行git add 后 状态变为 Staged

  • 未修改(Unmodified):文件已入库,未修改,即版本库中的快照内容与本地文件一致。修改后转为Modified,执行git rm后移出版本库,变为Untracked

  • 已修改(Modified):文件已入库,已修改,即版本库中的快照内容与本地文件不一致。使用git checkout则丢弃修改,返回Unmodified状态,git add后进入暂存Staged状态。

  • 暂存(Staged):暂存状态,执行git commit则修改同步到本地库中,文件变为Unmodified状态,执行git reset HEAD filename 取消暂存,文件变为Modified状态

    可以使用git status [filename]来查看指定文件的状态。

image-20210409050404549

image-20210409042142708

image-20210409042214715

image-20210409042230437

1.3 本地工作流

你的本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作目录,它持有实际文件;第二个是 缓存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,指向你最近一次提交后的结果。

image-20210409043232427

1.4 分支

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”。master分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作,一般会新建dev分支进行开发,dev分支代码稳定后再将它们合并到master分支上。

image-20210409043607480

1.5 需要记住的命令

image-20210409044451952

2 常用操作

全局配置:

1
2
3
git config --global user.name "username"
git config --global user.email "xxxx@gmail.com"

新建仓库:

1
2
3
4
5
6
7
8
9
10
mkdir vuecli_sample
cd vuecli_sample
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add github git@github.com:geekhall/vue2cli.git
git remote add gitee git@gitee.com:sjdt/vue2cli.git
git push -u github master
git push -u gitee master

已有仓库

1
2
3
4
cd existing_git_repo
git remote add github git@gitee.com:sjdt/vuecli_sample.git
git branch -M main
git push -u github main

2.1 配置

1
2
3
4
5
6
# 设置
git config --global user.name yiny
git config --global user.email yinyang007@gmail.com

# 查看
git config -l / git config --list

2.2 创建仓库

两种方式:

1
2
3
4
5
# 创建一个新的仓库
git init

# 创建一个远端仓库的本地克隆版本
git clone username@host:/path/to/repository

2.3 本地提交

1
2
3
4
5
6
7
# 添加到Stage
git add <filename>
git add .
git add *

# 提交到本地仓库
git commit -m "提交信息" # 现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库!

2.4 推送改动

1
2
3
4
5
6
# 将本地改动提交到远端仓库,origin和master分别为默认的仓库名和分支名称
git push origin master

# 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
git remote add origin <server>

2.5 分支操作

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

# 列出所有本地分支
git branch

# 列出所有远程分支
git branch -r

# 创建分支,但依然停留在当前分支
git branch [branch-name]

# 创建一个分支,并切换过去:
git checkout -b [branch-name]

# 合并指定分支到当前分支:
git merge [branch-name]

# 切换回主分支:
git checkout master

# 删除分支:
git branch -d [branch-name]

# 除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:
git push origin <branch>

# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]

2.6 更新与合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 要更新你的本地仓库至最新改动,执行:
git pull # 在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。

# 要合并其他分支到你的当前分支(例如 master),执行:
git merge <branch>

# 两种情况下,git 都会尝试去自动合并改动。不幸的是,自动合并并非次次都能成功,并可能导致 冲突(conflicts)。
# 这时候就需要你修改这些文件来人肉合并这些 冲突(conflicts) 。改完之后,你需要执行如下命令以将它们标记为合并成功并重新提交:
git add <filename>
git commit

# 在合并改动之前,也可以使用如下命令查看:
git diff <source_branch> <target_branch>

2.7 标签

1
2
3
# 在软件发布时创建标签,是被推荐的。这是个旧有概念,在 SVN 中也有。可以执行如下命令以创建一个叫做 1.0.0 的标签:
git tag 1.0.0 1b2e1d63ff # 1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。

2.8 日志

1
git log

2.9 diff

1
git diff ver1..ver2 [filename]

2.10 替换本地改动(慎用,未提交的本地修改内容可能丢失)

1
2
3
4
5
6
# 假如你做错事,你可以使用如下命令替换掉本地改动:
git checkout -- <filename> # 此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到缓存区的改动,以及新文件,都不受影响。

# 假如你想要丢弃你所有的本地改动与提交,可以到服务器上获取最新的版本并将你本地主分支指向到它:
git fetch origin
git reset --hard origin/master

2.11 git reset

git reset 的三种模式soft,mixed,hard

image-20210409042413736

image-20210409042427204

image-20210409042439298

2.12 gitignore

在.gitignore文件中配置不需要提交到版本库进行管理的文件

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
# Class file
*.class

# Log file
*.log

# BlueJ file
*.ctxt

# Mac file
.DS_Store

# package file
*.jar
*.war
*.nar
*.ear
*.zip
*.tar
*.tar.gz
*.rar

# config file
.idea/

删除远程仓库文件

如果要删除的文件已经被git跟踪,那么即使添加到.gitignore也是没有用的,
具体操作步骤:

  1. 预览将要删除的文件
    加上 -n 表示只是展示,不会删除任何文件
1
git rm -r -n --cached filename
  1. 确定无误后删除文件:
1
git rm -r --cached filename
  1. 提交到本地并推送到远程服务器
1
2
git commit -m "提交说明"
git push origin master
  1. 修改本地.gitignore文件并提交