Git 基本操作
GIT CLONE 命令
将存储库克隆到新创建的目录中,为克隆的存储库中的每个分支创建远程跟踪分支,并从克隆的存储库作为当前活动分支的初始分支。
命令格式:
git clone [--template=<template_directory>] [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror] [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>] [--dissociate] [--separate-git-dir <git dir>] [--depth <depth>] [--[no-]single-branch] [--recurse-submodules] [--[no-]shallow-submodules] [--jobs <n>] [--] <repository> [<directory>]
命令示例:
克隆指定的存储库:
$git clone https://github.com/jquery/jquery.git
克隆指定的存储库的分支并存储到本地 jquery-2.2 的目录中:
$git clone -b 2.2-stable https://github.com/jquery/jquery.git jquery-2.2
此默认配置通过在refs/remotes/origin下创建对远程分支头的引用,并通过初始化 remote.origin.url 和remote.origin.fetch 配置变量来实现
GIT ADD 命令
此命令将要提交的文件的信息添加到索引库中(将修改添加到暂存区),以准备为下一次提交分段的内容。 它通常将现有路径的当前内容作为一个整体添加,但是通过一些选项,它也可以用于添加内容,只对所应用的工作树文件进行一些更改,或删除工作树中不存在的路径了,默认情况下,git add命令不会添加忽略的文件。 如果在命令行上显式指定了任何忽略的文件,git add命令都将失败,并显示一个忽略的文件列表。由 Git 执行的目录递归或文件名遍历所导致的忽略文件将被默认忽略。 git add命令可以用-f(force)选项添加被忽略的文件。
命令格式:
git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…]
命令示例:
添加 src/mian/java 目录及其子目录下所有 *.java 文件的内容:
$ git add src/mian/java *.java
将所有修改添加到暂存区:
$ git add .
Ant 风格将所有修改添加到暂存区:
$ git add *
将以Controller结尾的文件的所有修改添加到暂存区
$ git add *Controller
常用选项:
git add -u [<path>]: 把<path>中所有跟踪文件中被修改过或已删除文件的信息添加到索引库。它不会处理那些不被跟踪的文件。省略<path>表示 . ,即当前目录。
git add -A [<path>] : 从所有跟踪和未跟踪的文件中添加更改添加到索引库。省略<path>表示 . ,即当前目录。
git add -i [<path>]:命令以交互模式查看被所有修改过或已删除文件但没有提交的文件,并通过其 revert 子命令可以查看<path>中所有未跟踪的文件
GIT RM 命令
命令用于从工作区和索引中删除文件。从索引中删除文件,或从工作树和索引中删除文件。
命令格式:
git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…
命令示例:
删除 text1.txt文件,并把它从git的仓库管理系统中移除:
$ git rm text1.txt
删除文件夹:mydir,并把它从git的仓库管理系统中移除:
$ git rm -r mydir
从索引库删除 10.txt 文件,这个不会对文件本身进行删除操作:
$git rm --cached 10.txt
从索引库删除 以 .iml 结尾的文件:
git rm --cached *.iml
GIT MV 命令
命令用于移动或重命名文件,目录或符号链接。
命令格式:
git mv [-v] [-f] [-n] [-k] <source> <destination>
git mv [-v] [-f] [-n] [-k] <source> ... <destination directory>
在第一种形式中,它将重命名 <source>为<destination>,<source>必须存在,并且是文件,符号链接或目录。 在第二种形式中,<destination directory> 参数必须是现有的目录,给定的源(<source>)将被移动到这个目录中,索引在成功完成后更新,但仍必须提交更改。
命令示例:
把一个文件 text.txt 移动到 mydir:
$ git mv text.txt mydir
把一个文件 text.txt 修改名称为 text.java :
$git mv text.txt text.java
GIT COMMIT 命令
命令用于将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中。要添加的内容可以通过以下几种方式指定:
- 在使用 git commit 命令之前,通过使用git add对索引进行递增的"添加"更改(注意:修改后的文件的状态必须为"added")
- 通过使用 git rm 从工作树和索引中删除文件,再次使用 git commit 命令;
- 通过将文件作为参数列出到 git commit命令(不使用--interactive或--patch选项),在这种情况下,提交将忽略索引中分段的更改,而是记录列出的文件的当前内容(必须已知到Git的内容) ;
- 通过使用带有-a 选项的git commit命令来自动从所有已知文件(即所有已经在索引中列出的文件)中添加"更改",并自动从已从工作树中删除索引中的"rm"文件 ,然后执行实际提交;
- 通过使用--interactive 或 --patch 选项与 git commit 命令一起确定除了索引中的内容之外哪些文件或应该提交的一部分,然后才能完成操作
命令格式:
git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
[--dry-run] [(-c | -C | --fixup | --squash) <commit>]
[-F <file> | -m <msg>] [--reset-author] [--allow-empty]
[--allow-empty-message] [--no-verify] [-e] [--author=<author>]
[--date=<date>] [--cleanup=<mode>] [--[no-]status]
[-i | -o] [-S[<keyid>]] [--] [<file>…]
命令示例:
使用 git add 命令增加文件到索引库,然后提交到存储库,使用 -m 参数可以增加提交的描述信息:
$ git add .
$ git add newfile.txt
$ git commit -m "the commit message"
会先把所有已经追踪的文件的改动 git add 进来,然后提交,对于没有追踪的文件,还是需要执行 git add 命令:
$ git commit -a
在更改许多文件之后,可以通过给出 git commit 的路径名来更改记录更改的顺序。当给定路径名时,该命令提交只记录对命名路径所做的更改:
$ edit hello.c hello.h # 修改了这两个文件的内容
$ git add hello.c hello.h
$ edit Makefile
$ git commit Makefile
注意:
如果您提交,然后立即发现错误,可以使用 GIT RESET 命令恢复;该命令不是提交到 Git 仓库,只是提交到本地的存储库,如果需要提交到 Git 仓库,还需要执行 GIT PUSH 命令;
GIT FETCH 命令
命令用于从另一个存储库下载对象和引用。从一个或多个其他存储库中获取分支或标签。
理解 fetch 的关键, 是理解 FETCH_HEAD,FETCH_HEAD 指的是某个分支在服务器上的最新状态。这个列表保存在 .git/FETCH_HEAD 文件中, 其中每一行对应于远程服务器的一个分支。当前分支指向的 FETCH_HEAD, 就是这个文件第一行对应的那个分支。一般来说, 存在两种情况:
- 如果没有显式的指定远程分支,则远程分支的 master 将作为默认的 FETCH_HEAD
- 如果指定了远程分支,就将这个远程分支作为FETCH_HEAD
命令格式:
git fetch [<options>] [<repository> [<refspec>…]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]
git fetch --all [<options>]
命令示例:
远程的 origin 仓库的 master 分支下载代码到本地的 origin\master,比较本地的仓库和远程仓库的区别,最后合并到本地仓库:
$ git fetch origin master
$ git log -p master.. origin/master
$ git merge origin/master
从远程的 origin 仓库的 master 分支下载到本地并新建一个分支 temp,比较 master 分支和 temp 分支的不同,最后移除 temp 分支:
$ git fetch origin master:temp
$ git diff temp
$ git branch -d temp
GIT PULL 命令
命令用于从另一个存储库或本地分支获取并合并。将远程存储库中的更改合并到当前分支中。在默认模式下,git pull是 git fetch后跟git merge FETCH_HEAD的缩写。更准确地说,git pull使用给定的参数运行 git fetch,并调用 git merge 将检索到的分支头合并到当前分支中。 使用--rebase,它运行git rebase而不是git merge
命令格式:
git pull [options] [<repository> [<refspec>…]]
命令示例:
从 origin仓库获取master 分支的最新版本并合并到本地:
$ git pull origin master
GIT PUSH 命令
命令用于将本地分支的更新,推送到远程主机。当命令行不指定使用 <repository> 参数推送的位置时,将查询当前分支的branch.*.remote配置以确定要在哪里推送。 如果配置丢失,则默认为 origin
命令格式:
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
[--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
[-u | --set-upstream] [--push-option=<string>]
[--[no-]signed|--sign=(true|false|if-asked)]
[--force-with-lease[=<refname>[:<expect>]]]
[--no-verify] [<repository> [<refspec>…]]
命令示例:
将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建:
$ git push origin master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支:
$ git push origin :dev
# 等同于
$ git push origin --delete dev
当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略:
$ git push origin
如果当前分支只有一个追踪分支,那么主机名都可以省略
$ git push