Git 背后的故事
基本概念 和 SVN 相比,Git 有一些独特的术语和概念,有必要了解一下。
图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
git add
git commit
git reset HEAD
git rm --cached
git checkout 或者 git checkout –
git checkout HEAD 或者 git checkout HEAD
git clone git@sdysit.com:/sdyouth/git/yangmaosen.git
git fetch
get push
术语中英文对照
English 中 文
# ---------------------------------------------------------------------------------------------
3-way merge # 三方合并
abbreviate # 简写(的 SHA-1 值)
alternate object database # 备用对象库
amend # 修补
ancestor # 祖先,祖先提交
annotated tag # 附注标签
bare repository # 纯仓库
bisect # 二分查找
blob object # 数据对象
branch # 分支
bundle # 包
bypass # 绕过
cache # 索引(的别称)
chain # (提交)链
changeset # 变更集
checkout # 检出
checksum # 校验,校验和
cherry-picking # 拣选
# ---------------------------------------------------------------------------------------------
clean # 干净(的工作区)
clone # 克隆
commit # 提交
commit message # 提交说明
commit object # 提交对象
commit-ish (also committish) # 提交号
conflict # 冲突
core Git # 核心 Git 工具
DAG # 有向无环图
dangling object # 摇摆对象
detached HEAD # 分离头指针
directory # 目录
dirty # 脏(的工作区)
dumb HTTP protocol # 哑 HTTP 协议
evil merge # 坏合并(合并引入了父提交没有的修改)
fast-forward # 快进
fetch # 获取
file system # 文件系统
fork # 派生
Git archive # 仓库(对于 arch 用户)
gitfile # gitfile(仓库链接文件)
grafts # (提交)移植
# ---------------------------------------------------------------------------------------------
hash # 哈希值
HEAD # HEAD(头指针,亦即当前分支)
head # 头、分支
head ref # 分支
header # 头信息
hook # 钩子
hunk # 补丁片段
index # 索引
index entry # 索引条目
loose object # 松散对象
loose refs # 松散引用
master # master(默认分支名)
merge # 合并
object # 对象
object database # 对象库
object identifier # 对象标识符
object name # 对象名称
object type # 对象类型
octopus # 章鱼式合并(两分支以上的合并)
origin # origin(默认的远程名称)
pack # 包
pack index # 包索引
packfile # 包文件
parent # 父提交
patch # 补丁
# ---------------------------------------------------------------------------------------------
pathspec # 路径规格
pattern # 模式
pickaxe # 挖掘
plumbing # 管件(Git 底层核心命令的别称)
porcelain # 瓷件(Git 上层封装命令的别称)
precious-objects repo # 珍品仓库
prune # 清除
pull # 拉,拉取
push # 推,推送
reachable # 可达
rebase # 变基
ref # 引用
reflog # 引用日志
refspec # 引用规格
remote # 远程,远程仓库
remote-tracking branch # 远程跟踪分支
replay # 重放
repo # 仓库
repository # 仓库
resolve # (冲突)解决
revert # 还原
revision # 版本
rewind # 回退
# ---------------------------------------------------------------------------------------------
SCM # 源代码管理(工具)
SHA-1 # SHA-1(安全哈希算法1)
shallow repository # 浅(克隆)仓库
signed tag # 签名标签
smart HTTP protocol # 智能 HTTP 协议
squash # 压缩
stage # n. 暂存区(即索引); v. 暂存
stash # n. 贮藏区; v. 贮藏
submodule # 子模组
symref # 符号引用
tag # n. 标签; v. 打标签
tag object # 标签对象
tagger # 打标签者
topic branch # 主题分支
track # 跟踪
trailer # 尾部署名
tree # 树(工作区或树对象)
tree object # 树对象
tree-ish (also treeish) # 树对象(或可以解析为一树对象)
unmerged index # 未合并索引
unpack # 解包
unreachable object # 不可达对象
unstage # 取消暂存
upstream # 上游
upstream branch # 上游分支
working tree # 工作区
Git 目前几乎可以运行在包括 Linux/Unix、Solaris、Mac和 Windows 等所有平台上。Git 各平台安装包下载地址为:http://git-scm.com/downloads
Linux 平台安装 Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先安装这些依赖工具。如果你碰巧用 Debian 或 Ubuntu,使用下面的命令,就可以直接完成Git的安装。
sudo apt-get install git
写这篇博客的时候,最新的 Git 客户端版本是 Git-2.19.1。点此下载最新的安装文件,然后运行,按默认选项安装即可。我大概只更改了默认的编辑器,其他接受了默认选项。
友情提示:关于行结束符,默认的选择是 checkout 时从 LF 转 CRLF,commit 时 从 CRLF 转 LF。这样设置适合跨平台的开发,不过 add 操作时会出现警告,忽略即可。
安装完成后,右键菜单会增加 Git GUI 和 Git Bash 两项。用户可以根据自己的习惯选择使用 Git GUI 或 Git Bash 来创建、管理自己的版本库。
在非本地版本库的工作区打开 Git GUI,界面如下:
这里,可以创建本地版本库,可以克隆远程库,也可以打开本地已经存在的版本库。
在本地版本库的工作区打开 Git GUI,界面如下:
客户端生成数字证书
假定有一个远程库:
因为使用了的是默认端口,可以简写为:
$ git clone git@sdysit.com:/sdyouth/git/GitTest.git
第一次连接到目标 Git 服务器时会得到一个提示:
Cloning into 'GitTest'...
The authenticity of host 'sdysit.com (120.55.169.217)' can't be established.
ECDSA key fingerprint is SHA256:tTXVyJPoqCiEZP3+3E2uOOmvXIWGEWtCcUOgBhlb+iQ.
Are you sure you want to continue connecting (yes/no)? yes
选择 yes
Warning: Permanently added 'sdysit.com,120.55.169.217' (ECDSA) to the list of known hosts.
git@sdysit.com's password:
Connection closed by 120.55.169.217 port 22
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
如果 Git 客户端存在 C:\Users\用户名.ssh 路径,则直接在 Git Bash 执行以下命令,生成数字证书:
$ ssh-keygen -t rsa -C "yangmaosen@sdysit.com"
前文已经展示过使用 Git Bash 克隆版本库,下图为使用 Git GUI 从远程库克隆 FY-3 项目到本地 D:\YouthGit 路径下。友情提示:如果 D:\YouthGit 路径下已经存在 FY-3 文件夹,将无法完成克隆。
以在本地 D:\YouthGit 路径下创建 FY-2 项目为例。启动 Git Bash,执行以下操作即可。
yms@LAPTOP-07EQCT4C MINGW64 /d/YouthGit
$ pwd
/d/YouthGit
yms@LAPTOP-07EQCT4C MINGW64 /d/YouthGit
$ mkdir FY-2
yms@LAPTOP-07EQCT4C MINGW64 /d/YouthGit
$ cd FY-2
yms@LAPTOP-07EQCT4C MINGW64 /d/YouthGit/FY-2
$ git init
Initialized empty Git repository in D:/YouthGit/FY-2/.git/
yms@LAPTOP-07EQCT4C MINGW64 /d/YouthGit/FY-2 (master)
如果使用 Git GUI,创建本地项目版本库如下图所示。
关联本地版本库到远程库 在本地创建的版本库,要关联到远程库,前提是被关联的远程库必须存在。以在本地 D:\YouthGit 路径下创建 的FY-2 项目为例,使用 Git GUI 关联到远程库 git@sdysit.com:/sdyouth/git/FY-2.git,需要添加远程库。点击菜单Remote --> Add…,在弹出窗口中正确填入远程库路径,并给远程库取一个恰当的名字,点击 Add 按钮即可完成操作。
检查工作区
保存更新暂存区
提交更新至版本库
创建分支 假定在 FY-2 项目中创建以 master 分支当前代码为起点的 demo 分支,点击 Git GUI 菜单 Branch --> Create…,在弹出窗口中照下图操作即可。创建新的分支后,Git GUI 自动切换到新的分支,并更新工作区。
切换分支 点击 Git GUI 菜单 Branch --> Checkout…,在弹出窗口中照下图操作,即可切换到 master 分支,同时更新工作区。
合并分支 点击 Git GUI 菜单 Merge --> Local Merge…,在弹出窗口中照下图操作,即将 domo 分支合并到 master 分支上。
将本地的分支推送到远程库 点击 Push 按钮,在弹出窗口上照下图操作,即可将本地库的 master 分支推送到远程库。
获取远程库的最新版本 点击 Git GUI 菜单 Remote --> Fetch from,在第三级菜单中选择恰当的远程库,在弹出窗口中照下图操作,即可获取远程库的最新版本。
另外,我们还可以选择 Remote --> Rrune from 来完成更新。git fetch 和 git pull 的区别在于:
在实际使用中,git fetch更安全一些,因为在merge前,我们可以查看更新情况,然后再决定是否合并。比如,使用 Git Bash 执行 git fetch,可以完成更精确的操作。
git fetch origin master:tmp
git diff tmp
git merge tmp
符号说明:
初始化操作:
$ git config --list # 检查已有的配置信息
$ git config --global user.name <name> # 设置提交者名字
$ git config --global user.email <email> # 设置提交者邮箱
$ git config --global core.editor <editor> # 设置默认文本编辑器
$ git config --global merge.tool <tool> # 设置解决合并冲突时差异分析工具
创建新的版本库:
$ git init [--bare] [path] # 在当前路径或 path 下创建版本库。客户端不建议使用 bare 参数
克隆已经存在的版本库:
$ git clone <remote> [path] # 在当前路径或 path 下克隆远程库
修改和提交:
$ git add . # 添加所有改动过的文件
$ git add <file> # 添加指定的文件
$ git mv <old> <new> # 文件重命名
$ git rm <file> # 删除文件
$ git rm -cached <file> # 停止跟踪文件但不删除
$ git commit -m <file> # 提交指定文件
$ git commit -m “commit message” # 提交所有更新过的文件
$ git commit -amend # 修改最后一次提交
$ git commit -C HEAD -a -amend # 增补提交(不会产生新的提交历史纪录)
查看提交历史:
$ git log # 查看提交历史
$ git log -p <file> # 查看指定文件的提交历史
$ git blame <file> # 以列表方式查看指定文件的提交历史
$ gitk # 查看当前分支历史纪录
$ gitk <branch> # 查看某分支历史纪录
$ gitk --all # 查看所有分支历史纪录
$ git branch -v # 每个分支最后的提交
$ git status # 查看当前状态
$ git diff # 查看变更内容
撤消操作:
$ git reset -hard HEAD # 撤消工作目录中所有未提交文件的修改内容
$ git checkout HEAD <file1> <file2> # 撤消指定的未提交文件的修改内容
$ git checkout HEAD. # 撤消所有文件
$ git revert <commit> # 撤消指定的提交
分支与标签:
$ git branch # 显示所有本地分支
$ git checkout <branch/tagname> # 切换到指定分支或标签
$ git branch <new-branch> # 创建新分支
$ git branch -d <branch> # 删除本地分支
$ git tag # 列出所有本地标签
$ git tag <tagname> # 基于最新提交创建标签
$ git tag -d <tagname> # 删除标签
合并与衍合:
$ git merge <branch> # 合并指定分支到当前分支
$ git rebase <branch> # 衍合指定分支到当前分支
远程操作:
$ git remote -v # 查看远程版本库信息
$ git remote show <remote> # 查看指定远程版本库信息
$ git remote add <remote> <url> # 添加远程版本库
$ git fetch <remote> # 从远程库获取代码
$ git pull <remote> <branch> # 下载代码及快速合并
$ git push <remote> <branch> # 上传代码及快速合并
$ git push <remote> : <branch>/<tagname> # 删除远程分支或标签
$ git push -tags # 上传所有标签