Git 快速入门

创建远程 Repository(仓库)

在使用Repository(仓库)之前,我们首先需要创建仓库,创建仓库有很多种,这里常见的有如下几种:
自己搭建个 Git 服务器,如 GitLab 的Git版本管理系统
使用第三方托管平台,如国内的 http://git.oschina.net 和国外的 http://github.com/

有两种取得 Git 项目仓库的方法。第一种是从一个服务器克隆一个现有的 Git 仓库。第二种是在现有项目或目录下导入所有文件到 Git 中;

克隆现有的仓库

如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,想为某个开源项目贡献自己的一份力,这时就要用到 git clone 命令。 如果你对其它的 VCS 系统(比如说Subversion)很熟悉,请留心一下这里所使用的命令是”clone“而不是”checkout“。 这是 Git 区别于其它版本控制系统的一个重要特性,Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone 命令的时候,默认配置下,远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。如果服务器的磁盘坏掉了,通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库。

在代码工作空间,单击右键,在弹出的菜单中选择“Git Bash”
执行命令 git clone [url]
如,$ git clone http://git.oschina.net/test/git-learn.git
如果想在克隆远程仓库的时候,自定义本地仓库的名字,可以使用如下命令:
如,$ git clone http://git.oschina.net/test/git-learn.git study_git

这会在当前目录下创建一个名为 “git-learn.git” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。

Git 支持多种数据传输协议。 上面的例子使用的是 http:// 协议,不过也可以使用 git:// 协议或者使用 SSH 传输协议,比如 user@server_ip-or-host:path/to/repo.git 。在服务器上搭建 Git 将会介绍所有这些协议在服务器端如何配置使用,以及各种方式之间的利弊。

在现有目录中初始化仓库

如果不克隆现有的仓库,而是打算使用 Git 来对现有的项目进行管理。假设有一个项目的目录是:F:\git_learn,只需要在该项目的目录中打开 Git Bash 并执行命令

$ git init

该命令将创建一个名为 .git 的子目录,这个子目录含有初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,项目里的文件还没有被跟踪。

文件跟踪

在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库进行版本控制
可通过下面的命令来实现对指定文件的跟踪

$ git add .

可通过下面的命令来将代码提交到本地仓库

$ git commit -m '提交内容说明'

检查当前文件状态

要查看哪些文件处于什么状态,可以用 git status 命令。

这里写图片描述

这说明

所有已跟踪文件在上次提交后都未被更改过
当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来
当前所在分支,分支名是 “master”, 这是默认的分支名
这个分支同远程服务器上对应的分支没有偏离

状态简览

git status 命令的输出十分详细,但其用语有些繁琐。 如果你使用 git status -s 命令或 git status –short 命令,将得到一种更为紧凑的格式输出。 运行 git status -s,状态报告输出如下:

这里写图片描述

新添加的未跟踪文件前面有 ?? 标记
新添加到暂存区中的文件前面有 A 标记
修改过的文件前面有 M 标记

你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。

忽略文件

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。

文件 .gitignore 的格式规范如下

所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

查看修改内容

1. 查看具体修改了什么地方? 
2. 当前做的哪些更新还没有暂存? 
3. 有哪些更新已经暂存起来准备好了下次提交?
可以用 git diff 命令。

1.要查看尚未暂存的文件更新了哪些部分,直接输入 git diff 文件名

请注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因。

2.要查看已经暂存的文件更新了哪些部分,用 git diff –cached 文件名

(--staged 和 --cached 是同义词)

提交更新

现在的暂存区域已经准备妥当可以提交了。 在此之前,请一定要确认还有什么修改过的或新建的文件还没有 git add 过,否则提交的时候不会记录这些还没暂存起来的变化。 这些修改过的文件只保留在本地磁盘。 所以,每次准备提交前,先用 git status 看下,是不是都已暂存起来了,如果没有暂存起来则先将所有文件暂存起来, 然后再提交。

执行命令 git commit,不加任何参数的方式会启动文本编辑器以便输入本次提交的说明。 (默认会启用 shell 的环境变量 $EDITOR 所指定的软件,一般都是 vim 或 emacs。使用 git config –global core.editor 命令设定你喜欢的编辑软件。)

