Git教程笔记
Git教程-菜鸟教程
1. Git 安装配置
1.1 Linux | Windows | Mac 平台上安装(略)
Git 各平台安装包下载地址为:http://git-scm.com/downloads
1.2 Git 配置
Git 提供了一个叫做 git config
的工具,专门用来配置或读取相应的工作环境变量,这些环境变量,决定了 Git 在各个环节的具体工作方式和行为;
这些环境变量存放在以下三个不同的地方:
-
/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置;若使用git config
时用--system
选项,读写的就是这个文件; -
~/.gitconfig
文件:用户目录下的配置文件只适用于该用户;若使用git config
时用--global
选项,读写的就是这个文件; - 当前项目的
Git
目录中的配置文件(也就是工作目录中的.git/config
文件):这里的配置仅仅针对当前项目有效;每一个级别的配置都会覆盖上层的相同配置,所以.git/config
里的配置会覆盖/etc/gitconfig
中的同名变量;
1.2.1 用户信息
# 配置个人的用户名称和电子邮件地址
$ git config --global user.name "runoob"
$ git config --global user.email [email protected]
如果用了 --global
选项,那么更改的配置文件就是位于你用户主目录
下的那个,以后你所有的项目都会默认使用这里配置的用户信息;
如果要在某个特定的项目中
使用其他名字或者电邮,只要去掉 --global
选项重新配置即可,新的设定保存在当前项目的 .git/config
文件里;
在项目中遇到了这样的问题,只要切换了不同项目(用户名称和电子邮件不同),就需要配置 SSH 秘钥才能成功上传代码,解决该问题方式就是对特定的项目中使用其他名字或者电邮,不加 --global 选项
1.2.2 文本编辑器
# Git默认使用的文本编辑器是 `Vi` 或者 `Vim`,如配置 Emacs 文本编辑器
$ git config --global core.editor emacs
1.2.3 差异分析工具
# 在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff
$ git config --global merge.tool vimdiff
Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff
等合并工具的输出信息;当然你也可以指定使用自己开发的工具,具体怎么做可以参阅第七章;
1.2.4 查看配置信息
# 要检查已有的配置信息,使用 git config --list 命令;若看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig)
$ git config --list
# 也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可
$ git config user.name
2. Git 工作流程
Git
的一般工作流程如下:
- 克隆
Git
资源作为工作目录; - 在克隆的资源上添加或修改文件;
- 如果其他人修改了,你可以更新资源;
- 在提交前查看修改;
- 提交修改;
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交;
3. Git 工作区、暂存区和版本库
3.1 三者的基本概念
- 工作区:就是你在电脑里能看到的目录;
- 暂存区:英文叫
stage或index
;一般存放在 ".git目录下
" 下的index
文件(.git/index
)中,所以我们把暂存区有时也叫作索引(index); - 版本库:工作区有一个隐藏目录
.git
,这个不算工作区,而是Git的版本库;
3.2 三者之间的关系
[图片上传失败...(image-6ea622-1576231012220)]
图中左侧为工作区
,右侧为版本库
。在版本库中标记为 "index
" 的区域是暂存区
(stage, index
),标记为 "master" 的是 master 分支所代表的目录树;图中我们可以看出此时 "HEAD
" 实际是指向 master
分支的一个"游标";所以图示的命令中出现 HEAD
的地方可以用 master
来替换;图中的 objects
标识的区域为 Git 的对象库,实际位于 ".git/objects
" 目录下,里面包含了创建的各种对象及内容。
4. Git 创建仓库
4.1 git init
# 使用当前目录作为Git仓库,我们只需使它初始化,命令执行完后会在当前目录生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变
git init
# 指定目录作为Git仓库
git init newrepo
# 以下命令将目录下以 .c 结尾及 README 文件提交到仓库中
$ git add *.c
$ git add README
$ git commit -m '初始化项目版本'
4.2 git clone
# 从现有 Git 仓库中拷贝项目,repo:Git 仓库;directory:本地目录。
git clone
# 如果需要克隆到指定的目录,可以使用以下命令格式
git clone
5. Git 基本操作
Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比;
5.1 获取与创建项目命令
# 用 git init 在目录中创建新的 Git 仓库
$ git init
# 用 git clone 拷贝一个 Git 仓库到本地
$ git clone [url] [dirName]
5.2 基本快照
5.1.1 git add
# git add 命令可将该文件添加到缓存, *或. 表示添加所有新增文件,也可以是具体的文件
$ git add *
5.1.2 git status
# git status 命令用于查看项目的当前状态,查看在上次提交之后是否有修改,-s 表示以简短的结果输出
$ git status -s
5.1.3 git diff
# 查看执行 git status 的结果的详细信息,显示已写入缓存与已修改但尚未写入缓存的改动的区别
$ git diff # 尚未缓存的改动
$ git diff --cached # 查看已缓存的改动
$ git diff HEAD # 查看已缓存的与未缓存的所有改动
$ git diff --stat # 显示摘要而非整个 diff
5.1.4 git commit
# 注意 Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址,注意 --global 参数的使用
$ git config --global user.name 'runoob'
$ git config --global user.email [email protected]
# 使用 git add 命令将想要快照的内容写入缓存区
$ git add .
# 执行 git commit 将缓存区内容添加到仓库中,使用 -m 选项以在命令行中提供提交注释
$ git commit -m '提交的注释信息'
# 若觉得 git add 提交缓存的流程繁琐,Git 也允许你用 -a 选项跳过这一步
git commit -am '提交的注释信息(此前不需要 git add )'
5.1.5 git reset HEAD
# 取消已缓存的文件内容;执行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存
$ git reset HEAD [fileName]
5.1.6 git rm
若只是简单地从工作目录中手工删除文件,运行 git status
时就会在 Changes not staged for commit
的提示;要从 Git
中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交:
# 删除工作区目录文件,从已跟踪文件清单中移除
$ git rm
# 若删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
$ git rm -f
# 若把文件从暂存区域移除,但仍然希望保留在当前工作目录中;换句话说,仅是从跟踪清单中删除,使用 --cached 选项
$ git rm --cached
# 递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件
$ git rm –r *
5.1.7 git mv
# git mv 命令用于移动或重命名一个文件、目录、软连接
$ git mv [filename1] [filename2]
6. Git 分支管理
- 创建分支命令:
git branch (branchname)
; - 切换分支命令:
git checkout (branchname)
; - 合并分支命令:
git merge
;
6.1 列出、新建、切换分支
# 列出分支基本命令,不要加参数
$ git branch
# 加上参数就是表示创建一个分支,分支名就是参数值
$ git branch (branchname)
# 切换到某一分支下
$ git checkout (branch)
# 创建新分支并立即切换到该分支下
$ git checkout -b (branchname)
6.2 删除分支
# 删除分支命令
$ git branch -d (branchname)
6.3 分支合并
# 使用以下命令将任何分支合并到当前分支中去
$ git merge (branchname)
6.4 合并冲突
在 Git 中,若合并冲突出现了,我们需要手动去修改它,在修改完成后,我们可以用 git add
要告诉 Git
文件冲突已经解决,然后再使用 git commit
提交结果;
7. Git 查看提交历史
# 使用 git log 命令列出历史提交记录
$ git log
# 可以用 --oneline 选项来查看历史记录的简洁的版本
$ git log --oneline
# 还可以用 --graph 选项,查看历史中什么时候出现了分支、合并,开启了拓扑图选项
$ git log --graph
# 也可以用 --reverse 参数来逆向显示所有日志
$ git log --reverse --oneline
# 只想查找指定用户的提交日志可以使用命令:git log --author , 例如,比方说我们要找 Git 源码中 Linus 提交的部分
$ git log --author=Linus --oneline -5
# 如果要指定日期,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after ; 例如,如果我要看 Git 项目中三周前且在四月十八日之后的所有提交,我可以执行这个(还用了 --no-merges 选项以隐藏合并提交)
$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
8. Git 标签
# 如果项目达到一个重要的阶段,并希望永远记住那个特别的提交快照,使用 `git tag` 给它打上标签; -a 选项意为"创建一个带注解的标签"; -m 选项为添加的标签注释内容
$ git tag -a v1.0
# 查看项目中的标签
$ git log --decorate
# 若忘了给某个提交打标签,又将它发布了,我们可以给它追加标签, 85fc7e7 为那次修改发布的哈希值
$ git tag -a v0.9 85fc7e7
$ git log --oneline --decorate --graph
# 指定标签信息命令
$ git tag -a -m "标签注释内容"
# PGP签名标签命令:
$ git tag -s -m "标签注释内容"
9. Git Github
9.1 添加远程库
# 要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,命令格式如下:
$ git remote add [shortname] [url]
配置 SSH
秘钥连接 GitHub
远程库步骤:
- 执行以下命令生成
SSH Key
:$ ssh-keygen -t rsa -C "[email protected]"
;其中邮件名称是你在Github
上注册的邮箱; - 接着会要求确认路径和输入密码,这使用默认的一路回车就行,会在
~/
目录下生成.ssh
文件夹,如C:\Users\
,进去打开\.ssh id_rsa.pub
,复制里面的key
; - 回到
github
上,进入Account => Settings
(账户配置),新增SSH key
; - 为了验证是否成功,输入以下命令:
$ ssh -T [email protected]
;
9.2 查看当前的远程库
# 要查看当前配置有哪些远程仓库,可以用命令
$ git remote
# 执行时加上 -v 参数,你还可以看到每个别名的实际链接地址
$ git remote -v
9.3 提取远程仓库
Git 有两个命令用来提取远程仓库的更新:
# 1. 从远程仓库下载新分支与数据,该命令执行完后需要执行git merge 远程分支到你所在的分支
$ git fetch
# 2. 从远端仓库提取数据并尝试合并到当前分支,该命令就是在执行 git fetch 之后紧接着执行 git merge 远程分支到你所在的任意分支
$ git merge
假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行 git fetch [alias]
告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch]
以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支;
9.3.1 推送到远程仓库
# 推送你的新分支与数据到某个远端仓库命令,该命令将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支
$ git push [alias] [branch]
9.3.2 删除远程仓库
# 删除远程仓库你可以使用命令:
$ git remote rm [alias]
# 例如:在原有的远程仓库上新增一个,然后再删除
# 1. 先查看当前配置有哪些远程仓库
$ git remote -v
# 2. 添加仓库 origin2,再查看远程仓库
$ git remote add origin2 [email protected]:tianqixin/runoob-git-test.git
$ git remote -v
# 删除仓库 origin2,再查看远程仓库
$ git remote rm origin2
$ git remote -v
10. Git CODING
由于 GitHub 的访问速度太慢,常还会出现丢包、失去连接等情况;因而使用国内服务器的托管平台 CODING
;
将 GitHub
上的代码迁移到 CODING
的步骤:
- 创建 CODING 项目;
- 将 GitHub 代码 Pull 到本地;
- 本地关联 CODING 仓库,Push 代码到 CODING;
- 首先执行命令查看当前配置的远程仓库:
git remote -v
; - 接下来执行以下命令,来关联
CODING
远程仓库,要先删除现有的仓库关联,在将仓库关联到CODING
的地址,并且将代码Push
到master
分支:
- 首先执行命令查看当前配置的远程仓库:
$ git remote rm origin
$ git remote add origin https://git.coding.net/xxx/xxx.git
$ git push -u origin master
CODING
仓库的免密码 Push/Pull
:配置SSH Key
;
11. Git 服务器搭建(没有动手测试)
Github
公开的项目是免费的,但是如果你不想让其他人看到你的项目就需要收费,因而我们就需要自己搭建一台Git服务器作为私有仓库使用;接下来我们将以 Centos
为例搭建 Git
服务器:
11.1 安装Git
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
$ yum install git
# 接下来我们 创建一个git用户组和用户,用来运行git服务
$ groupadd git
$ useradd git -g git
11.2 创建证书登录
# 收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个,若没有就创建它;
$ cd /home/git/
$ mkdir .ssh
$ chmod 755 .ssh
$ touch .ssh/authorized_keys
$ chmod 644 .ssh/authorized_keys
11.3 初始化Git仓库
# 首先选定一个目录作为Git仓库,假定是/home/gitrepo/runoob.git,在/home/gitrepo目录下输入命令
$ cd /home
$ mkdir gitrepo
$ chown git:git gitrepo/
$ cd gitrepo
$ git init --bare runoob.git
Initialized empty Git repository in /home/gitrepo/runoob.git/
# 以上命令Git创建一个空仓库,服务器上的Git仓库通常都以.git结尾。然后,把仓库所属用户改为git
$ chown -R git:git runoob.git
11.4 克隆仓库
# 192.168.45.4 为 Git 所在服务器 ip ,需要将其修改为你自己的 Git 服务 ip;
$ git clone [email protected]:/home/gitrepo/runoob.git
这样我们的 Git 服务器安装就完成;