Git的基本使用

2018-04-25

Git中文件的状态

  • Git中文件可以处于一下三种状态之一:
    • 已修改(modified):已修改文件但尚未提交到数据库。
    • 已暂存(staged):已对修改文件作出了标识,并将其加入下一次要提交的快照中。
    • 已提交(committed):文件已安全地存入本地数据库中。
  • 根据文件的三种主要状态可以引入Git项目中的三个主要区域:
    • 工作目录:项目某个版本的单次检出,放在磁盘上以供修改。
    • 暂存区:保存下次提交修改的相关信息。
    • Git目录即仓库:保存项目元数据的地方。
  • 三个主要区域的关系
    Git三个主要区域

Git安装和配置

  • Git 安装及首次配置
    • Git的安装: 根据自己操作系统选择相应的git安装方法
    • 首次配置: Git提供git config工具来获取和设置配置变量, 配置变量主要储存在三个地方:
      • /etc/gitconfig包含系统中所有用户的配置及其仓库的值,通过git config --system读写配置。
      • ~/.gitconfig~/.config/git/config存储只针对某一用户的配置。
      • 当前仓库的Git目录中的config文件: 针对单个仓库。
    • 用户身份
      • git config --global user.name "your-name"
      • git config --global user.email "example@example.com"

Git的基本使用

  • 获取Git仓库

    • 现有目录中初始化Git仓库

      • 进入项目目录执行git init初始化Git.
      • 对需要跟踪的文件执行git add命令, 然后输入git commit命令:
        1
        2
        3
        git add *.c
        git add LICENSE
        git commit -m 'initial project version`
    • 克隆已有仓库

      • 使用git clone命令获取已有仓库的一份副本。Git会对服务器仓库的几乎所有数据完整复制。即包含整个项目历史中每个文件的所有历史版本。
      • 克隆libgit2项目: git clone https://github.com/libgit2/libgit2 该命令会创建一个名称为libgit2的目录并初始Git.
  • 在Git仓库中记录变更
    • 工作目录下文件的两种状态:
      • 已跟踪(tracked):上一次快照中包含的文件。
        • 未修改
        • 已修改(modified)
        • 已暂存
      • 未跟踪(untracked):除了已跟踪以外的所有文件。
    • 查看当前文件状态
      • 通过git status检查文件所处状态。
      • git status命令会输出当前所处分支,未提交文件,未暂存文件,未跟踪文件。
    • 跟踪新文件(未跟踪文件)
      • 通过git add 命令跟踪新文件, 例如跟踪README.md文件: git add README
      • 通过git add 命令跟踪的新文件,会被添加到暂存区等待提交。
      • 暂存已修改文件
        • 更改一个已跟踪的文件, 该文件名会出现在名为”Changes not staged for commit”的区域中,即该文件已修改但尚未保存到暂存区,要暂存这些文件需要执行git add命令。
        • git add是一个多功能命令,应该把它看成“添加内容到下一次提交中”而不是“把这个文件加入到项目中”。
        • 当我们对已暂存的文件(比如README)进行修改, 那么这个文件就会同时出现在已暂存等待提交未暂存两个区域中:
          • 当我们暂存一个文件时,Git暂存的是你执行git add时文件的样子。这时执行git commit提交的也是你上次执行git add命令时的版本。而不是现在工作目录中该文件的已更改版本, 所以再执行了git add之后如果又对已添加到暂存区的文件做了修改, 就需要再执行一次git add将最新版本保存到暂存区。
    • 显示更简洁的状态内容
      • git status -sgit status -short提供更为简洁和紧凑的形式查看变更。
      • 文件列表旁边的标记分为两列。左列代表是否已暂存,右列代表是否已修改。
      • 未被跟踪的新文件旁边有??标识。
      • 已暂存的新文件会有A标记。
      • _M代表已修改但为暂存。
      • M_代表已修改并已暂存。
      • MM代表修改并暂存之后又进行了修改,但未暂存。
    • 忽略文件
      • 如果你不希望某一类文件被Git自动添加,又不想这些文件显示在未跟踪的文件列表下面。可以创建名为.gitignore的文件,其中列出待匹配文件的模式。
    • 查看已暂存和未暂存的变更
      • git diff:
        • 告知哪些变更还没有被暂存?
        • 哪些已暂存的变更正待提交?
        • 会显示出具体添加和删除了哪些行?
      • git diff不加参数查看尚未就添加到暂存区的变更
      • git diff --staged 查看哪些已暂存的内容会进入下一次提交
    • 提交变更
      • git commitgit commit -m命令提交变更, 提交的是已暂存的文件的快照。 任何未暂存的内容仍然保持着已修改的状态。
    • 跳过暂存区提交变更
      • git -a -m: 把已跟踪的所有文件自动添加到暂存区, 然后再提交。
    • 移除文件
      • 从git移除文件,需要先从暂存区移除该文件,然后在提交。 可以通过 git rm完成。git rm还会删除工作目录下的该文件。
      • 文件保留在工作目录,但是从暂存区中移除该文件。通过git rm --cached完成。
    • 重命名文件
      • 通过git mv [file_from] [file_to]来实现重命名或文件移动。
  • 查看提交历史
    • 基本操作
      • git log会按照时间顺序列出仓库中的所有提交。
      • git log -p显示出每次提交所引入的差异。
      • git log -p -2只输出最近的两次提交。
      • git log --stat 查看每个提交的简要统计信息
      • git log --pretty 指定pretty的值更改日志默认输出格式。
      • git log --pretty=format:%h - %an, %ar:%s 指定prettyformat可以指定自己的输出格式。
      • git log --pretty=format:"%h %s" --graph 通过使用--graph选项,输出会用ASCII字符形式的简单图表来显示Git分支和合并历史。
    • 限制提交日志的输出范围
      • git log --since=2.weeks输出指定日期之后的提交。
      • git log --author=[authorName]查找某为作者的提交。
      • git log --grep=[keyword]查找包含关键字的提交。
  • 撤销操作
    • 常见情景操作
      • 提交之后发现自己忘了添加某些文件, 或写错了提交信息,可以在提交之后修改暂存区内容,然后通过git commit --amend编辑提交信息, 通过git commit --amend命令提交的信息会覆盖之前的提交信息。
      • 撤销已暂存的文件,可以通过git reset HEAD指令来把文件移除暂存区。
      • 撤销对文件的修改,可以通过git checkout指令完成。这个命令用之前版本的文件覆盖了当前已修改文件。
  • 远程仓库的使用
    • 显示远程仓库
      • git remote列出每个远程仓库的简短名字。名为origin的仓库是Git给克隆源服务器的默认名称。
      • git reomote -v列出每个远程仓库的简短名字和对应的URL。
    • 添加远程仓库
      • 要添加一个远程仓库, 并给它起一个简短的名称以便引用可以执行 git remote add [shortname] [url]命令。
    • 从远程仓库获取和拉取数据
      • git fetch [remote-name] 这条命令会从远程仓库中获取所有本地仓库没有的数据。
      • git fetch仅仅是把数据拉取到本地仓库,并不会自动将这些数据合并到本地工作成果中。
      • git pull命令自动获取远程数据, 并将远程分支并入当前本地分支。
      • git clone会自动设置你的本地master分支, 使其跟踪被克隆的服务端的master分支; 并自动添加远程仓库的地址然后取名为“Origin”。
    • 将数据推送到远程仓库
      • 通过git push [reomote-name] [branch-name]把变更推送到远程仓库。 默认会把本地的master分支推送到远程的origin 服务器上。
      • 上述命令能够正常工作的前提是必须拥有克隆下来的远程仓库的读写权限, 并且克隆后没有其他人向远程仓库推送过数据, 如果别人和你都克隆了这个仓库, 而他先推送, 你后推送, 那么你的推送会被拒绝, 你必须先拉去别人的变更, 整合到你的工作成果中, 然后才能推送。
    • 检查远程仓库
      • git remote show [remote-name] 查看某一远程仓库的更多信息。
    • 删除和重命名远程仓库
      • git remote rename pb paul 重命名远程仓库pb为paul。
      • 可以通过git remote rm来删除某一远程仓库。
  • 标记
    • 列举标签
      • git tag列举标签
    • 创建注释标签
      • 通过执行带有-a选项的git tag命令创建注释标签。
      • -m选项指定了标记信息。
      • git show展示标签数据和对应的提交。
    • 创建轻量标签
      • 轻量标签不包含其他信息,只保存提交时的校验和。
      • 通过git tag创建, 不需要使用-a, -s-m选项。
    • 补加标签
      • 若想为之前的提交添加标签, 可以通过git tag -a [标签名] [之前提交校验和]命令来完成。
    • 共享标签
      • 默认情况下, git push不会把标签传输到远程服务器上。需要通过git push origin [tagname]将标签传输到远程服务器上。
      • git push --tags把所有服务器上还没有的标签都推送过去。