另外,也可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行,如下所示:

这里写图片描述

现在已经创建了第一个提交!

提交后它会告诉你 ===>>>
当前是在哪个分支(master)提交的
本次提交的完整 SHA-1 校验和是什么(463dc4f)
在本次提交中,有多少文件修订过,多少行添加和删改过

请记住,提交时记录的是放在暂存区域的快照。
任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。
每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。

在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add . 步骤
$ git commit -a -m ‘modify: readme.txt’

移除文件

要从 Git 中移除某个文件,可以执行 $ git rm 文件名 命令,从已跟踪文件清单中移除(确切地说,是从暂存区域移除),并连带从工作目录中删除指定的文件,然后提交,这样以后就不会出现在未跟踪文件清单中了。

如果只是简单地执行命令 r m r e a d m e . t x t git status 时会在 未暂存清单看到 deleted: readme.txt 字样。

这里写图片描述

此时,在原目录下新添加一个 readme.txt,执行命令 $ git status 会看到 modified: readme.txt 字样,而不是 new file 字样。

这里写图片描述

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(注:即 force 的首字母)。 这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被 Git 恢复。

这里写图片描述

这里写图片描述

提示:需要执行命令 $ git rm -f readme.txt

这里写图片描述

如果删除已经提交到仓库的文件,可以执行命令 $ git rm 文件名

这里写图片描述

可以看到 $ git rm (-f) 文件名 命令,删除的文件,会直接 add 到暂存区

这里写图片描述

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。
如,当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。 为达到这一目的,需要执行命令 $ git rm –cached other_commit.txt

这里写图片描述

此命令删除 test/ 目录下的扩展名为 .txt 的所有文件,如果删除后 test/ 为空,则连同 test/ 目录一并删除

$ git rm test/\*.txt

这里写图片描述

这里写图片描述

该命令为删除指定目录下所有文件,如果删除后 test/ 为空,则连同 test/ 目录一并删除

$ git rm test/\*

这里写图片描述

该命令为删除以 ~ 结尾的所有文件

$ git rm \*~

3.11 移动文件

$ git mv file_from file_to

其实,运行 git mv 就相当于运行了下面三条命令:

$ mv README.md README
$ git rm README.md
$ git add README

不过有时候用其他工具批处理改名的话,要记得在提交前删除老的文件名,再添加新的文件名。

查看提交历史

在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。只需执行 $ git log 命令

$ git log
commit fa7a211c425c3d2da120c8b8f56044a8483d2e99
Author: your_name <your_email@mail.com>
Date:   Thu May 31 00:00:00 2018 +0800

    add: test 文件夹及文件

默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。
正如你所看到的,这个命令会列出 每个提交的
SHA-1 校验和、
作者的名字和电子邮件地址、
提交时间以及提交说明

更多 g i t l o g 使 G i t B a s h git log –help 查看

git log 有许多选项可以帮助你搜寻你所要找的提交, 接下来我们介绍些最常用的。

//查看指定某人的提交记录
$ git log --author=用户名

这里写图片描述

一个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交:

这里写图片描述

该选项除了显示基本信息之外,还附带了每次 commit 的变化。 当进行代码审查,或者快速浏览某个搭档提交的 commit 所带来的变化的时候,这个参数就非常有用了。 你也可以为 git log 附带一系列的总结性选项。 比如说,如果你想看到每次提交的简略的统计信息,可以使用 –stat 选项:

$ git log --stat

这里写图片描述

正如你所看到的,–stat 选项在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结。

另外一个常用的选项是 –pretty。这个选项可以指定使用不同于默认格式的方式展示提交历史。这个选项有一些内建的子选项供你使用。如 oneline,short,full 和 fuller

$ git log --pretty

这里写图片描述

//将每个提交放在一行显示,查看的提交数很大时非常有用
$ git log --pretty=oneline

这里写图片描述

但最有意思的是 format,可以定制要显示的记录格式。这样的输出对后期提取分析格外有用,因为你知道输出的格式不会随着 Git 的更新而发生改变:

$ git log --pretty=format:"%h - %an, %ar : %s"

