GIT November 21, 2019

Git常用命令

Words count 16k Reading time 15 mins. Read count 0

Git常用命令

本地仓库

本地仓库位于自己的电脑里,我们首先在本地编写好代码,然后提交到本地的仓库,但是这些代码仅仅只是在本地,还没推送到服务器上。一开始对于本地仓库的操作也仅仅只是影响本地,只有推送了才应用到服务器仓库。因此在推送到远端之前,可以很大胆地进行各种操作而不用担心会对远程仓库造成什么影响。

初始化仓库(Init Repository)

为一个项目初始化为git仓库。

git init

克隆仓库(Clone Repository)

把远端的一个仓库下载到本地。

git clone [url]

暂存新文件(Stage New File) & 暂存文件修改(Sage Modified File)

把新建的文件或者文件的新修改放到暂存区。

git add [file]

取消刚刚新暂存的文件(Unstage New File)

对于未追踪的文件,可以使用一下命令来取消文件暂存:

git rm --cached <file>

取消刚刚暂存的文件修改(Unstage Modified File)

对于已经在追踪(之前通过git add添加过)的文件,要想取消刚刚暂存的文件修改,可以使用以下命令:

git reset HEAD <file>

查看仓库状态(Check Repository Status)

git status

查看状态简览

git status -s 或者 git status --short

查看未暂存的修改(Check Unstaged Modified File)

git diff

此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。

查看已暂存的修改(Check Staged Modified File)

git diff --cached

或者

git diff --staged // Git 1.6.1 及更高版本

提交更新(Commit File)

在提交之前先要执行git add 操作把文件放到暂存区。

git commit

这种方式会启动文本编辑器以便输入本次提交的说明。也可以在git commit后面带上-m参数使得提交信息与命令放在同一行

git commit -m ""

如果想跳过暂存区直接提交更新:

git commit -a -m ""

-a 参数会自动执行git add 步骤,把**所有已经跟踪过的文件暂存起来 **。

移除文件

要把文件不纳入仓库中的版本管理中,首先要从已追踪文件列表中移除,然后再提交。

git rm <file>

执行后会发现本地的文件被删除了,并且把修改放到了暂存区,因此只要把暂存区里的更改提交就完成移除文件的操作。

当要移除被本地修改过的文件,应该使用:

// 从暂存区里不追踪文件,但是本地保留文件
git rm --cache <file>

或者:

// 从暂存区里不追踪文件并在本地删除文件
git rm -f <file>

移动文件(删除文件)

要在 Git 中对文件改名,可以这么做:

git mv [old fileName] [new fileName]

执行后如图所示:

51AE82F6-D51D-43CC-9C1D-919CCEA100E7.png
upload successful
可以看到Git变更出现了一个R的操作,代表着rename。

git mv [old fileName] [new fileName]可以分解成以下三个命令:

mv [old fileName] [new fileName]
git rm [old fileName]
git add [new fileName]

上面三行命令同样可以完成文件的重命名操作。

注意:在window系统中进行重命名要主要大小写问题,一般来说在window下git对文件大小写不敏感,需要在git全局设置git config core.ignorecase false才能检测得到。

Git 并不显式跟踪文件移动操作,因为Git是根据文件内容来推断文件是否有更改的,所以如果在 Git 中重命名了某个文件,仓库中存储的元数据 并不会体现出这是一次改名操作。

查看提交历史

使用git log命令查看项目仓库的提交历史,默认不用任何参数的话,git log会按提交时间列出所有的更新,最近的更新排在最上面 。

git log

git log常用的参数有:

  • -p:显示每次提交的内容差异。

  • -:仅显示最近n次提交 。

  • –stat:查每次提交的简略的统计信息 。

  • –pretty:指定使用不同于默认格式的方式展示提交历史 。

  • –pretty=oneline: 将每个提交放在一行显示 。

  • –pretty=short :显示提交的简要信息。

  • –pretty=full:显示完全的信息。

  • –pretty=fuller:显示全部的信息。

  • –pretty=format :可以定制要显示的记录格式(这样的输出对后期提取分析格外有用 )。

    对于git log --pretty=format常用的格式占位符以及其代表的含义如下表:

