git config
git config --local -l
-l 代表--list
- 查看仓库配置【必须要进入到具体的目录下,比如要查看TestGit仓库的配置信息】
git config --global -l
- 查看用户配置
git config --system -l
- 查看系统配置
git config -l
- 查看所有的配置信息,依次是系统级别、用户级别、仓库级别
git config 配置名
- 查看指定配置
$ git config [--global | --local] user.name $ git config [--global | --local] user.email
- 查看指定配置
git config -e
- 编辑配置文件
git config --local -e
- 编辑仓库级别配置文件
git config --global -e
- 编辑用户级别配置文件
git config --system -e
- 编辑系统级别配置文件
git config 添加配置项目
- 全局配置
- 覆盖形式
# windows下本质修改的是C:\Users\Administrator\.gitconfig文件 $ git config --global user.email “you@example.com” $ git config --global user.name “Your Name”
- 替换形式
$ git config --global --replace-all user.email “you@example.com” $ git config --global --replace-all user.name “Your Name”
- 删除形式
$ git config --global --unset user.email “you@example.com” $ git config --global --unset user.name “Your Name”
- 覆盖形式
- 项目配置
git config --local user.email “you@example.com”
git config --local user.name “Your Name”
- 本质修改的是项目下的.git目录下config文件
- 全局配置
git clone <远程仓库地址>
- clone有三个作用
- (1) 完整的吧远程仓库下载到本地
- (2) 创建origin远程仓库地址别名
- (3) 初始化本地库
git init
- 初始化本地库,在当前目录下出现一个.git目录
git hash-object new.txt
- 为相应的文件产生一个长度为40的SHA-1哈希字符串
git update-index --add new.txt
- 将相应的文件放入暂存区(即index文件),并在.git/objects目录下生成一个以该SHA-1的前两个字符命名的子目录,然后在该子目录下,存储刚刚生成的一个新文件,新文件名称是SHA-1的剩下的38个字符。
git add new.txt
== git hash-object new.txt + git update-index --add new.txt
git ls-files --stage
- 查看index文件即暂存取内容
git status
-
git status
- 查看git状态
例如
-
git status -s
- 使用 -s 参数来获得简短的输出结果
例如
git commit -m "提交new.txt"
- 都是将暂存区的内容提交到本地库,生成一个commit对象,物理存储在HEAD文件中,逻辑上将该对象变成head所指的结点的后继结点。
git commit -am new.tex "提交new.tex"
== git add new.txt + git commit -m new.text “提交new.txt”
- 只对traced的文件有用,不能对新建Untracd的文件起作用。
git rm <file>
- 删除文件
git rm --cached new.txt
- 只从暂存区中删除 new.txt 文件
git rm new.txt
- 从暂存区和工作区中删除 new.txt 文件
git rm -f new.txt
- 如果删除之前
修改过并且已经放到暂存区域
的话,则必须要用强制
删除选项 -f。强行从暂存区和工作区中删除修改后的 new.txt 文件。
例如
- 如果删除之前
git checkout
-
git checkout new.txt
- 将暂存区的 new.txt 文件恢复到工作区
- 这个操作很危险,会清除工作区中未添加到暂存区的改动
例如
-
git checkout .
- 将暂存区的所有文件恢复到工作区
- 这个操作很危险,会清除工作区中未添加到暂存区的改动
-
git checkout HEAD new.txt
- 将本地库中的 new.txt 文件恢复到工作区和暂存区
- 这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
例如
-
git checkout HEAD .
- 将本地库中的所有文件恢复到工作区和暂存区
- 这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
git log
-
git log
==git log --all
- 显示历史提交记录
例如
-
git log --pretty=oneline
- 更优雅的显示提交日志记录
例如:
-
git log --oneline
- 以优雅的方式显示,commit对象哈希值部分只显示前7个字符
例如
-
git log --reverse --oneline
- 逆向显示所有提交日志
例如
-
git log --graph
==git log --all graph
- 查看历史中什么时候出现了分支、合并。开启了拓扑图选
例如
-
git log --oneline --graph
- 查看所有分支图形化的commit历史(oneline 一条提交信息用一行展示)
例如
-
git log --oneline --no-merges
- 隐藏合并提交
例如,该例中并没有合并
再例如,该例中有合并分支,但隐藏了合并提交
-
git log --author=zhangsan --oneline -3
- 想查找指定用户的提交日志
例如
-
如果你要指定日期,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after
例如,本文书写时间为2020-09-14:
-
git log --oneline --branches[=<pattern>]
- 可以显示master分支的日志
例如:若查找的是当前分支日志,不能加[=<pattern>],添加会出错,默认就是当前分支
-
git log --oneline branch1^branch2
,可以查看在分支1,却不在分支2中的提交。^表示排除这个分支(Window下可能要给^branch2加上引号). -
git log --oneline --decorate new.txt
- 查看 new.txt 的历史标签
例如
-
更多 git log 命令可查看:
http://git-scm.com/docs/git-log
git blame new.txt
- 查看 new.txt 文件的修改记录
例如
git tag
-
注意标签、标签注解、commit备注都不是一回事。标签本质是一个指向
commit/tree/blob对象
的指针,与git自动生成的对象的hash值的作用类似,更加符合人的使用习惯。 -
git tag
- 显示本地仓库所有标签
例如
-
git tag -a new.txt_fourth -m "第四次提交new.txt"
- 为head所指的commit对象打上标签
例如
-
git tag -a new.txt_second 1142124 -m "第二次提交new.txt"
- 如果忘了给某个提交打标签,又将它发布了,我们可以给它追加标签。
例如
-
git tag -s new.txt_third 225fccf -m "第三次提交new.txt"
- -s表示用私钥签名一个标签,也就是采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错。没有安装gpg,暂时不做测试。
例如
-
git tag -d new.txt_fourth
- 删除new.txt_fourth标签
例如
-
git tag -l
- 效果与git tag 相同
例如
-
git tag -l "new.*"
- 使用正则匹配查找,注意此处必须使用
双引号
例如
- 使用正则匹配查找,注意此处必须使用
-
git show new.txt_first
- 可以查看new.txt_first所指commit对象说明文字
例如
-
git show-ref --tag
或git show-ref --tags
- 查看远程仓库的所有标签
例如
-
git push origin v1.0
- 将本地某个特定标签推送到远程
-
git push --tag
或git push --tags
或git push origin --tags
或git push origin --tag
- 将本地标签一次性推送到远程
-
git push origin -d v1.0.0
或git push origin --delete v1.0.0
- 删除远程的某个标签
-
git checkout new.txt_first
- 切换到new.txt_first标签所指的commit对象。
例如
-
git checkout 12345678 -b newBranch
- 如: 当前分支的某个commit id = 12345678,我们可以基于这个id创建本地分支,可以理解为创造了一个副本。
-
更多有关git tag命令见
https://git-scm.com/docs/git-tag
git remote
git remote add origin [地址]
- 为远程仓库在本地建立别名origin,github提供了多种连接认证方式,认证方式不同,此处的
[地址]
不同,具体请看git使用三种不同的方式与github进行连接认证
- 为远程仓库在本地建立别名origin,github提供了多种连接认证方式,认证方式不同,此处的
git remote push origin master
- 将本地master分支push到origin代表的远程仓库。若报错,请看git使用三种不同的方式与github进行连接认证中的使用token连接认证部分,里边有提到解决方法。
git remote -v
- 显示所有远程仓库
例如
git remote show [remote]
- 显示某个远程仓库信息
例如
git remote rm origin
- 删除本地origin别名,并不能删除origin所代表的远程仓库。如果需要再次对远程仓库进行操作,需要重新创建别名。
git remote rename origin origin1
- 只是将origin重命名为origin1,对远程仓库无任何影响。过后对远程仓库的操作,需通过origin1来完成。
git reset
git reset HEAD
- 用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
例如
补充
git reset HEAD^
== gti reset HEAD- 所有内容的上一个版本 恢复到暂存区
git reset HEAD^ new.txt
- new.txt 文件的上一个版本恢复到暂存区
git reset 225fccf
- 暂存区回退到指定版本
git reset --soft HEAD~3
- 暂存区回退到上上上一个版本
git reset --hard HEAD
- –hard 参数撤销工作区中所有未提交的修改内容,将
暂存区与工作区都
回退到上一次版本,并删除之前的所有信息提交
。注意与git checkout HEAD .
的区别,在此处checkout只是将当前分支的commit对象在暂存区和工作区进行覆盖,但没有删除commit对象。git reset –hard HEAD~2
- 暂存区和工作区都回退到上上一个版本 ,
并
删除第四次提交的commit对象结点。
例如
- 暂存区和工作区都回退到上上一个版本 ,
git reset –hard 4cf0c91
- 暂存区和工作区都回退到4cf0c91版本 ,
并
删除该版本以后提交的所有commit对象结点。
- 暂存区和工作区都回退到4cf0c91版本 ,
git reset --hard origin/master
- 将本地仓库的状态恢复到和远程仓库的一样,本地的工作区和暂存区与该命令无关,不会受到影响。
例如
- –hard 参数撤销工作区中所有未提交的修改内容,将
补充
git fetch
git fetch origin
- 将某个远程仓库的更新全部取回本地
git fetch origin master
- 将远程仓库origin 的master 分支 更新取回本地
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin master:brantest
- 将远程仓库 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master
- 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。该命令表示,取回 origin/master 分支,再与本地的 brantest 分支合并。
git push
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin master:master
- 将本地的 master 分支推送到 origin 代表的远程仓库的 master 分支。
git push <远程主机名> <本地分支名>
- 如果本地分支名与远程分支名相同,则可以省略冒号
git push origin master
- 将本地的 master 分支推送到 origin 代表的远程仓库的 master 分支。
+git push --force origin master
- 将本地的 master 分支推送到 origin 代表的远程仓库的 master 分支。
- 如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数,可以简写为-f
git push origin --delete master
- 删除主机但分支可以使用 --delete 参数,可简写为-d,以下命令表示删除 origin 主机的 master 分支。
git mv [file] [newfile]
- 工作区中的文件被重命名了,而索引区中的原file的索引被删除掉了,然后重新添加了一条索引。由于他只是一个重命名的操作,文件的内容并没有变,也就是说根据文件内容计算出来的SHA-1 Hash也不会变,所以他还是指向原来同一个对象。暂存区中的 这些索引在更新的时候都会重新计算一下所需要生成的tree对象的内容在提交的时候就可以直接生成tree对象,这也是暂存区一个提高git效率的地方
git mv new.txt new.txt1
- 将new.txt重命名为new1.txt。
例如
git mv -f [file] [newfile]
- 如果新但文件名已经存在,但还是要重命名它,可以使用 -f 参数
git branch
git branch
- 列出本地库的所有分支
git branch (branchname)
- 创建新的分支
git checkout -b (branchname)
- 创建新分支并立即切换到该分支下
git branch (branchname)
- 删除指定的分支
git checkout -b newbranchname commit_id
- 基于某次提交创建新分支,并checkout到新分支上
git checkout -b hot 7bdb7e0 -f
,-f表示强制切换分支,要慎用,可能会导致当前工作目录和暂存区的任务丢失。
例如
git merge
git diff
git diff [<path>...]
git diff
- 不加参数即默认比较工作区与暂存区
例如
git diff new.txt
- 工作区中的new.txt与暂存区中的new.txt文件对比
例如
git diff --cached [<path>...]
git diff --cached
- 比较暂存区与HEAD所指的commit对象(当前分支下最近一次提交)
例如
git diff --cached new.txt
- 暂存区中的new.txt与HEAD所指的commit对象(当前分支下最近一次提交)中的new.txt文件对比
git diff HEAD [<path>...]
git diff HEAD
- 比较工作区与HEAD所指的commit对象(当前分支下最近一次提交)
例如
git diff HEAD new.txt
- 工作区中的new.txt与HEAD所指的commit对象(当前分支下最近一次提交)中的new.txt文件对比
例如
git diff commit-id [<path>...]
git diff 4cf0c91
- 工作区与4cf0c91表示的commit对象做对比
例如
git diff 4cf0c91 new.txt
- 工作区中的new.txt文件与4cf0c91表示的commit对象中的new.txt文件
例如
git diff --cached [<commit-id>] [<path>...]
-
git diff --cached 4cf0c91
- 暂存区与指定commit对象对比
例如
-
git diff --cached 4cf0c91 new.txt
- 暂存区中的new.txt文件与指定commit对象中的文件new.txt文件对比
例如
-
git diff [<commit-id>] [<commit-id>] [<path>...]
git diff 4cf0c91 1142124
- 比较两个指定的commit对象之间的差异
例如
git diff 4cf0c91 1142124 new.txt
- 将两个指定的commit对象中的new.txt对比
例如
使用git diff打补丁
git diff > patch
- patch的命名是随意的,不加其他参数时作用是当我们希望将我们本仓库工作区的修改拷贝一份到其他机器上使用,但是修改的文件比较多,拷贝量比较大。
此时我们可以将修改的代码做成补丁,之后在其他机器上对应目录下使用 git apply patch 将补丁打上即可
例如
- patch的命名是随意的,不加其他参数时作用是当我们希望将我们本仓库工作区的修改拷贝一份到其他机器上使用,但是修改的文件比较多,拷贝量比较大。
git diff --cached > patch
//是将我们暂存区与版本库的差异做成补丁git diff --HEAD > patch
//是将工作区与版本库的差异做成补丁git diff Testfile > patch
//将单个文件做成一个单独的补丁- 拓展:
git apply patch
应用补丁,应用补丁之前我们可以先检验一下补丁能否应用,git apply --check patch
如果没有任何输出,那么表示可以顺利接受这个补丁
另外可以使用git apply --reject patch
将能打的补丁先打上,有冲突的会生成.rej
文件,此时可以找到这些文件进行手动打补丁 补充
- 使用
git diff
的所有命令的结果
都可以重定向
到一个文件做成补丁
- 使用
git stash
参考
-
贮藏(stash)会处理工作目录的
脏
的状态
——即跟踪文件的修改与暂存的改动——然后将未完成的修改保存到一个栈
上, 而你可以在任何时候重新应用这些改动(甚至在不同
的分支上)。 -
git stash
==git stash push
- 将工作区与暂存区的状态保存到栈中
git stash 只会贮藏已修改和暂存的已跟踪文件,不会贮藏未跟踪和已忽略(以.开头的文件或文件夹)的文件
例如
-
git stash list
- 查看所有的贮藏信息
例如
-
git stash apply
git stash apply
- 将刚刚贮藏的工作重新应用
git stash apply stash@{0}
- 将指定的贮藏的工作重新应用,此处重新引用stash@{0}。工作区恢复,暂存区不会恢复。除非加上–index参数
例如
补充
- 可以看到 Git 重新修改了当你保存贮藏时add到stage的文件。
- 在本例中,当尝试应用贮藏时有一个干净的工作目录,并且尝试将它应用在保存它时所在的分支。 并不是必须要有一个干净的工作目录,或者要应用到同一分支才能成功应用贮藏。 可以在一个分支上保存一个贮藏,切换到另一个分支,然后尝试重新应用这些修改。
- 当
应用贮藏
时工作目录中也可以有修改与未提交的文件——如果有任何东西不能干净地应用,Git 会产生合并冲突
git stash apply --index
- 获取栈顶贮藏,但并不弹出栈顶,将工作区和暂存区从栈中恢复成git stash前的状态,包括new.txt add到stage的状态。
例如
git stash apply stash@{0} --index
- 获取指定的贮藏,但并不弹出栈顶,然后将工作区和暂存区从栈中恢复成git stash前的状态。
-
git stash drop
git stash drop
- 删除栈顶贮藏
git stash drop stash@{0}
- 删除指定贮藏
-
git stash pop
- 功能与git stash apply相同,只不过贮藏会弹出栈
git stash pop
git stash pop --index
git stash pop stash{0}
git stash pop stash{0} --index
-
git stash --keep-index
- 目前功能不是很理解
例如
-
git stash -u
==git stash --include-untracked
- 默认情况下,git stash 只会贮藏已修改和暂存的 已跟踪 文件。 如果指定 --include-untracked 或 -u 选项,Git 也会贮藏任何未跟踪文件。 然而,在贮藏中包含未跟踪的文件仍然不会包含明确 忽略 的文件。
-
git stash -a
- 要额外包含忽略的文件,请使用 --all 或 -a 选项。
-
git stash -p
==git stash --patch
- 如果指定了 --patch 标记,Git 不会贮藏所有修改过的任何东西, 但是会交互式地提示哪些改动想要贮藏、哪些改动需要保存在工作目录中。
例如
-
git stash branch <new branchname>
- 如果贮藏了一些工作,将它留在那儿了一会儿,然后继续在贮藏的分支上工作,在重新应用工作时可能会有问题。 如果应用尝试修改刚刚修改的文件,你会得到一个合并冲突并不得不解决它。 如果想要一个轻松的方式来再次测试贮藏的改动,可以运行 git stash branch 以你指定的分支名创建一个新分支,检出贮藏工作时所在的提交,重新在那应用工作,然后在应用成功后丢弃贮藏
- 这是在新分支轻松恢复贮藏工作并继续工作的一个很不错的途径。
例如
-
git stash clear
- 删除所有缓存的stash
-
git stash show
-
git stash show -p
- 在该命令后面添加-p或–patch可以查看特定stash的全部diff
git clean
- 用来从你的工作目录中删除所有没有tracked过的文件
git clean -n
- 是一次clean的演习, 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒.建议在使用所有的删除参数时都先加上
-n
,保证安全
- 是一次clean的演习, 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒.建议在使用所有的删除参数时都先加上
git clean -f
- 删除当前目录下所有untracked的文件. 他不会删除.gitignore文件里面指定的文件夹和文件
git clean -f <path>
- 删除指定路径下的没有被track过的文件
git clean -fd
- 连 untracked 的目录也一起删掉
git clean -fdx
- 连 .gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git cherry-pick
- 能够把另一个分支的一个或多个提交复制到当前分支
- 具体方法
- (1) git checkout 到另一个分支,然后使用git log找到想要复制的commit 的id,记录下来
- (2) 切换到自己分支,使用git cherry-pick [上面记录的commit id] 回车即可!
- (3) 如果想要复制多个, 使用git cherry-pick (commitid1…commitid100],commitid1为想复制的最老提交(不包括),commitid100为想复制的最新提交(包括)
- 如果想要包括commitid1,那么在commitid1后加^即可,即 git cherry-pick [commitid1^…commitid100]!
- 具体方法
修改提交备注
git commit --amend
git rebase -i HEAD~2
- 详解
git rev-parse
- 要将任意扩展对象引用转换为SHA-1
git rev-parse master
例如
git rev-parse first
例如
git show-ref
- 将指定的引用( branches 和 tags )转换为SHA-1,则有
git show-ref
。git show-ref master
例如
git show-ref first
例如
git for-each-ref
- 将所有的branch/tag引用转换为SHA-1
例如
git cat-file
-
git cat-file -p [commit | tree | blob |tag]
- 查看指定对象的内容,可以是代表对象的哈希值或引用
例如
-
git cat-file -t [commit | tree | blob |tag]
- 查看指定对象的对象类型,可以是代表对象的哈希值或引用
例如
git restore <file>
- 当处于
modified
状态的文件不希望add到暂存区时,可以使用该命令使工作目录中的<file>文件内容恢复到修改之前。# 例如: C:\Users\Administrator\Desktop\git-test (master) λ echo dec>>test.txt C:\Users\Administrator\Desktop\git-test (master) λ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: test.txt no changes added to commit (use "git add" and/or "git commit -a") C:\Users\Administrator\Desktop\git-test (master) λ git restore test.txt C:\Users\Administrator\Desktop\git-test (master) λ cat test.txt abc C:\Users\Administrator\Desktop\git-test (master) λ