这里写图片描述

git log –pretty=format 常用的选项 列出了常用的格式占位符写法及其代表的意义。

你一定感到奇怪 作者 和 提交者 之间究竟有何差别, 其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。 所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。 我们会在 分布式 Git 再详细介绍两者之间的细微差别。

当 oneline 或 format 与另一个 log 选项 –graph 结合使用时尤其有用。 这个选项添加了一些ASCII字符串来形象地展示你的分支、合并历史:

$ git log --pretty=format:"%h %s" --graph

这里写图片描述

$ git log –pretty=format:”%h - %an, %ar : %s” –graph

这里写图片描述

撤消操作

在任何一个阶段,你都有可能想要撤消某些操作。这里,我们将会学习几个撤消你所做修改的基本工具。注意,有些撤消操作是不可逆的。这是在使用 Git 的过程中,会因为操作失误而导致之前的工作丢失的少有的几个地方之一。

如,有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有 –amend 选项的提交命令尝试重新提交,这个命令会将暂存区中的文件提交,如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。

$ git add .
$ git commit -m'deleted'
$ git commit --amend
输入提交信息说明为
    modify: learn git commit --amend

文本编辑器启动后,可以看到之前的提交信息。
编辑后保存会覆盖原来的提交信息。
最终你只会有一个提交,第二次提交将代替第一次提交的结果。

这里写图片描述

这里写图片描述

取消暂存的文件

如,你已经修改了两个文件并且想要将它们作为两次独立的修改提交,但是却意外地输入了 git add * 暂存了它们两个。 如何只取消暂存两个中的一个呢?

git status 命令查看文件状态时,已经给出撤销操作的命令提示

//以下两个命令效果相同
$ git add *
$ git add .

这里写图片描述

//使用命令,撤销将 temp.txt 修改的内容添加到暂存区
$ git reset HEAD temp.txt

这里写图片描述

撤消对文件的修改

如果并不想保留对 temp.txt 文件的修改怎么办?该如何方便地撤消修改,将它还原成上次提交时的样子(或者刚克隆完的样子,或者刚把它放入工作目录时的样子)? git status 也告诉了你应该如何做。

//在执行 $ git commit 命令之前使用
$ git checkout -- temp.txt

这里写图片描述

如果仍然想保留对那个文件做出的修改,但是现在仍然需要撤消,我们将会在 Git 分支介绍“保存进度与分支”,这些通常是更好的做法。

//TODO

记住,在 Git 中任何已提交的东西几乎总是可以恢复的。甚至那些被删除的分支中的提交或使用 –amend 选项覆盖的提交也可以恢复。然而,任何你未提交的东西丢失后很可能再也找不到了。

远程仓库的使用

前面所有讲解的内容都是一个人“自娱自乐”, Git这东西自己玩也没有多大意思,没有发挥出来Git最牛逼的地方。要使用Git在项目上多人协作那才有意思。

为了能在任意 Git 项目上协作,需要知道如何管理自己的远程仓库。远程仓库是指托管在因特网或其他网络中的你的项目的版本库。可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。在本节中,介绍了一部分远程管理的技能。

查看远程仓库

如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出你指定的每一个远程服务器的简写。 如果已经克隆了自己的仓库,那么至少应该能看到 origin,这是 Git 给你克隆的仓库服务器的默认名字

$ git clone http://git.oschina.net/yiibai/git-start.git

Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 157 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 74.35 KiB | 168.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.

$ cd git-start
$ git remote

origin

也可以指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。

$ git remote -v

origin  http://git.oschina.net/yiibai/git-start.git (fetch)
origin  http://git.oschina.net/yiibai/git-start.git (push)

如果远程仓库不止一个,该命令会将它们全部列出。
如,与几个协作者合作的,拥有多个远程仓库

$ cd git-start
$ git remote -v

mydoor  http://git.oschina.net/yiibai/git-start.git (fetch)
mydoor  http://git.oschina.net/yiibai/git-start.git (push)
curry     http://git.oschina.net/yiibai/git-start.git (fetch)
curry     http://git.oschina.net/yiibai/git-start.git (push)
deepfun   http://git.oschina.net/yiibai/git-start.git (fetch)
deepfun   http://git.oschina.net/yiibai/git-start.git (push)
koke      http://git.oschina.net/yiibai/git-start.git (fetch)
koke      http://git.oschina.net/yiibai/git-start.git (push)

