文章目录
写在前面,本文将介绍几个常用的Git命令( git命令文档)。如有不对之处,欢迎大家指正。
一、git checkout
切换分支或恢复工作树文件
git checkout [-q] [-f] [-m] [<branch>]
git checkout [-q] [-f] [-m] --detach [<branch>]
git checkout [-q] [-f] [-m] [--detach] <commit>
git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…
git checkout [<tree-ish>] [--] <pathspec>…
git checkout (-p|--patch) [<tree-ish>] [--] [<paths>…]
1.1 操作文件
** git checkout – <文件名 >**
此命令意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是file 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
1.2 操作分支
git checkout <分支名>
将分支切换到指定分支
git checkout -b <分支名>
如果分支存在则只切换分支,若不存在则创建并切换到新建分支
二、HEAD
HEAD 是一个对当前检出记录的符号引用,HEAD 总是指向当前分支上最近一次提交记录。
分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示:
此时的HEAD指向的是master,我们执行一下git checkout c1,得到下面的结果
发现HEAD指向了C1,这就是我们说的分离的HEAD
三、相对引用(^) 和(~num)
- 使用 ^ 向上移动 1 个提交记录
- 使用 ~ 向上移动多个提交记录,如 ~3
我们来看一下示例
此时的HEAD在master这个分支上,执行git checkout master^或者git checkout HEAD^
HEAD指向了C1这个节点了。如果使用git checkout master~2或者git checkout HEAD~2,HEAD就指向C0了。
四、git add
将文件内容添加到索引(将修改添加到暂存区)。也就是将要提交的文件的信息添加到索引库中。
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] [--renormalize]
[--chmod=(+|-)x] [--] [<pathspec>…]
4.1 git add
filename可以是文件也可以是目录
4.2 git add .
提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件。
4.3 git add -u
提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)。(git add --update的缩写)
4.4 git add -A
新增的、修改的、删除的文件均会被提交至暂存区(git add --all的缩写)
注意:在git 2.x.x版本后 git add .和git add -A作用一样了
五、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 commit 主要是将暂存区里的改动给提交到本地的版本库。每次使用git commit 命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id,
commit-id在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset的组合命令回到这里.
5.1 git commit -m "message"
提交已经被add进来的改动.
这种是比较常见的用法,-m 参数表示可以直接输入后面的“message”,注意是双引号,如果不加 -m参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message,
message即是用来说明这次提交的描述。
commit message格式::
注意冒号后面有空格。
type:用于说明commit的类别,只允许使用下面7个标识
- feat:新功能(feature)
- fix:修复bug
- docs:文档(documentation)
- style:格式(不影响代码运行的变动)
- refactor:重构(既不是新增功能也不是修改bug的代码变动)
- test:增加测试
- chore:构建过程或辅助工具的变动
subject:commit目的的简短描述
5.2 git commit --amend
git commit --amend //也叫追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中;
回退命令:
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前
$ git reset --hard commit_id 退到/进到 指定commit的sha码
强推到远程:
$ git push origin HEAD --force
六、git reset
git reset [-q] [<tree-ish>] [--] <paths>…
git reset (--patch | -p) [<tree-ish>] [--] [<paths>…]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
1.git reset HEAD
把暂存区的修改撤销掉,重新放回工作区:
版本退回主要有以下三种情况
2.git reset --soft
commit-id为错误commit之前的,commit-ID
错误commit后,仅撤销commit;暂存区、工作区内容不变。
3.git reset --mixed
错误commit后。仅撤销commit和add;工作区内容不变
4.git reset --hard
错误commit之后,想要恢复到某个版本库的代码(暂存区,工作区均变化)
解释一下此处提到的工作区、暂存区、版本库
工作区(Working Directory):简单来说就是你本地的代码目录文件
暂存区:git add 到的地方
版本库(Repository):git commit 到的地方,也就是我们远端代码仓库
七、git rm
从版本库中删除文件,那就用命令git rm 删掉,并且git commit
git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…
八、git branch
git branch [--color[=<when>] | --no-color] [-r | -a]
[--list] [-v [--abbrev=<length> | --no-abbrev]]
[--column[=<options>] | --no-column] [--sort=<key>]
[(--merged | --no-merged) [<commit>]]
[--contains [<commit]] [--no-contains [<commit>]]
[--points-at <object>] [--format=<format>] [<pattern>…]
git branch [--track | --no-track] [-f] <branchname> [<start-point>]
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
git branch --unset-upstream [<branchname>]
git branch (-m | -M) [<oldbranch>] <newbranch>
git branch (-c | -C) [<oldbranch>] <newbranch>
git branch (-d | -D) [-r] <branchname>…
git branch --edit-description [<branchname>]
一般用于分支的操作,比如创建分支,查看分支等等
8.1 git branch
不带参数:列出本地已存在的分支,并且在当前分支的前面用“*”标记
8.2 git branch -r
查看远程版本库分支列表
8.3 git branch -a
查看所有分支列表,包括本地和远程
8.4 git branch <分支名>
创建新分支但仍停留在当前分支上
8.5 git branch -d <分支名>
删除dev分支,如果在分支中有一些未merge的提交,那么会删除分支失败,此时可以使用 git branch -D dev:强制删除dev分支
8.6 git branch -vv
可以查看本地分支对应的远程分支
8.7 git branch -m oldName newName
给分支重命名
九、git merge
git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
[-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
[--[no-]allow-unrelated-histories]
[--[no-]rerere-autoupdate] [-m <msg>] [-F <file>] [<commit>…]
git merge --abort
git merge --continue
在git-merge命令中,有以下参数:
git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]] [--[no-]rerere-autoupdate] [-m <msg>] [<commit>...]
1.git merge <分支名>
将指定分支合并到当前分支中。
2.git merge --abort
该命令仅仅在合并后导致冲突时才使用。git merge --abort将会抛弃合并过程并且尝试重建合并前的状态。但是,当合并开始时如果存在未commit的文件,git merge --abort在某些情况下将无法重现合并前的状态。(特别是这些未commit的文件在合并的过程中将会被修改时)
3.git merge --ff <分支名> 和git merge --no-ff <分支名>
–ff是指fast-forward命令。当使用fast-forward模式进行合并时,将不会创造一个新的commit节点。默认情况下,git-merge采用fast-forward模式。
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并。
4.git merge --commit <分支名> 和git merge --no-commit <分支名>
–commit参数使得合并后产生一个合并结果的commit节点。该参数可以覆盖–no-commit。
–no-commit参数使得合并后,为了防止合并失败并不自动提交,能够给使用者一个机会在提交前审视和修改合并结果。
以上是比较常用的参数,其他参数的用法可以参照这位Chuckiefan作者的git-merge完全解析
十、git rebase
Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。Rebase 的优势就是可以创造更线性的提交历史,代码库的提交历史将会变得异常清晰。
git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
[<upstream> [<branch>]]
git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
--root [<branch>]
git rebase --continue | --skip | --abort | --quit | --edit-todo | --show-current-patch
我们来看一个示例
准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支),把 bugFix 分支里的工作直接移到 master 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。使用git rebase master得到下面的结果
现在我们切换到master分支上,执行git rebase bugFix看看
好了!由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。
交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i
如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。
十一、git tag
git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] [-e] <tagname> [<commit> | <object>]
git tag -d <tagname>…
git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]
[--points-at <object>] [--column[=<options>] | --no-column]
[--create-reflog] [--sort=<key>] [--format=<format>]
[--[no-]merged [<commit>]] [<pattern>…]
git tag -v [--format=<format>] <tagname>…
打标签其实就是给特定的commit做个标记,类似于里程碑的东西。在版本管理中,我们可以为每个版本打个标签,或者在每次发版时打个标签,便于后期的查找。
1.git tag
展示所有标签,注意:标签不是按时间顺序列出,而是按字母排序的。
2.git tag
创建一个新标签,默认标签是打在最新提交的commit上的。
3.git tag
给指定commit打标签
4.git tag -a -m
给指定commit创建带有说明的标签,用-a指定标签名,-m指定说明文字
5.git tag -d
删除指定标签,因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
6.git push origin
推送某个标签到远程
7.git push origin --tags
一次性推送全部尚未推送到远程的本地标签
8.git push origin :refs/tags/
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除git tag -d ,再执行此命令删除远程tag
注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
十二、git revert
前面我们提到了reset来实现版本回退,现在来看看另一种版本回退的方式git revert。
git revert的语法如下:
#指定某次commit
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>…
#可用于在选择或还原失败后解决冲突后继续
git revert --continue
#忘记当前正在进行的操作,可用于在选择或还原失败后清除排序器状态
git revert --quit
#取消操作并返回到预序列状态
git revert --abort
git revert的作用通过创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
十三、git cherry-pick
git cherry-pick用于把另一个本地分支的一个或多个commit修改应用到当前分支。
git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
[-S[<keyid>]] <commit>…
git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort
1、git cherry-pick
单独合并一个提交
2、git cherry-pick -x
同上,不同点:保留原提交者信息。
3、 git cherry-pick … 和 git cherry-pick ^…
前者表示把到之间(左开右闭,不包含start-commit-id)的提交cherry-pick到当前分支;
后者表示把到之间(闭区间,包含start-commit-id)的提交cherry-pick到当前分支。
其中,到只需要commit-id的前6位即可,并且在时间上必须早于
注:以上合并,需要手动push代码。
十四、git fetch
git fetch [<options>] [<repository> [<refspec>…]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]
git fetch --all [<options>]
git fetch 将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态
来看下面这个例子:我们有一个远程仓库, 它有两个我们本地仓库中没有的提交。
执行git fetch后C2,C3 被下载到了本地仓库,同时远程分支 o/master 也被更新
git fetch 完成了仅有的但是很重要的两步:
- 从远程仓库下载本地仓库中缺失的提交记录
- 更新远程分支指针(如 o/master)
远程分支反映了远程仓库在你最后一次与它通信时的状态,git fetch 就是你与远程仓库通信的方式了
git fetch 并不会改变你本地仓库的状态。它不会更新你的 master 分支,也不会修改你磁盘上的文件。
fetch更新本地仓库两种方式:
//方法一
$ git fetch origin master //从远程的origin仓库的master分支下载代码到本地的origin master
$ git merge origin/master //把远程下载下来的代码合并到本地仓库,远程的和本地的合并
//方法二
$ git fetch origin master:temp //从远程的origin仓库的master分支下载到本地并新建一个分支temp
$ git diff temp //比较master分支和temp分支的不同
$ git merge temp//合并temp分支到master分支
$ git branch -d temp//删除temp
十五、git pull
git pull [<options>] [<repository> [<refspec>…]]
将远程仓库代码更新至本地仓库,也就是先抓取更新再合并到本地分支
来看下面这个示例:
我们用git fetch; git merge o/master这两个命令看看
用 fetch 下载了 C3, 然后通过 git merge o/master 合并了这一提交记录。现在我们的 master 分支包含了远程仓库中的更新(在本例中远程仓库名为 origin)
我们再用git pull试试,得到了同样的结果
git pull 就是 git fetch 和 git merge 的缩写!
十六、git push
git push 负责将你的变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录。
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] [-o <string> | --push-option=<string>]
[--[no-]signed|--signed=(true|false|if-asked)]
[--force-with-lease[=<refname>[:<expect>]]]
[--no-verify] [<repository> [<refspec>…]]
示例如下:
使用git push命令得到下面的结果
远程仓库接收了 C2,远程仓库中的 master 分支也被更新到指向 C2 了,我们的远程分支 (o/master) 也同样被更新了。
1、git push origin master
将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
2、git push origin :master
等同于git push origin --delete master,表示删除origin主机的master分支。如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
3、git push origin
表示将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略。
4、git push --all origin
表示将所有本地分支都推送到origin主机。
以后遇到git方面的其他内容再进行补充。。。