git常用命令


张登友,张登友的博客,张登友的网站——

Git 常用命令

Git 常用命令速查表

创建版本库

git clone <url>                  #克隆远程版本库
git init                         #初始化本地版本库

修改和提交

git status                       #查看状态
git diff                         #查看变更内容
git add .                        #跟踪所有改动过的文件
git add <file>                   #跟踪指定的文件
git mv <old><new>                #文件改名
git rm<file>                     #删除文件
git rm --cached<file>            #停止跟踪文件但不删除
git commit -m "commit messages"  #提交所有更新过的文件
git commit --amend               #修改最后一次改动

查看提交历史

git log                    #查看提交历史
git log -p <file>          #查看指定文件的提交历史
git blame <file>           #以列表方式查看指定文件的提交历史

撤销

git reset --hard HEAD      #撤销工作目录中所有未提交文件的修改内容
git checkout HEAD <file>   #撤销指定的未提交文件的修改内容
git revert <commit>        #撤销指定的提交
git log --before="1 days"  #退回到之前1天的版本

分支与标签

git branch                   #显示所有本地分支
git checkout <branch/tag>    #切换到指定分支和标签
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/tag-name\>  #删除远程分支或标签
git push --tags                       #上传所有标签

Git 基础概念

Git 系统介绍

若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余。在开始学习 Git 的时候,请努力分清你对其它版本管理系统的已有认识,如 Subversion 和 Perforce 等;这么做能帮助你使用工具时避免发生混淆。 Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。

直接记录快照,而非差异比较

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

存储每个文件与初始版本的差异。

Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。当你每次重新提交更新代码时,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流

Git 存储项目随时间改变的快照。

这是 Git 与几乎所有其它版本控制系统的重要区别。 因此 Git 重新考虑了以前每一代版本控制系统延续下来的诸多方面。 Git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。 稍后我们在 Git 分支讨论 Git 分支管理时,将探究这种方式对待数据所能获得的益处。

近乎所有操作都是本地执行

在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。 如果你习惯于所有操作都有网络延时开销的集中式版本控制系统,Git 在这方面会让你感到速度之神赐给了 Git 超凡的能量。 因为你在本地磁盘上就有项目的完整历史,所以大部分操作看起来瞬间完成。

举个例子,要浏览项目的历史,Git 不需外连到服务器去获取历史,然后再显示出来——它只需直接从本地数据库中读取。 你能立即看到项目历史。 如果你想查看当前版本与一个月前的版本之间引入的修改,Git 会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。

这也意味着你离线或者没有 VPN 时,几乎可以进行任何操作。 如你在飞机或火车上想做些工作,你能愉快地提交,直到有网络连接时再上传。 如你回家后 VPN 客户端不正常,你仍能工作。 使用其它系统,做到如此是不可能或很费力的。 比如,用 Perforce,你没有连接服务器时几乎不能做什么事;用 Subversion 和 CVS,你能修改文件,但不能向数据库提交修改(因为你的本地数据库离线了)。 这看起来不是大问题,但是你可能会惊喜地发现它带来的巨大的不同。

Git 保证完整性

Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。

Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值。 实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

Git 一般只添加数据

你执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。 同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容;但是一旦你提交快照到 Git 中,就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。

这使得我们使用 Git 成为一个安心愉悦的过程,因为我们深知可以尽情做各种尝试,而没有把事情弄糟的危险。 更深度探讨 Git 如何保存数据及恢复丢失数据的话题,请参考撤消操作。

Git 工作的三种状态

  • 已修改(modified) ———— 表示修改了文件,但还没保存到数据库中;
  • 已暂存(staged) ———— 表示对一个已修改文件的当前版本做了追踪,使之包含在下次提交的快照中;
  • 已提交(committed)———— 表示数据已经安全的保存在本地数据库中;

初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。 在编辑过某些文件之后,Git 会将这些文件标记已修改。我们把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些已暂存起来的文件,如此重复。使用 Git 时的文件状态变化周期如图所示。

图片

随着您深入使用 Git,会希望使用各式各样便捷快速的指令

Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”,不过一般说法还是叫暂存区域。

基本的 Git 工作流程如下:

  1. 在工作目录中修改文件。
  2. 暂存文件,将文件的快照放入暂存区域。
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。 在 Git 基础中,你会进一步了解这些状态的细节,并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。

命令行

Git 有多种使用方式。 你可以使用原生的命令行模式,也可以使用 GUI 模式,这些 GUI 软件也能提供多种功能。 在此文,我们将使用命令行模式。这是因为只有在命令行模式下你才能执行 Git 的所有命令,而大多数的 GUI 软件只实现了 Git 所有功能的一个子集以降低操作难度。 如果你学会了在命令行下如何操作,那么你在操作 GUI 软件时应该也不会遇到什么困难,反之则不成立。此外,由于每个人的想法与侧重点不同,不同的人常常会安装不同的 GUI 软件,但 所有 人一定会有命令行工具。