这样可以轻松拉取其中任何一个用户的贡献。 此外,大概还会有某些远程仓库的推送权限,虽然目前还不会在此介绍。

添加远程仓库

执行 git remote add 命令,添加一个新的远程 Git 仓库,同时指定一个可以轻松引用的简写,注意:此时你换到其他clone 下来的文件夹中执行 $ git remote -v 命令,是没有新增的远程库的

$ git remote

origin

$ git remote add test http://git.oschina.net/yiibai/git-start.git
$ git remote -v

test      http://git.oschina.net/yiibai/git-start.git (fetch)
test      http://git.oschina.net/yiibai/git-start.git (push)
origin  http://git.oschina.net/yiibai/git-start.git (fetch)
origin  http://git.oschina.net/yiibai/git-start.git (push)

TODO (并没有看到效果啊),现在你可以在命令行中使用字符串 test 来代替整个 URL。 例如,如果想拉取仓库中有但你没有的信息,执行$ git fetch test 命令

$ git fetch gs

From http://git.oschina.net/yiibai/git-start
 * [new branch]      master     -> gs/master

现在 master 分支可以在本地通过test/master 访问到,可以将它合并到自己的某个分支中,或者如果你想要查看它的话,可以检出一个指向该点的本地分支。

从远程仓库中抓取与拉取数据

$ git fetch [remote-name]

这个命令会访问远程仓库,从中拉取所有还没有的数据。执行完成后,将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。

如果使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到本地仓库,它并不会自动合并或修改当前的工作。 当准备好时必须手动将其合并入你的工作区。

如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。 这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

6.3 推送到远程仓库

当想分享你的项目时,必须将其推送到上游。 这个命令很简单:git push [remote-name] [branch-name]。 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将所做的备份到服务器:

$ git push origin master

只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。

现在我们要把前所有添加和修改的内容添加到远程仓库,以便其协同的开发人员也可以获取到我们提交的内容。执行以下命令时,会要求我们输入在 http://git.oschina.net/ 注册的用户名和密码。

查看远程仓库

如果想要查看某一个远程仓库的更多信息,可以使用 git remote show [remote-name] 命令。 如果想以一个特定的缩写名运行这个命令,例如 origin,会得到像下面类似的信息:

$ git remote show origin

* remote origin
  Fetch URL: http://git.oschina.net/yiibai/git-start.git
  Push  URL: http://git.oschina.net/yiibai/git-start.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

它同样会列出远程仓库的 URL 与跟踪分支的信息。 这些信息非常有用,它告诉你正处于 master 分支,并且如果运行 git pull,就会抓取所有的远程引用,然后将远程 master 分支合并到本地 master 分支。 它也会列出拉取到的所有远程引用。

这是一个经常遇到的简单例子。 如果你是 Git 的重度使用者,那么还可以通过 git remote show 看到更多的信息。

这个命令列出了当你在特定的分支上执行 git push 会自动地推送到哪一个远程分支。 它也同样地列出了哪些远程分支不在你的本地,哪些远程分支已经从服务器上移除了,还有当你执行 git pull 时哪些分支会自动合并。

远程仓库的移除与重命名

如果想要重命名引用的名字可以运行 git remote rename 去修改一个远程仓库的简写名。 例如,想要将 gs 重命名为 newgs,可以用 git remote rename 这样做:

$ git remote rename gs newgs
$ git remote

origin
newgs

值得注意的是这同样也会修改你的远程分支名字。 那些过去引用 gs/master 的现在会引用 newgs/master。

如果因为一些原因想要移除一个远程仓库,你已经从服务器上搬走了或不再想使用某一个特定的镜像了,又或者某一个贡献者不再贡献了 - 可以使用 git remote rm :

$ git remote rm newgs
$ git remote

origin

至此、Over

猜你喜欢

转载自blog.csdn.net/qq_34801506/article/details/80499904