Git基础和Git分支

123 阅读8分钟

Git 基础

获取 Git 仓库 有两种获取 Git 项目仓库的方式:

  • 将尚未进行版本控制的本地目录转换为 Git 仓库;
  • 从其它服务器 克隆 一个已存在的 Git 仓库。 Git 初始化仓库。
# 创建本地 Git 仓库,即初始化,进入该项目目录中。
git init
# 之后可以使用 git remote add <url> 连接远程仓库。通过 git fetch 或 git pull 获取远程仓库数据。

# 克隆现有远程仓库(直接获取 Git 仓库,已初始化)。Git 支持多种数据传输协议:https:// 协议,git:// 协议,SSH 传输协议。
git clone <url>

记录每次更新到仓库

工作目录下的每一个文件都不外乎这两种状态:已跟踪 或 未跟踪。

  • 已跟踪的文件是指那些被纳入了版本控制的文件,它们的状态可能是未修改,已修改或已放入暂存区。工作目录中除已跟踪文件外的其它所有文件都属于未跟踪文件,没有被放入暂存区。

查看仓库中文件状态

# 查看哪些文件处于什么状态。
git status
# 状态简览,缩短状态命令的输出,这样可以以简洁的方式查看更改。
git status -s
git status -short

跟踪新文件

# 使用命令 git add 开始跟踪一个文件。git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
git add README.md

忽略某些文件,即不推送到远程仓库

# 创建一个名为 .gitignore 的文件。
cat .gitignore
# 列出要忽略的文件的模式。
# 忽略 .a 文件。
*.a
# 忽略以波浪线(~)结尾的文件。
*~
# 跟踪所有 lib.a 文件。
!lib.a
# 忽略任何目录下名为 build 的文件夹。
build/

提交文件

# 提交更新。
git commit
# 可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行。
git commit -m "description"
# 跳过使用暂存区域,即跳过 git add 命令。
git commit -a -m "description"

移除文件

# 简单地从工作目录中手工删除文件。
git rm <file>
# 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f。
# 想让文件保留在磁盘,但是并不想让 Git 继续跟踪,使用 --cached 选项。
git rm --cached <file>

查看文件提交历史

最简单而又有效的工具是 git log 命令。

# 不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。
git log
# -p 显示每次提交所引入的差异,-2 显示最近两次提交。
git log -p -2
# 想看到每次提交的简略统计信息,使用 --stat 选项。
git log --stat
# --pretty 设置信息格式,使用不同于默认格式的方式展示提交历史。
git log --pretty=online
# --since --until 按照时间作限制,列出最近两周的所有提交。
git log --since=2.weeks

撤销操作

注意,有些撤消操作是不可逆的。

# 提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。运行带有 --amend 选项的提交命令来重新提交。
git commit --amend
# 提交后发现忘记了暂存某些需要的修改,操作如下:
git commit -m 'initial commit'
git add forgotten_file
git commit --amend

取消暂存文件

# 取消暂存,即取消 git add 命令。
git reset HEAD <file>
# 撤消修改,将它还原成上次提交时的样子。请务必记得 git checkout -- <file> 是一个危险的命令。
git checkout -- <file>

远程仓库的使用

  • 远程仓库是指托管在因特网或其他网络中的你的项目的版本库。
# 查看远程仓库,列出你指定的每一个远程服务器的简写。。
git remote
# 指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
git remote -v
# 连接远程仓库,需要先手动初始化一个仓库。同时指定一个方便使用的简写。
git remote add <shortname> <url>
# 从远程仓库抓取或拉取数据。git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工作。
git fetch <remote>
# 推送到远程仓库。
git push origin <master>
# 查看某个远程仓库。
git remote show <remote>
# 远程仓库的重命名。
git remote rename pd paul
# 远程仓库的移除。一旦你使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。
git remote remove paul

打标签

# 列出已有的标签。
git tag
# * 表示 1.0.0 相关。-l 命令以字母顺序列出标签。
git tag -l "v1.0.0*"
# 创建轻量标签。
git tag v1.0
# 附注标签,运行 tag 命令时指定 -a 选项。-m 选项指定一条将会存储在标签中的信息。
git tag -a v1.0 -m "version 1.0"
# 查看标签中的信息。
git show v1.0
# 后期打标签,使用 SHA-1 值。
git tag -a v0.1 9fc3b02
# 共享标签,传送标签到远程仓库服务器上。
git push origin v1.1
# 一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令,把所有不在远程仓库服务器上的标签全部传送到那里。
git push origin --tags
# 删除标签,不删除远程仓库中的标签
git tag -d v1.4
# 删除远程标签,用 git push <remote> :refs/tags/<tagname> 来更新远程仓库。将冒号前面的空值推送到远程标签名,从而高效地删除它。
git push origin :refs/tags/v1.4
# 更直观的删除远程标签的方式是。
git push origin --delete <tagname>
# 检出标签,查看某个标签所指向的文件版本。
git checkout 1.0

Git 别名

  • 别名可以使你的 Git 体验更简单、容易、熟悉。
# 不想每次都输入完整的 Git 命令,通过 git config 文件为每一个命令设置别名。如:
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

Git 分支

分支简介

  • Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。
# 分支创建,创建 develop 分支。
git branch develop
# 使用 git log 命令查看各个分支当前所指的对象。提供这一功能的参数是 --decorate。
git log --oneline --decorate
# 分支切换,切换到一个已存在的分支,使用 git checkout 命令。
git checkout testing

分支的新建与合并

# 新建一个分支并同时切换到那个分支上,你可以运行一个带有 -b 参数的 git checkout 命令。
git checkout -b iss53
# 切换回 master 分支。
git checkout master
# 使用 git merge 命令,将分支合并回你的 master 分支来部署到线上。有时候合并操作不会如此顺利。如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们,就会产生合并冲突。
git merge iss53
# 可以使用带 -d 选项的 git branch 命令来删除分支。
git branch -d iss53

分支管理

# 分支列表,不加任何参数运行 git branch。
git branch
# 查看分支最后一次提交。
git branch -v
# 查看哪些分支已经合并到当前分支。
git branch --merged
# 查看未合并工作的分支,git branch -d 命令删除它时会失败。
git branch --no-merged

远程分支

  • 远程引用是对远程仓库的引用(指针),包括分支、标签等等。
# 推送,显式地推送想要分享的分支,与远程仓库同步。
git push <remote> <branch>
# 拉取数据,从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。
git fetch
# 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令。由于 git pull 的魔法经常令人困惑所以通常单独显式地使用 fetch 与 merge 命令会更好一些。
git pull
# 删除远程分支,运行带有 --delete 选项的 git push 命令。
git push origin --delete develop

变基

  • 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase。

  • 整合分支最容易的方法是 merge 命令。会把两个分支的最新快照以及二者最近的共同祖先进行三方合并,合并的结果是生成一个新的快照(并提交)。

git checkout master
git merge experiment

变基(rebase):将提交到某一分支上的所有修改都移至另一分支上。原理是首先找到这两个分支的最近共同祖先,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底, 最后以此将之前另存为临时文件的修改依序应用。

# 检出 experiment 分支,然后将它变基到 master 分支上。
git checkout experiment
git rebase master

变基的风险,遵守一条准则:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

服务器上的Git 协议

Git 可以使用四种不同的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议。

生成 SSH 公钥

默认情况下,用户的 SSH 密钥存储在其 ~/.ssh 目录下。

# -o 选项,它会以比默认格式更能抗暴力破解的格式保存私钥。
ssh-keygen -o
# 展示密钥。
cat ~/.ssh/id_rsa.pub