假如你是 Mac 用户,我们希望你懂得如何使用终端(Terminal);假如你是 Windows 用户,我们希望你懂得如何使用命令窗口(Command Prompt)或 PowerShell。 如果你尚未掌握以上技能,我们建议你先停下来快速学习一下,下文的讲述和举例将用到这些技能。

Git 配置

每台计算机上只需要配置一次 Git 环境,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

  1. /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
  2. ~/.gitconfig~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
  3. 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。

每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。

在 Windows 系统中,Git 会查找 HOME 目录下(一般情况下是 C:\Users\USER)的 .gitconfig 文件。 Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。

文本编辑器

既然用户信息已经设置完毕,你可以配置默认文本编辑器了,当 Git 需要你输入信息时会调用它。 如果未配置,Git 会使用操作系统默认的文本编辑器,通常是 Vim。 如果你想使用不同的文本编辑器,例如 Emacs,可以这样做:

git config --global core.editor emacs

检查配置信息

如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。

git config --list
  user.name=John Doe
  user.email=johndoe@example.com
  color.status=auto
  color.branch=auto
  color.interactive=auto
  color.diff=auto
  ...

你可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。

你可以通过输入 git config : 来检查 Git 的某一项配置

git config user.name John Doe

用户信息设置

安装完 Git 后应该及时设置你的用户名称与邮件地址,此后每次 Git 的提交都会使用这些信息。在 Git 终端输入一下命令即可设置你的用户信息。

git config --global user.name "你的名称"
git config --global user.email "你的邮箱"

账户及用户信息设置

例如您的账户昵称叫【zdy】,在 Git 中的用户信息配置为:【名称 – zdy】,【邮箱 – xxxx@qq.com】。

使用 Git 实践代码推拉

在这一步的操作中,将会说明如何利用 Git 工具配合使用 CODING 代码托管服务,助力您的代码上云之旅。在动手之前,请确保您已完成远程代码仓库初始化与知悉 Git 基础概念并清晰地理解 git 文件状态。如果您已掌握基础知识,可以直接浏览更详细的 Git 仓库管理

克隆远程仓库代码

接下来,选择合适的地方创建一个新文件夹「learn-git」,在里面运行 Git 终端,输入 git init 命令完成本地仓库初始化。接着,输入 git clone 您的仓库链接克隆远程仓库代码。

修改文件

在新出现的文件夹中新建 readme.txtlearn-git.txt 文件,在其中一个文件中写入 I'm learning git.(当然您也可以自由发挥)这句话并保存。

跟踪文件 (git add)

创建文件和修改文件后需要添加进仓库并命令 Git 开始跟踪文件。您可以一次性把单个文件或多个文件添加到仓库都可以,用到的命令都是 git add

添加一个文件时直接在终端输入 git add后面空一格输入完整的文件名(包含后缀,如.txt):

git add readme.txt

添加多个文件也类似,git add后面空格输入完整的文件名,文件名之间用空格分隔:

git add readme.txt learn_git.txt

如果您想一次性跟踪所有文件,则可以直接在终端输入 git add . ,注意末尾的.不要遗漏。

提交文件 (git commit)

git commit命令把文件提交到仓库,一次性会提交所有你已经添加的文件:

git commit -m "wrote a readme and a learn_git file"
[master (root-commit) 7c57f05] wrote a readme and a learn_git file
 2 files changed, 2 insertions(+)
 create mode 100644 learn_git.txt
 create mode 100644 readme.txt

提交命令为git commit-m后面引号中的内容是你的提交说明,下面几行是终端的返回结果。养成每次提交文件时附上变更说明的习惯,以便清楚地把控提交了什么样的修改。

``符号是使用终端时自动输入的,您并不需要输入此符号。

查看文件状态 (git status)

不确定 Git 是否精准的追踪了修改过的文件?想再次确认文件处于哪种状态?使用git status命令查看文件状态。

当前仓库里任何文件都没有被跟踪时返回结果如下:

git status
On branch master
Your branch is up-to-date with 'origin/master'
nothing to commit, working directory clean

当文件已跟踪但没有提交到仓库时返回结果如下:

git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout --   ..." to discard changes in working directory)
 
    modified:   learn_git.txt
    modified:   readme.txt
 
no changes added to commit (use "git add" and/or "git commit -a")

当文件已跟踪且已经提交到仓库时,返回结果如下:

git status
On branch master
nothing to commit, working tree clean

