共计 5550 个字符,预计需要花费 14 分钟才能阅读完成。
背景剖析
软件我的项目开发过程中,团队间共享的代码,文档等可能被他人或本人不小心笼罩或遗失、也不晓得是谁,因为什么起因改了这段代码、也没方法很好的还原前几天的批改,于是版本控制系统 (VCS-Version Control System) 诞生。
有了版本控制系统,咱们能够浏览所有开发的历史纪录,把握团队的开发进度,而且作任何批改都不再胆怯,因为你能够轻易的还原回之前失常的版本。咱们也能够透过分支和标签的性能来进行软件发行的不同版本,例如稳固版本、保护版本和开发中版本。近几年版本控制系统的利用趋势,如图所示:
版本控制系统(VCS,Version Control System)能够划分为集中式和分布式两大类。集中式顾名思义,是用繁多的服务器来集中管理保留我的项目的所有文件。我的项目团队的成员通过客户端连贯到这台服务器,下载或提交文件。如图所示:
集中式客户端一旦无奈连贯服务器,那么版本控制性能将无奈应用(例如比拟历史版本差别;查看某个历史版本内容等)。集中式的 VCS 杰出代表是 SVN.
分布式的特点是每个客户端除了能够连贯到一个集中的服务器外,客户端自身能够是一个残缺的版本控制仓库,我的项目团队成员能够在本人的电脑上对文件进行版本治理。如图所示:
与集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有残缺的版本库,某一个人的电脑坏掉了不要紧,轻易从其他人那里复制一个就能够了。而集中式版本控制系统的地方服务器要是出了问题,所有人都没法干活了。分布式的 VCS 杰出代表是 git。
Git 简介(Introduction)
Git 是一个开源的分布式版本控制系统,作者是传奇人物 Linus,驰名的开源操作系统 Linux 作者。liuns 花了两周工夫本人用 C 写出了一个 Git。当初 Linux 零碎的源码都是由 Git 进行治理。Git 现已是 VCS 畛域的江湖霸主。
Git 装置(Setting Up)
下载与装置
Windows 和 Mac 零碎, 能够间接从 http://git-scm.com/downloads 网址下载并运行安装程序。对于 Windows 用户可应用 “Git Bash” 命令行工具 (Git 装置时自带) 应用 Git,Mac 零碎能够间接实用终端窗口 ”Terminal”。
全局用户信息配置
配置用户和明码
$ git config --global user.name "your-name"
$ git config --global user.email "your-email@youremail.com"
查看配置信息
$ git config --list
user.email=xxxxxx@xxxxxx.com
user.name=xxxxxx
Git 根底 (Basic) 利用实现
Git 命令简介
Git 提供了一组简略、独特、独立的命令,这些命令的执行须要首先启动 windows 或 mac 零碎的 Git 终端(window 下能够可应用 “Git Bash”), 其语法结构为:
$ git <command> <arguments>
Git 常用命令有:
init, clone, config: 用于启动 Git 进行项目管理。add, mv, rm: 用于临时记录或存储文件的变更.
commit, rebase, reset, tag:
status, log, diff, grep, show: show status
checkout, branch, merge, push, fetch, pull
Git 帮忙手册:(可疾速获取命令的应用帮忙)
$ git help <command>
// or
$ git <command> --help
Git 操作手册官网文档 http://git-scm.com/docs.
Git 疾速入门
这里有两种形式启动 Git 治理我的项目:
- 创立或启动一个新我的项目,而后进行 git 操作。
- 从一个 Git 主机上克隆一个曾经存在的我的项目。
这里咱们先从新我的项目开始,进行入门学习:
首先创立一个 git 工作目录,命名为 githello,而后在目录中创立一个一个 Hello.java, 其代码为:
public class Hello {public static void main(String[] args) {System.out.println("Hello, world from GIT!");
}
}
倡议,在 Hello.java 所在目录同样再创立一个 README.md
文件,通过此文件对你的我的项目进行形容,例如在文件中增加如下内容:
This is the README file for the Hello-world project.
- 初始化 git 仓库
基于 Git 实现项目管理时,首先在我的项目所在的根目录 (例如 githello) 执行 ”git init”,过程如下:
git init
// Change directory to the project directory
//$ cd /path-to/hello-git
// Initialize Git repo for this project
$ git init
Initialized empty Git repository in /path-to/hello-git/.git/
$ ls -al
drwxr-xr-x 1 xxxxx xxxxx 4096 Sep 14 14:58 .git
-rw-r--r-- 1 xxxxx xxxxx 426 Sep 14 14:40 Hello.java
-rw-r--r-- 1 xxxxx xxxxx 66 Sep 14 14:33 README.md
其中,git init 指令执行完结,git 本地库的根目录中会出啊要害一个 ”.git” 目录(默认此目录为暗藏状态)。
Git 存储模型,如图所示:
当咱们执行了 git init 指令当前,本地库其实是空的的。您须要显式地将文件存入仓库。
- 暂存和更新文件的变更。
// Add README.md file
$ git add README.md
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
Hello.java
// You can use wildcard * in the filename
// Add all Java source files into Git repo
$ git add *.java
// You can also include multiple files in the "git add"
// E.g.,
// git add Hello.java README.md
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: Hello.java
new file: README.md
1)命令“git add<file>..”承受一个或多个可能带有通配符模式的文件名或路径名。您还能够应用“git add.”增加当前目录(以及所有子目录)中的所有文件。
2)当一个新的文件被执行了“add”操作当前,它将存储到 git 的暂存区(还并没有 commit 到本地库)。
Git 应用两道工序提交文件的变更:
1)”git add <file>” 将文件存储到暂存区。
2)”git commit” 将文件的所有变更由暂存取提交到本地库。
- 提交文件变更(git commit)
如果咱们要将 git 暂存区文件的变更信息提交到本体库,须要实用 ”git commit” 指令,例如:
$ git commit -m "First commit"
[master (root-commit) 6e49a29] first commit
2 files changed, 1 insertion(+)
create mode 100644 Hello.java
create mode 100644 README.md
接下来还能够查看 Git 状态:
$ git status
显示 Git 提交日志信息:
Git 每次都会记录提交的元数据,其中包含日志音讯、工夫戳、作者的用户名和电子邮件等)。咱们能够应用 ”git log” 指令显示提交的数据。也能够应用 ”git log –stat” 查看文件的统计 (statistics) 信息。
$ git log
git log --stat
- .gitignore 文件
在 Git 中,有一种非凡的文件,其文件全名就是 .gitignore,,次要性能是基于规定屏蔽某些文件,使得这些文件不被追踪(tracked),天然 push 后也不会上传到 github 等平台。这个时候咱们只须要在须要执行 push 操作的目录下创立.gitignore 文件,而后定义其规定即可,例如:
# .gitignore
# Java class files
*.class
# Executable files
*.exe
# temp sub-directory (ended with a directory separator)
temp/
当初,执行“git status”命令来查看未跟踪(untracked)的文件。
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
nothing added to commit but untracked files present (use "git add" to track)
通常(Typically), 咱们也会跟踪或提交.gitignore 文件,例如:
$ git add .gitignore
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: .gitignore
$ git commit -m "Added .gitignore"
[master 711ef4f] Added .gitignore
1 file changed, 14 insertions(+)
create mode 100644 .gitignore
$ git status
On branch master
nothing to commit, working directory clean
Git 近程仓库设置
咱们应用 Git 进行项目管理时,通常会将我的项目提交到近程仓库,其具体步骤如下:
第一步:创立近程仓库 (例如 Gitee)- 本人创立。
第二步:设置近程仓库名和 url 映射。
通过 via “git remote add <remote-name> <remote-url>” 指令实现,设置名字为 “origin” 的近程仓库绑定。
例如:
$ git remote add origin https://gitee.com/JasonCN2008/gittest.git
以列表形式出现近程仓库名:
$ git remote -v
第三步:推送 (Push) 和提交(commit)本库内容到近程仓库。
将本地库内容推送到近程库(执行过程须要输出近程仓库账号和明码),其语法为 git push -u <remote-name> <local-branch-name>,例如:
$ git push origin master
实际过程演示:
批改 Hello.java 文件内容,例如:
public class Hello {public static void main(String[] args) {System.out.println("Hello, world from GIT!");
System.out.println("Push and Commit !");
}
}
执行 Git 操作
$ git status
// Stage file changes
$ git add *.java
$ git status
// Commit all staged file changes
$ git commit -m "Third commit"
[master 744307e] Third commit
1 file changed, 1 insertion(+)
// Push the commits on local master branch to remote
$ git push origin master
从近程仓库克隆我的项目
执行 “git clone <remote-url>
” 初始化一个本地库,并将 remote-url 近程库中资源拷贝到本地库工作目录。例如,首先切换到 git 工作目录,而后执行:
$ git clone https://gitee.com/JasonCN2008/gittest.git githello-clone
Clone 完结当前,切换到 githello-clone 目录,执行 ls - a 指令查看目录中资源。
总结(Summary)
本大节次要是对 Git 的根本指令操作进行了剖析和实际,咱们当初再将这些这令总结一下:
// Edit (Create, Modified, Rename, Delete) files。// Stage file changes, which produces "Staged" file changes
$ git add <file> // for new and modified files
$ git rm <file> // for deleted files
$ git mv <old-file-name> <new-file-name> // for renamed file
// Commit (ALL staged file changes)
$ git commit -m "message"
// Push
$ git push <remote-name> <local-branch-name>