git部分命令
初次运行 Git 前的配置
配置全局的用户名和邮箱,mac下可通过终端输入命令cat ~/.gitconfig
查看配置信息。
git config --global user.name "mouos"
git config --global user.email swiftprimer@gmail.com
如果用了 --global
选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global
选项重新配置即可,新的设定保存在当前项目的 .git/config
文件里。
-
查看git所有配置信息:
git config --list
-
查看配置的用户名:
git config user.name
-
定义命令别名:
git config --global alias.st status
:则git status
可用git st
代替
取得项目的 Git 仓库
初始化新仓库
要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行:
git init
从现有仓库克隆
git clone https://github.com/mouos/repository.git
如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字
git clone https://github.com/mouos/repository.git gitRepository
记录每次更新到仓库
检查当前文件状态
红色表示工作目录的文件被修改但还没有提交到暂存区,绿色表示已经提交到暂存区。
git status
以极简的方式显示文件状态:git status -s
- A:本地新增的文件(服务器上没有)
- C:文件的一个新拷贝
- D:本地删除的文件(服务器上还在)
- M:红色为修改过未被添加进暂存区的,绿色为已经添加进暂存区的
- R:文件名被修改
- T:文件的类型被修改
- U:文件没有被合并(你需要完成合并才能进行提交)
- X:未知状态(很可能是遇到git的bug了,你可以向git提交bug report)
- ?:未被git进行管理,可以使用
git add fileName
把文件添加进来进行管理
跟踪新文件
将文件从工作目录添加至暂存区,git add [file1] [file2] ...
git add README
-
把所有修改的信息添加到暂存区:
git add .
-
把所有跟踪文件中被修改过或已删除的文件信息添加至暂存区:
git add -u
或git add --update
,它不会处理那些没有被跟踪的文件 -
把所有跟踪文件中被修改过或已删除文件和所有未跟踪的文件信息添加到暂存区:
git add -A
或git add --all
-
git add .
只会提交当前目录或者子目录下相应文件。 -
git add -A
无论在哪个目录执行都会提交相应文件。
查看已暂存和未暂存的更新
要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff
:此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
git diff
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用 git diff --cached
命令。
git diff --cached
提交更新
git commit
-m 参数后跟提交说明的方式
git commit -m "message"
提交暂存区的指定文件到仓库区:git commit [file1] [file2] ... -m [message]
跳过使用暂存区域
Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit
加上 -a
选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add
git commit -a -m "a message"
该命令相当于以下两条命令:
git add .
:把所有修改的信息添加到暂存区
git add -m "message"
:将暂存区的修改提交到本地仓库
查看提交历史
默认不用任何参数的话,git log
会按提交时间列出所有的更新,最近的更新排在最上面。每次更新都有一个 SHA-1 校验和、作者的名字和电子邮件地址、提交时间,最后缩进一个段落显示提交说明。
git log
-p
选项展开显示每次提交的内容差异,用 -2
则仅显示最近的两次更新:
git log -p -2
format
可以定制要显示的记录格式
git log --pretty=format:"%h - %an, %ar : %s"
选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
- 显示commit历史,以及每次commit发生变更的文件:
git log --stat
- 搜索提交历史,根据关键词:
git log -S [keyword]
- 显示过去5次提交:
git log -5 --pretty --oneline
- 显示所有提交过的用户,按提交次数排序:
git shortlog -sn
- 显示指定文件是什么人在什么时间修改过:
git blame [file]
- 显示暂存区和工作区的差异:
git diff
撤消操作
修改最后一次提交
使用一次新的commit,替代上一次提交,如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend
重做上一次commit,并包括指定文件的新变化:git commit --amend [file1] [file2] ...
取消已经暂存的文件
已经被提交到暂存区的文件,可以通过命令git reset HEAD -- fileName
撤销提交。
git reset HEAD README
- 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变:
git reset [file]
- 重置暂存区与工作区,与上一次commit保持一致:
git reset --hard
- 暂时将未提交的变化移除,稍后再移入:
git stash
->git stash pop
取消对文件的修改
已经被修改但还没提交到暂存区的文件,可以通过命令git checkout -- fileName
撤销更改。
git checkout -- README
远程仓库的使用
查看当前的远程库
查看当前配置有哪些远程仓库,可以用 git remote
命令,它会列出每个远程库的简短名字。
git remote
也可以加上 -v
选项(译注:此为 --verbose
的简写,取首字母),显示对应的克隆地址,显示所有远程仓库
git remote -v
添加远程仓库
要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname] [url]
:
git remote add sp https://github.com/mouos/repository.git
现在可以用字符串 pb
指代对应的仓库地址了。比如说,要抓取所有 Paul 有的,但本地仓库没有的信息,可以运行 git fetch pb
下载远程仓库的所有变动
git fetch sp
现在,Paul 的主干分支(master)已经完全可以在本地访问了,对应的名字是 pb/master
,你可以将它合并到自己的某个分支,或者切换到这个分支,看看有些什么有趣的更新。
从远程仓库抓取数据
git fetch [remote-name]
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。
获取远程主机上master分支的代码:git fetch origin
在本地新建gwl
分支,并将远程主机上master分支代码下载到本地gwl
分支:git fetch origin master:gwl
通过git fetch
所取回的更新,在本地主机上需要用“远程主机名/分支名”的形式读取,比如origin主机的master分支,就需要用origin/master
来读取。所以,git fetch origin
会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
如果设置了某个分支用于跟踪某个远端仓库的分支(参见下节及第三章的内容),可以使用 git pull
命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下 git clone
命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行 git pull
,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
git pull
命令的作用是获取远程主机某个分支的更新,再与本地指定分支合并。git pull <远程主机名><远程分支名>:<本地分支名>
取回远程主机上的gwl
分支与本地的master
分支合并:
git pull origin gwl:master
取回远程仓库的变化,并与本地分支合并。取回远程主机上的gwl
分支与当前分支合并:
git pull origin gwl
该命令相当于以下两条命令:
-
git fetch origin
:获取远程主机上所有分支的更新,也可以用git fetch origin gwl
表示获取远程主机上dev分支的更新 -
git merge origin/dev
:当前分支合并gwl
分支
推送数据到远程仓库
上传本地指定分支到远程仓库:git push [remote-name] [branch-name]
。如果要把本地的 master 分支推送到 origin
服务器上(克隆操作会自动使用默认的 master 和 origin 名字),可以运行下面的命令:
git push origin master
- 强行推送当前分支到远程仓库,即使有冲突:
git push [remote] --force
- 推送所有分支到远程仓库:
git push [remote] --all
查看远程仓库信息
git remote show [remote-name]
查看某个远程仓库的详细信息,比如要看所克隆的 origin
仓库,可以运行:
git remote show origin
远程仓库的删除和重命名
git remote rename
命令修改某个远程仓库在本地的简称,比如想把 sp
改成 sp
,可以这么运行:
git remote rename sp ps
移除对应的远端仓库
git remote rm ps
删除远程gwl
分支:
git push origin --delete gwl
打标签
列显已有的标签
git tag
显示的标签按字母顺序排列,所以标签的先后并不表示重要程度的轻重。
我们可以用特定的搜索模式列出符合条件的标签。在 Git 自身项目仓库中,有着超过 240 个标签,如果你只对 1.4.2 系列的版本感兴趣,可以运行下面的命令:
git tag -l 'v1.4.2.*'
新建标签
含附注的标签
创建一个含附注类型的标签非常简单,用 -a
(译注:取 annotated
的首字母)指定标签名字即可:
git tag -a v1.4 -m 'my version 1.4'
而 -m
选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。
可以使用 git show
命令查看相应标签的版本信息,并连同显示打标签时的提交对象。
git show v1.4
分支
分支的新建与切换
新建并切换到该分支,运行 git checkout
并加上 -b
参数:
git checkout -b gwl
这相当于执行下面这两条命令:
git branch gwl
git checkout gwl
转换到 master
分支:
git checkout master
分支的合并
回到 master
分支并把gwl
合并进来。用 git merge
命令来进行合并:
git checkout master
git merge gwl
删除分支
git branch -d gwl
遇到冲突时的分支合并
git merge gwl
命令合并冲突时,使用 git status
命令查看状态,unmerged:
的文件即为冲突文件,解决完冲突后,再运行一次 git status
来确认所有冲突都已解决,modified:
的文件即为解决冲突的文件。确认所有冲突都已解决,也就是进入了暂存区,就可以用 git commit
来完成这次合并提交。
分支的管理
git branch
命令不仅仅能创建和删除分支,如果不加任何参数,它会显示当前所有分支的列表,列表中带 *
的字符表示当前所在的分支。
新建一个分支,但依然停留在当前分支:git branch [branch-name]
git branch
若要查看各个分支最后一个提交对象的信息,运行 git branch -v
:
git branch -v
git branch --merge
查看哪些分支已被并入当前分支
git branch --merged
git branch --no-merged
查看尚未合并的工作
git branch --no-merged
它会显示还未合并进来的分支。由于这些分支中还包含着尚未合并进来的工作成果,所以简单地用 git branch -d
删除该分支会提示错误,因为那样做会丢失数据。不过,如果你确实想要删除该分支上的改动,可以用大写的删除选项 -D
强制执行,就像上面提示信息中给出的那样。
查看本地分支:git branch
查看本地和远程分支:git branch -a
将gwl
分支名字改为sp
:git branch -m gwl sp
。针对本地仓库操作,不影响远程仓库。
列出所有远程分支:git branch -r
推送本地分支
如果你有个叫 gwl
的分支需要和他人一起开发,可以运行 git push (远程仓库名) (分支名)
:
git push origin gwl