选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮箱地址
%ad 作者修订日期(可以用 --date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
> *作者* 和 *提交者* 之间究竟有何差别?其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。 
  • –graph: 添加一些ASCII字符串来形象地展示你的分支、合并历史。

撤销操作

如果在刚刚提交完后马上发现还有东西需要修改,或者漏掉文件需要提交,或者提交信息写错了,可以使用以下命令覆盖上一次的提交:

git commit --amend
// git commit -m 'do some thing'
// git add README.md
// git commit --amend

这个命令会将暂存区中的文件提交,并启动一个文本编辑器,在里面可以看到之前提交的信息,你可以在文本编辑器里修改。编辑后保存会覆盖原来的提交信息。

取消暂存的文件

当你误将一个未完成的文件添加到缓存区是,可以使用下面命令来撤销暂存:

git reset HEAD <file> ...
// git reset HEAD READMD.md

使用该命令后,目标文件将会退回修改未暂存的状态。

撤销文件的修改(还原文件)

如果你在编写代码的过程中,突然需要丢弃刚刚所做的更改(比如说产品说这个功能不用做了),那么可以使用下面命令来还原文件:

git checkout -- <file>
// git checkout -- README.md

上面的命令只能对还没放到暂存区里的文件进行还原,如果文件在暂存区,则需要先执行 取消暂存文件 的命令。

撤销的修改不能恢复,如需要恢复建议使用分支

远程仓库

远程仓库位于服务器上,是保存我们代码和与其他协作组同步代码的地方。

查看远程仓库

git remote

它会列出你指定的每一个远程服务器 的简写。如果你已经克隆了自己的仓库,那么至少应该能看到 origin - 这是 Git 给你克隆的仓库服务器的默认名字。

添加参数-v可以显示简写及对于的URL。

Git不想传统的CSV,它是分布式的,这也说明了一个仓库可以对应多个远程仓库进行同步。这在某些项目环境下会有应用。

如果想查看某个远程仓库的详细信息,可以使用下面命令:

git remote show [remote-name]
// git remote show master

修改Git 仓库地址

git remote set-url origin [NEW_URL]

重命名远程仓库

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

git remote rename [old-branch-name] [new-branch-name]
// git remote rename pb paul

移除远程仓库

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

git remote rm [branch-name]

添加远程仓库地址

git remote add origin git@github.com:<username>/<projectName>.git
// username是你在github里注册的用户名,projectName则是你远程仓库的项目名称
git push -u origin master

从远程仓库中抓取与拉取

git fetch [remote-name]
// git fetch origin

这个命令会访问远程仓库,从中拉取你还没有的数据(拉取本地还没有的所有分支代码),你也可以指定一个分支名来拉取指定分支代码。

git fetch [remote-name] [branch-name]
// git fetch origin master

但是不管怎么样,这个操作不会把拉取下来的代码自动合并到当前的工作区,而要你手动将其合并到你想要的分支。

如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写 。这是可以使用git pull命令来抓取远程分支的代码并自动合并到当前分支 。

推送到远程仓库

想把本地的提交推送到远程仓库,可以使用下面命令:

git push [remote-name] [branch-name]
// git push origin master

标签

Git 可以给历史中的某一个提交打上标签,以示重要。比较有代表性的是人 们会使用这个功能来标记发布结点(v1.0 等等) 。

列出标签

使用下面的命令列出所有标签:

git tag

这个命令以字母顺序列出标签,但是它们出现的顺序并不重要。

可以使用-l参数来查找特定的标签 ,例如像看1.8.5系列的标签,可以执行:

git tag -l 'v1.8.5*'

创建标签

Git有两种类型的标签:

  • 轻量标签(lightweight)
  • 附注标签(annotated)

轻量标签就像一个不会改变的分支(它只是一个特定提交的引用)。

附注标签则是存储在Git数据库的一个完整对象,他们是可以被校验的,其中包括打标签者的名字、电子邮件地址、日期时间。并且可以使用GNU Privacy Guard(GPG)签名与验证。

通常建议创建附注标签,这样可以拥有以上所有信息。但如果只是一个临时的标签,或者因为某些原因不想保留那些信息,则可以使用轻量标签。

创建轻量标签

使用git tag即可为commit创建一个标签:

git tag [tag-name]

创建附注标签

在git tag后面添加-a 指定标签名称,-m 指定附加的信息:

git tag -a [tag-name] -m [message]
// git tag -a v1.4 -m 'annotated tag message'

对提交打标签

对于以往的一次提交打标签,可以在最末尾指定提交的commit id:

// 对以往的提交添加轻量标签
git tag [tag-name] [commit-id]
// 对以往的提交添加附注标签
git tag -a [tag-name] -m [tag-message] [commit-id]
// git tag v1.2 9fcea32
// git tag -a v1.2 -m 'message' 9fcea32

推送标签

默认情况下,git push命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式地推送标签到共享服务器上。

git push origin [tagname]
// git push origin v1.3

如果想要一次性推送很多标签,也可以使用带有–tags选项的git push命令。这将会把所有不在远程仓库服务器上的标签全部传送到那里。

git push origin --tags

检出标签

在 Git 中你并不能真的检出一个标签,因为它们并不能像分支一样来回移动。如果你想要工作目录与仓库中特定的标签版本完全一样,可以使用git checkout -b [branchname] [tagname]在特定的标签上创建一个新分支:

git checkout -b [branchname] [tagname]
// git checkout -b devCopy v1.3

**如果在这之后又进行了一次提交,devCopy 分支会因为改动向前移动了,那么 devCopy 分支就会和 v1.3 标签稍微有些不同,这时就应该当心了。 **

Git 别名

Git 并不会在你输入部分命令时自动推断出你想要的命令。如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。

git config --global alias.[name] [command]
// 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 commit时,只需要输入 git ci即可。

添加一个取消暂存文件的快捷别名:

git config --global alias.unstage 'reset HEAD --' 
// git unstage fileA 等于 git reset HEAD -- fileA

添加一个 last 别名 快速查看最后一次提交:

git config --global alias.last 'log -1 HEAD'
// git last 等于 git log -1 HEAD
0%