Tips: 使用 Git 管理文件时,每次结束工作前请依次执行git addgit commit命令将文件提交到仓库。

推送文件到远程仓库 (git push)

在终端运行命令

git push

将文件推送到远程仓库后出现的结果:

git push origin master
Counting objects: 8, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (8/8), 626 bytes | 626.00 KiB/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To https://e.coding.net/coding/learn-git.git
* [new branch]      master -> master

git push 是推送命令,实际上是把本地的 master 分支推送到了远程仓库,相当于在远程有了一个代码仓库的备份。

使用 Git 管理文件时,每次结束工作前请依次执行git addgit commitgit push命令将文件推送到远程仓库。

完成回到远程代码仓库,会出现刚刚创建的文件。同时,如果有多人协作维护该远程代码仓库,待他人提交代码后,您只需要在本地运行 git pull 命令即可保持同步。

本地仓库

创建本地仓库

切换路径到目标目录,执行: git init 命令行中会出现以下提示

Initialized empty Git repository in X:/XXX/.git/

表示 Git 仓库创建成功,当前目录中会出现一个 .git 文件夹,所有 Git 需要的资源环境都存放在这个目录中。该文件夹默认情况下是隐藏的,您可以根据需求选择是否开启。

克隆远程仓库到本地

可以直接通过 git clone 命令来直接复制远程仓库到本地目录:

git clone https://e.coding.net/team-name/learn-git.git

运行该命令之后,当前目录下会出现一个名为 「learn-git」 的文件夹,其中包含一个 .git 文件夹,用于保存下载下来的所有版本记录,您可从中取出最新版本的文件拷贝。如果希望在克隆的时候自定义文件夹名称,可以在上面的命令末尾指定新的名字:

git clone https://e.coding.net/team-name/learn-git.git study-git

⚠️ 上述 clone 使用的是 HTTPS 的方式,CODING 支持 SSH,HTTPS, Git 3 种方式获取代码。

远程仓库

添加远程仓库

CODING 支持以下 HTTPS 和 SSH 两种协议对 Git 仓库进行访问,建议使用 SSH 协议创建远程项目,查看如何初始化远程仓库

  1. 复制项目地址;

  2. 给远程仓库一个别名;

    git remote add “remote-name” “url”

    命令,以 SSH 地址为例运行:

    git remote add learn-git git@e.coding.net:coding/Coding-Feedback.git

    “remote-name” 是给远程仓库起的别名,一般是 “origin”,用户可以根据自己的需求自定义。此处以 CODING 上的一个公开项目 Coding-Feedback 为例,添加其为远程仓库,并取别名为 “learn-git”,后续可以用字符串 “learn-git“ 指代对应的远程仓库。接下来用 git remote 命令来查看当前添加的远程仓库,使用 git remote -v 命令得到以下结果:

    learn-git    git@e.coding.net:coding/Coding-Feedback.git (fetch)
    learn-git    git@e.coding.net:coding/Coding-Feedback.git (push)

从远程仓库获取数据

可以用下面的命令从远程仓库抓取数据到本地:

git fetch “remote-name”

推送数据到远程仓库

使用 git push “remote-name” “branch-name” 可以将本地仓库中的数据推送到远程仓库,如: git push learn-git master会将本地的仓库数据推送到远程仓库的 “master” 分支。

重命名远程仓库

使用 git remote rename 命令修改某个远程仓库在本地的简称,比如想把 learn-git 改成 origin,可以这么运行:

git remote rename learn-git origin

解除远程仓库关联

比如要解除和远程仓库 “origin” 的关联,运行:

git remote rm origin

注意,此命令是解除了本地仓库和远程仓库的关联,并不是删除了远程仓库的数据。

本地分支管理

创建并切换到分支

使用git checkout -b【分支名称】命令可以创建一个分支并切换过去:

git checkout -b learn-checkout

单独创建分支

新建一个名为【learn-branch】的分支命令如下:

git branch learn-branch

单独切换分支

创建完分支之后使用 git branch 命令查看分支:

git branch
* master
  learn-branch

可以看到「master」分支上有一个 *,说明当前是处在 「master」 分支上,也就是说创建完分支后需要我们手动切换到 「learn-branch」,使用 git checkout 「分支名称」命令:

git checkout learn-branch
Switched to branch 'learn-branch'

再使用 git branch 命令查看,会发现已经切换到【 learn-branch 】分支:

git branch
* learn-branch
  master

查看分支间差异

点击【代码仓库】->【代码对比】,系统会比较版本差异并检测能否自动合并。可选择不同的分支、标签进行对比,点击文件改动 TAB,即可查看所有代码行级改动。


文章作者: 张登友
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张登友 !
  目录