软件项目开发过程当中,团队间共享的代码,文档等可能被别人或本身不当心覆盖或遗失、也不知道是谁,由于什么缘由改了这段代码、也没办法很好的复原前几天的修改,因而版本控制系统(VCS-Version Control System)诞生。java
有了版本控制系统,咱们能够浏览全部开发的历史纪录,掌握团队的开发进度,并且做任何修改都再也不惧怕,由于你能够轻易的复原回以前正常的版本。咱们也能够透过度支和标签的功能来进行软件发行的不一样版本,例如稳定版本、维护版本和开发中版本。近几年版本控制系统的应用趋势,如图所示:git
版本控制系统(VCS,Version Control System)能够划分为集中式和分布式两大类。集中式顾名思义,是用单一的服务器来集中管理保存项目的全部文件。项目团队的成员经过客户端链接到这台服务器,下载或提交文件。如图所示:github
集中式客户端一旦没法链接服务器,那么版本控制功能将没法使用(例如比较历史版本差别;查看某个历史版本内容等)。集中式的VCS杰出表明是SVN.windows
分布式的特色是每一个客户端除了能够链接到一个集中的服务器外,客户端自己能够是一个完整的版本控制仓库,项目团队成员能够在本身的电脑上对文件进行版本管理。如图所示:安全
与集中式版本控制系统相比,分布式版本控制系统的安全性要高不少,由于每一个人电脑里都有完整的版本库,某一我的的电脑坏掉了没关系,随便从其余人那里复制一个就能够了。而集中式版本控制系统的中央服务器要是出了问题,全部人都无法干活了。分布式的VCS杰出表明是git。服务器
Git是一个开源的分布式版本控制系统,做者是传奇人物Linus,著名的开源操做系统Linux做者。liuns花了两周时间本身用C写出了一个Git。如今Linux系统的源码都是由Git进行管理。Git现已经是VCS领域的江湖霸主。分布式
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"
检查配置信息fetch
$ git config --list user.email=xxxxxx@xxxxxx.com user.name=xxxxxx
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工做目录,命名为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实现项目管理时,首先在项目所在的根目录(例如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暂存区文件的变动信息提交到本体库,须要实用"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
在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进行项目管理时,一般会将项目提交到远程仓库,其具体步骤以下:
第一步:建立远程仓库(例如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指令查看目录中资源。
本小节主要是对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>