源代码下载:git
Git 是一个分布式版本控制及源代码管理工具。
Git 能够为你的我的项目保留若干快照,以此来对整个我的项目进行版本治理。
版本
什么是版本控制
版本控制系统就是依据工夫来记录一个或多个文件的更改状况的零碎。
集中式版本控制 VS 分布式版本控制
- 集中式版本控制的次要性能为同步,跟踪以及备份文件;
- 分布式版本控制则更重视共享更改,每一次更改都有惟一的标识;
- 分布式系统没有预约的构造,你也能够用 git 很轻松的实现 SVN 格调的集中式系统控制。
更多信息
为什么要应用 Git
- 能够离线工作
- 和别人协同工作变得简略
- 分支很轻松
- 合并很容易
- Git 零碎速度快,也很灵便
Git 架构
版本库
一系列文件,目录,历史记录,提交记录和头指针。能够把它视作每个源代码文件都带有历史记录属性数据结构。
一个 Git 版本库包含一个 .git 目录和其工作目录。
.git 目录(版本库的一部分)
.git 目录蕴含所有的配置、日志、分支信息、头指针等。
具体列表
工作目录 (版本库的一部分)
版本库中的目录和文件,能够看做就是你工作时的目录。
索引(.git 目录)
索引就是 git 中的 staging 区,能够算作是把你的工作目录与 Git 版本库宰割开的一层,这使得开发者可能更灵便的决定要将要在版本库中增加什么内容。
提交
一个 git 提交就是一组更改或者对工作目录操作的快照,比方你增加了 5 个文件,删除了 2 个文件,那么这些变动就会被写入一个提交中,而这个提交之后也能够被决定是否推送到另一个版本库中。
分支
分支其实就是一个指向你最初一次的提交的指针,当你提交时,这个指针就会主动指向最新的提交。
头指针 与 头(.git 文件夹的作用)
头指针是一个指向以后分支的指针,一个版本库只有一个以后流动的头指针,而头则能够指向版本库中任意一个提交,每个版本库也能够有多个头。
其余形象化解释
- 给计算机科学家的解释
- 给设计师的解释
命令
初始化
创立一个新的 git 版本库,这个版本库的配置、存储等信息会被保留到 .git 文件夹中。
$ git init
配置
更改设置,能够是版本库的设置,也能够是零碎的或全局的。
# 输入、设置根本的全局变量
$ git config --global user.email
$ git config --global user.name
$ git config --global user.email "MyEmail@Zoho.com"
$ git config --global user.name "My Name"
对于 git 的更多设置
帮忙
git 内置了对命令十分具体的解释,能够供咱们疾速查阅。
# 查找可用命令
$ git help
# 查找所有可用命令
$ git help -a
# 在文档当中查找特定的命令
# git help < 命令 >
$ git help add
$ git help commit
$ git help init
状态
显示索引文件(也就是当前工作空间)和以后的头指针指向的提交的不同。
# 显示分支,未跟踪文件,更改和其余不同
$ git status
# 查看其余的 git status 的用法
$ git help status
增加
增加文件到当前工作空间中,如果你不应用 git add
将文件增加进去,那么这些文件也不会增加到之后的提交之中。
# 增加一个文件
$ git add HelloWorld.java
# 增加一个子目录中的文件
$ git add /path/to/file/HelloWorld.c
# 反对正则表达式
$ git add ./*.java
分支
治理分支,能够通过下列命令对分支进行增删改查。
# 查看所有的分支和近程分支
$ git branch -a
# 创立一个新的分支
$ git branch myNewBranch
# 删除一个分支
$ git branch -d myBranch
# 重命名分支
# git branch -m < 旧名称 > < 新名称 >
$ git branch -m myBranchName myNewBranchName
# 编辑分支的介绍
$ git branch myBranchName --edit-description
检出
将当前工作空间更新到索引所标识的或者某一特定的工作空间。
# 检出一个版本库,默认将更新到 master 分支
$ git checkout
# 检出到一个特定的分支
$ git checkout branchName
# 新建一个分支,并且切换过来,相当于 "git branch < 名字 >; git checkout < 名字 >"
$ git checkout -b newBranch
clone
这个命令就是将一个版本库拷贝到另一个目录中,同时也将
分支都拷贝到新的版本库中。这样就能够在新的版本库中提交到近程分支。
# clone learnxinyminutes-docs
$ git clone https://github.com/adambard/learnxinyminutes-docs.git
commit
将以后索引的更改保留为一个新的提交,这个提交包含用户做出的更改与信息。
# 提交时附带提交信息
$ git commit -m "Added multiplyNumbers() function to HelloWorld.c"
diff
显示当前工作空间和提交的不同。
# 显示工作目录和索引的不同
$ git diff
# 显示索引和最近一次提交的不同
$ git diff --cached
# 显示工作目录和最近一次提交的不同
$ git diff HEAD
grep
能够在版本库中疾速查找。
可选配置:
# 感激 Travis Jeffery 提供的以下用法:# 在搜寻后果中显示行号
$ git config --global grep.lineNumber true
# 使得搜寻后果可读性更好
$ git config --global alias.g "grep --break --heading --line-number"
# 在所有的 java 中查找 variableName
$ git grep 'variableName' -- '*.java'
# 搜寻蕴含 "arrayListName" 和, "add" 或 "remove" 的所有行
$ git grep -e 'arrayListName' --and \(-e add -e remove \)
更多的例子能够查看:
Git Grep Ninja
log
显示这个版本库的所有提交。
# 显示所有提交
$ git log
# 显示某几条提交信息
$ git log -n 10
# 仅显示合并提交
$ git log --merges
merge
合并就是将内部的提交合并到本人的分支中。
# 将其余分支合并到以后分支
$ git merge branchName
# 在合并时创立一个新的合并后的提交
$ git merge --no-ff branchName
mv
重命名或挪动一个文件。
# 重命名
$ git mv HelloWorld.c HelloNewWorld.c
# 挪动
$ git mv HelloWorld.c ./new/path/HelloWorld.c
# 强制重命名或挪动
# 这个文件曾经存在,将要笼罩掉
$ git mv -f myFile existingFile
pull
从远端版本库合并到以后分支。
# 从远端 origin 的 master 分支更新版本库
# git pull < 远端 > < 分支 >
$ git pull origin master
push
把远端的版本库更新。
# 把本地的分支更新到远端 origin 的 master 分支上
# git push < 远端 > < 分支 >
# git push 相当于 git push origin master
$ git push origin master
rebase (审慎应用)
将一个分支上所有的提交历史都利用到另一个分支上。
不要在一个曾经公开的远端分支上应用 rebase。
# 将 experimentBranch 利用到 master 下面
# git rebase <basebranch> <topicbranch>
$ git rebase master experimentBranch
更多浏览
reset (审慎应用)
将以后的头指针复位到一个特定的状态,这样能够使你撤销 merge、pull、commits、add 等,这是个很弱小的命令,然而在应用时肯定要分明其所产生的结果。
# 使 staging 区域复原到上次提交时的状态,不扭转当初的工作目录
$ git reset
# 使 staging 区域复原到上次提交时的状态,笼罩当初的工作目录
$ git reset --hard
# 将以后分支复原到某次提交,不扭转当初的工作目录
# 在工作目录中所有的扭转依然存在
$ git reset 31f2bb1
# 将以后分支复原到某次提交,笼罩当初的工作目录
# 并且删除所有未提交的扭转和指定提交之后的所有提交
$ git reset --hard 31f2bb1
rm
和 add 相同,从工作空间中去掉某个文件。
# 移除 HelloWorld.c
$ git rm HelloWorld.c
# 移除子目录中的文件
$ git rm /pather/to/the/file/HelloWorld.c
更多浏览
- tryGit – 学习 Git 的乏味形式
- git-scm – 视频教程
- git-scm – 文档
- Atlassian Git – 教程与工作流程
- SalesForce Cheat Sheet
有倡议?或者发现什么谬误?在 Github 上开一个 issue,或者发动 pull request!
原著 Jake Prather,并由 0 个好心人批改。
© 2022 Jake Prather
Translated by: Chenbo Li
本作品采纳 CC BY-SA 3.0 协定进行许可。