Git命令整合

166 阅读25分钟

Git基本配置

因为Git是分布式版本控制系统,所以每个几期都必须自曝家门:记录用户的名字和email

git config --global user.name "name"
git config --global user.email "email"
// 使用--global选项,表示这台几期上所有的git仓库都会使用这个配置

可以对不同的仓库指定不同的用户名和email地址

获取帮助的命令

git help <verb>
git <verb> help
man git-<verb>
// verb指需要获取帮助的操作
git help config
// 获取config命令的帮助
git add -h
// 如果不需要全面的手册,可以使用可用选项的快速参考,-h

初始化仓库的命令

git init
// 该命令将创建一个.git的子目录,这个子目录中含有初始化的Git仓库中所有的必须文件

克隆远程仓库的命令

git clone url
// url指仓库地址
// 该命令会在当前目录下创建一个目录,并在这个目录下初始化一个.git文件夹
git clone url newname
// 自定义本地仓库的名称

创建分支的命令

git branch
// 查看本地分支,该命令会列出所有分支,前面带*的表示当前分支
git branch -r
// 查看远程分支
git branch -d
// 删除分支
git branch -D
// 强制删除分支
git banch name
// 创建本地分支
git branch -v
// 查看每一个分支最后一次提交
git branch --merged
// 查看哪些分支已经合并到当前分支
git branch --no-mergerd
// 查看所有包含未合并工作的分支

切换分支的命令

git checkout -- file
// 丢弃工作区的修改
// 文件自修改后,还没被放到暂存区,现在撤销修改就回到和版本库一摸一样的状态
// 文件已经添加到暂存区,现在撤销修改就回到添加到暂存区前的状态
// 简单说,就是让这个文件回到最近一次commit或add时的状态
// 是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
// 使用场景:改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
// 不但改乱了工作区某个文件的内容,还添加到了暂存区,想丢弃修改,第一步,用命令git reset HEAD <file>,回到场景1的操作
// 已经提交了不合适的修改到版本库,想要撤销本地提交,前提是没有推送远程,可以使用版本回退
git checkout -b 
// git branch和git checkout的合写
// -b表示创建并切换分支
// 没有-b表示切换分支
git checkout -b branch-name origin/branch-name
// 创建并切换分支,同时创建远程分支
git switch
// 最新版本的Git提供了新的git switch命令切换分支
// -c创建并切换分支

删除分支的命令

git branch -d 分支名
git push origin --delete 分支名
// 删除远程分支

合并分支的命令

git merge

跟踪/提交文件的命令

git add
// 指定追踪文件
// git add命令使用文件或目录的路径作为参数
// 如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件
git add .
// 操纵的对象是当前目录下的所有变更,增删改,.表示当前目录
git add -A
// 操作的对象是整个工作区的所有变更,无论当前位于哪个目录下
git add -u
// 操作的对象是整个工作区已经跟踪的变更(update:只包括更新和删除,不包括新增),无论是在哪个目录下
// git add多个文件用空格隔开
// git add命令可以用-f(force)选项添加被忽略的文件
// 强制添加到git

git commit
// 使用该命令前确认修改的文件已经git add过,否则提交的时候不会记录这些尚未暂存的变化
// 已修改但未占村的文件只会保留在本地磁盘
git commit -m
// 提交文件至仓库
// -m后面输入的是本次提交的说明,可以输入任意内容,建议输入有意义的,这样可以方便从历史记录中找到改动记录
// 成功后提示:x file changed:x个文件被改动;x insertions:插入了x行内容
// 可以一次提交多个文件
git commit -a
// 该命令可以自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤
// 该命令可能会把不需要的文件添加到提交中

查看修改对比的命令

git diff
// 该命令可以查看尚未暂存的文件修改了哪些内容
// 查看difference,显示的格式是Unix通用的diff格式,该命令可以查看我们做了什么修改
// 工作区和暂存区之间的区别
git diff HEAD
// 工作区和版本库之间的区别
git diff --staged
// 暂存区和版本库最后一次提交文件之间的差别
git diff --cached
// 查看已经暂存起来的变化
// cached和staged是同义词

重新提交的命令

git commit --amend
// 将暂存区中的文件提交,如果自上次提交以来还未做任何更改,快照会保持不变,所修改的只是提交信息
// 假设提交后发现忘记暂存某些需要的修改,可以
git commit -m 'xxxx'
git add filename
git commit --amend
// 最终只会有一个提交,第二次提交将代替第一次提交的结果
// 当在修补最后的提交时,并不是通过用改进后的提交原位替换掉就有提交的方式来修复的,从效果上来说,就像是就有的提交从未存在过一样,它并不会出现在仓库的历史中
// 修补提交最明显的价值是可以稍微改进你最后的提交,不去弄乱仓库历史

移除文件的命令

git rm <file>
// 删除文件,并连带从工作目录中删除指定文件,这样以后都不会出现在为跟踪文件清单中了
// 如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容
// 如果只是简单地从工作目录中手工删除文件,运行git status时就会在"Changes not staged for commit"部分(为暂存清单)看到
// 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项-f,这是为了安全,防止误删尚未添加到快照的数据,这样的数据是无法恢复的
git rm --cached <filename>
// 如果想把文件从Git仓库中删除(暂存区移除),但仍然希望保留在当前工作目录中,换句话说,想让文件保留在磁盘,但并不想让Git继续跟踪
// 当忘记添加.gitignore文件,不小心把一个很大的日志文件或一堆.a这样的编译生成文件添加到暂存区时,这一做法尤其有用

git rm命令后面可以列出文件或者目录名字,也可以是用glob模式

git rm log/\*.log
// 此命令删除log/目录下扩展名为.log的所有文件
git rm \*~
// 该命令会删除所有名字以~结尾的文件

查看提交历史的命令

git log
// 使用git log命令,可以看到以下输出信息:
commit ac76cd890f55b3cd4aa5dc2421fde6ac92497e00 (HEAD -> bugfix/splash_svga, origin/bugfix/splash_svga)
Author: leo.byzx@nonolive.com <leo.byzx@nonolive.com>
Date: Fri Feb 26 10:14:02 2021 +0800
	fix(common_method):修复cms登出没有成功bug

commit 1eb244d7bec05165e48a829522b3b76ee491f2c3
Author: leo.byzx@nonolive.com <leo.byzx@nonolive.com>
Date:   Thu Feb 25 18:06:13 2021 +0800

    fix(specialGiftDisplayConfigDetail):修复测试环境添加gift事件报错问题

不传入任何参数的默认情况下,git log会按时间先后顺序列出所有的提交,最近的更新排在最上面

这个命令会列出每个提交的SHA-1校验和作者的名字,电子邮箱,提交时间以及提价说明

// git log常用选项
git log -p | git log -patch
// 显示每次提交所引入的差异(按补丁的格式输出),同时也可以限制显示的日志条目数量
git log -p -2
// 将显示的日志条目数量限制为两条
commit ac76cd890f55b3cd4aa5dc2421fde6ac92497e00 (HEAD -> bugfix/splash_svga, origin/bugfix/splash_svga)
Author: leo.byzx@nonolive.com <leo.byzx@nonolive.com>
Date:   Fri Feb 26 10:14:02 2021 +0800

    fix(common_method):修复cms登出没有成功bug

diff --git a/src/src/utils/common_method.js b/src/src/utils/common_method.js
index e468579e..e39e6a79 100644
--- a/src/src/utils/common_method.js
+++ b/src/src/utils/common_method.js
@@ -31,8 +31,6 @@ const commomMethod = {
                     "admin=" +
                     admin +
                     ";path=/" +
-                    ";domain=" +
-                    domain +
                     ";expires=" +
                     exp.toGMTString();
             }

commit 1eb244d7bec05165e48a829522b3b76ee491f2c3
Author: leo.byzx@nonolive.com <leo.byzx@nonolive.com>
Date:   Thu Feb 25 18:06:13 2021 +0800

    fix(specialGiftDisplayConfigDetail):修复测试环境添加gift事件报错问题

diff --git a/src/src/components/gift/specialGiftDisplayConfig/specialGiftDisplayConfigDetail.vue b/src/src/components/gift/specialGiftDisplayConfig/specialGiftDisplayConfigDetail.vue
index 4cff3e0a..ec07c78f 100644
--- a/src/src/components/gift/specialGiftDisplayConfig/specialGiftDisplayConfigDetail.vue
+++ b/src/src/components/gift/specialGiftDisplayConfig/specialGiftDisplayConfigDetail.vue
@@ -16,7 +16,7 @@
                                 :label="item.name"
                                 :value="item.gift_id">
                                 <img
-                                    :src="item.pic.indexOf('http') > -1 ?item.pic: img_server + '/' + item.pic"
+                                    :src="item.pic && item.pic.indexOf('http') > -1 ?item.pic: img_server + '/' + item.pic"
                                     class="gift-icon" >
                                 <span>{{ item.name }}</span>
                             </el-option>
@@ -28,7 +28,7 @@
                                 :label="item.name"
                                 :value="item.gift_id">
                                 <img
-                                    :src="item.pic.indexOf('http') > -1 ?item.pic: img_server + '/' + item.pic"
+                                    :src="item.pic && item.pic.indexOf('http') > -1 ?item.pic: img_server + '/' + item.pic"
                                     class="gift-icon" >
                                 <span>{{ item.name }}</span>
                             </el-option>
@@ -209,7 +209,7 @@
                                     <div>{{ item.gift_id }}</div>
                                     <div> <img
                                         v-if="item.pic"
-                                        :src="item.pic.indexOf('http')>-1?item.pic : img_server+ '/' + item.pic"
+                                        :src="item.pic && item.pic.indexOf('http')>-1?item.pic : img_server+ '/' + item.pic"
                                         class="icon vertical-mid"
                                         width="50" ></div>
                                     <div>{{ item.price }}</div>

该选项除了显示基本信息之外,还附带了每次提交的变化,当进行代码审查,或者快速浏览某个搭档的提交所带来的变化时,可以用上

想看到每次提交的简略统计信息,可以使用--stat选项

git log --stat
commit ac76cd890f55b3cd4aa5dc2421fde6ac92497e00 (HEAD -> bugfix/splash_svga, origin/bugfix/splash_svga)
Author: leo.byzx@nonolive.com <leo.byzx@nonolive.com>
Date:   Fri Feb 26 10:14:02 2021 +0800

    fix(common_method):修复cms登出没有成功bug

 src/src/utils/common_method.js | 2 --
 1 file changed, 2 deletions(-)

commit 1eb244d7bec05165e48a829522b3b76ee491f2c3
Author: leo.byzx@nonolive.com <leo.byzx@nonolive.com>
Date:   Thu Feb 25 18:06:13 2021 +0800

    fix(specialGiftDisplayConfigDetail):修复测试环境添加gift事件报错问题

 .../specialGiftDisplayConfig/specialGiftDisplayConfigDetail.vue     | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
// 该选项在每次提交的下面列出所有被修改过的文件,有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了,在每次提交的最后还有一个总结

使用不同于默认格式的方式展示提交历史,使用选项--pretty,这个选项有一些内建的子选项

oneline,将每个提交放在一行显示

short,full,fuller选项展示的信息的格式基本一致,详尽程度不一

git log --pretty=oneline

ac76cd890f55b3cd4aa5dc2421fde6ac92497e00 (HEAD -> bugfix/splash_svga, origin/bugfix/splash_svga) fix(common_method):修复cms登出没有成功bug
1eb244d7bec05165e48a829522b3b76ee491f2c3 fix(specialGiftDisplayConfigDetail):修
复测试环境添加gift事件报错问题
0fee82dfa5d7504d01ed9d0a730bb9745be32605 fix(splash):修复svga上传失败问题
be0bbdd41d31a7e0371289c09bab0884616f7a7e (tag: v2.10.9, master) Merge branch 'feature/page-builder' into 'master'

// format,可以定制记录的显示格式,这样的输出对后期提取分析格外有作用
git log --pretty=format:"%h - %an, %ar : %s"
ac76cd89 - leo.byzx@nonolive.com, 87 minutes ago : fix(common_method):修复cms登
出没有成功bug
1eb244d7 - leo.byzx@nonolive.com, 18 hours ago : fix(specialGiftDisplayConfigDetail):修复测试环境添加gift事件报错问题
0fee82df - leo.byzx@nonolive.com, 18 hours ago : fix(splash):修复svga上传失败问
题
be0bbdd4 - 郭云龙, 4 days ago : Merge branch 'feature/page-builder' into 'master'
1f7eda64 - 郑志昭, 6 days ago : Merge branch 'bugfix/host_task_model_gift_select' into 'master'
9685bb63 - yuanmei.cym, 6 days ago : feat: 删除注释代码
03bf2e5a - Amiria, 6 days ago : fix: 更新配置
0e82bb47 - yuanmei.cym, 7 days ago : feat: 修改bug
e5386741 - 郑志昭, 7 days ago : Merge branch 'feature/anchor_level_v2' into 'master'
b9cc8059 - leo.byzx@nonolive.com, 3 weeks ago : fix(streamerrank-ranklist):兼容count字段不返回的情景

git log --pretty=format常用选项

选项说明
%H提交的完整哈希值
%h提交的简写哈希值
%T树的完整哈希值
%t树的简写哈希值
%P父提交的完整哈希值
%p父提交的简写哈希值
%an作者名字
%ae作者的电子邮件地址
%ad作者修订日期(可以用 --date=选项 来定制格式)
%ar作者修订日期,按多久以前的方式显示
%cn提交者的名字
%ce提交者的电子邮件地址
%cd提交日期
%cr提交日期(距今多长时间)
%s提交说明
作者指实际做出修改的人,提交者指最后将此工作成功提交到仓库的人

oneline或format与另一个log选项--graph结合使用,这个选项添加了一些ASCII字符串来形象地展示分支,合并历史

git log --pretty=format:"%h %s" --graph
* ac76cd89 fix(common_method):修复cms登出没有成功bug
* 1eb244d7 fix(specialGiftDisplayConfigDetail):修复测试环境添加gift事件报错问题
* 0fee82df fix(splash):修复svga上传失败问题
*   be0bbdd4 Merge branch 'feature/page-builder' into 'master'
|\
| * 03bf2e5a fix: 更新配置
| *   669dbaa4 Merge remote-tracking branch 'origin/master' into feature/page-builder
| |\
| * | 50d293df fix: 修改建站平台本地调试接口
| * | 4bf59e6f feat: 修改建站平台的配置
| * |   4016bfda Merge remote-tracking branch 'origin/master' into feature/page-builder
| |\ \
| * | | 383610f7 feat: 完善建站平台需要的参数
| * | | d7f87ea0 feat: update config
| * | |   c478107b Merge remote-tracking branch 'origin/bugfix/fix_eslint_error' into feature/page-builder

git log常用选项

选项说明
-p按补丁格式显示每个提交引入的差异。
--stat显示每次提交的文件修改统计信息。
--shortstat只显示 --stat 中最后的行数修改添加移除统计。
--name-only仅在提交信息后显示已修改的文件清单。
--name-status显示新增、修改、删除的文件清单。
--abbrev-commit仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。
--relative-date使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。
--graph在日志旁以 ASCII 图形显示分支与合并历史。
--pretty使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。
--oneline--pretty=oneline --abbrev-commit 合用的简写。
限制输出的长度

git log除了定制输出格式的选项外,还有很多能够限制输出长度的选项、

使用类似-的选项,其中n可以是任何证书,表示斤显示最近的n条提交

实践中这个选项用的不多,因为Git会默认将所有的输出传送到分页程序中,所以一次只能看到一页的内容

--since和--until这种按照时间作限制

git log --since=2.weeks
// 该命令可用的格式十分丰富--可以是类似“2021-2-26”的具体某一天,也可以是“2 years 1 day 3 minutes ago”的相对日期
// 还可以过滤出匹配指定条件的提交,用--author选项显示指定作者的提交,用--grep选项搜索提交说明中的关键字
// 可以指定多个--author和--grep搜索条件,这样会只输出任意匹配--author模式和--grep模式的提交,然而,如果添加了--all-match选项,则只会输出所有匹配--grep模式的提交

-S,接受一个字符串参数,并且只会显示那些添加或删除了该字符串的提交

假设想找出添加或删除了对某一特定函数的引用的提交

git log -S function_name

path,如果只关心某些文件或目录的历史提交,可以在gitlog选项的最后面指定它们的路径

因为是放在最后位置上的选项,所以用两个短划线(--)隔开之前的选项和后面限定的路径名

限制git log输出的选项

选项说明
-<n>仅显示最近的 n 条提交。
--since, --after仅显示指定时间之后的提交。
--until, --before仅显示指定时间之前的提交。
--author仅显示作者匹配指定字符串的提交。
--committer仅显示提交者匹配指定字符串的提交。
--grep仅显示提交说明中包含指定字符串的提交。
-S仅显示添加或删除内容匹配指定字符串的提交。
--no-merses,避免显示的合并提交弄乱历史记录
git log --oneline --decorate
// 查看各个分支当前所指的对象
f30ab (HEAD -> master, testing) add feature #32 - ability to add new formats to the central interface
34ac2 Fixed bug #1328 - stack overflow under certain conditions
98ca9 The initial commit of my project

推送至远程的命令

git push
// 该命令会把本地版本库的git对象上传到远程库,并用本地分支引用更新远程版本库对对应分支的应用
// 完整写法git push 上游版本库 本地分支:远程分支
// 当本地分支与远程分支同名时,只需要git push 上有版本库 本地分支
// 当远程分支不存在时,git push会自动创建对应的远程分支
// 每次git push前最好都git pull一下,同步一下远程库的最新信息
git push -u origin master
// 第一次推送master分支的所有内容
git push origin <tagname>
// 推送一个本地标签
git push origin --tags
// 推送全部未推送过的本地标签
git pull
// 拉取远程分支
git branch --set-upstream-to <branch-name> origin/<branch-name>
// 关联本地分支和远程分支

拉取远程库的命令

git pull
// 该命令等同于git fetch + git merge
// 该命令先把远程库的更新下载到本地,然后和本地分支合并

git fetch
// 该命令可以把上游版本库的更新下载到本地库,这个更新包括Git对象和分支引用

从远程仓库获取数据

git fetch <remote>
// 访问远程仓库,从中拉取所有本地没有的数据,执行完毕后,将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看
// 该命令只会将数据下载到本地仓库,需要手动合并或修改当前的工作

查看远程库信息的命令

git remote
// git remote add 上游名 URL 可以添加上游版本库
// git clone之后本地就会有一个名为origin的上游,上游的分支信息保存在.git/refs/remotes/origin目录下
// 该命令可以查看远程版本库的信息
git remote -v
// -v显示详细信息
git remote add origin git@server-name:path/repo-name.git
// 关联一个远程仓库
git remote rm <name>
// 删除远程仓库
git remote set-url --push <name> <newUrl>
// 修改远程仓库
git remote rename oldname newname
// 重命名
// 会同事修改你所有远程跟踪的分支名字,过去引用oldname/master的现在会引用newname/master
git remote show url
// 查看某一个远程仓库的更多信息
// 这个命令列出了当你在特定的分支上执行git push回自动地推送到哪一个远程分支,同样也列出了哪些远程分支不在本地,哪些分支已经从服务器上移除了,还有当执行git pull时哪些本地分支可以与它跟踪的远程分支自动合并
git remote remove url/git remote rm url
// 移除一个远程仓库
// 一旦用此方法删除一个远程库,那么所有和这个远程库相关的远程跟踪分支以及配置信息也会一起被删除

移除文件的命令

Git不显示跟踪文件移动操作,如果在Git中重命名了某个文件,仓库中存储的原数据并不会体现出这是一次改名操作

git mv file_from file_to
// 运行git mv相当于
// mv file_from file_to
// git rm file_from
// git add file_to

取消暂存的文件的命令

取消暂存文件中的某一个

git reset HEAD file
// 取消暂存某个文件
// git reset是个危险的命令,如果加上--hard选项更是如此

撤销对文件的修改的命令

不想保留某个文件的修改,想要还原成上次提交的样子

git checkout -- filename
// 该命令是一个危险的命令,对filename在本地的任何修改都会消失,Git会用最近提交的版本覆盖掉它,除非确实清楚不要这个文件的本地修改了,否则不要使用

列出标签的命令

git tag
// 在Git中列出已有的标签,可以带上可选的-l或--list
// 可以按照特定的模式查找标签
git tag -l "v1.8.5*"
// 查找1.8.5系列

按照通配符列出标签需要-l或--list选项

如果只想要完整的标签列表,那么运行git tag就会默认假定想要一个列表,它会直接列出来

如果提供了一个匹配标签名的通配模式,-l或--list是强制使用的

创建标签的命令

Git支持两种标签:轻量标签lightweight和附注标签annotated

轻量标签很像一个不会改变的分支,它只是某个特定提交的引用

附注标签是存储在Git数据库中的一个完整对象,它们是可以被校验的,其中包含打tag者的名字,邮箱,日期,还有一个标签信息,并且可以用GNU Privacy Guard(GPG)签名并验证

通常建议创建附注标签,临时使用或者不想保存上述信息,可以使用轻量标签

git tag -a v1.4 -m "my version 1.4"
// 附注标签,使用选项-a
// -m选项指定了一条将会存储在标签中的信息,如果没有为附注标签指定一条信息,Git会启动编辑器要求输入
git show
// 查看标签信息和与之对应的提交信息
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number
// 输出显示了打标签者的信息,打标签的日期时间,附注信息,然后显示具体的提交信息

轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息

创建轻量标签不需要使用-a,-s或-m选项,只需要提供标签名字

git tag v1.4-1w
// 此时运行git show,不会看到额外的标签信息,命令只会显示出提交信息
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

后期打标签的命令

// 假设提交历史如下
git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
// 打tag
git tag -a v1.2 9fceb02

推送标签到远程的命令

默认情况下,git push命令并不会传送标签到远程仓库服务器上,在创建完标签后,必须显示地推送标签到共享服务器,这和过程就像共享远程分支一样

git push origin tagname
// 如果想要一次性推送很多标签,使用--tags选项
git push origin --tags
// 推送标签并不会区分轻量标签和附注标签,没有简单的选项能够去选择只推送一种标签

删除标签的命令

git tag -d tagname
// 不会从远程仓库中移除这个标签
// 使用git push <remote> :refs/tags/<tagname>来更新远程
git push origin :refs/tags/v1.1
// 将冒号前面的控制推送到远程标签,从而高效地删除它
git push prigin --delete tagname
// 删除远程分支

标出标签的命令

想要查看某个标签所指向的文件版本,可以使用git checkout命令,这样的操作会使得仓库出于分离头指针的状态,有一些副作用

git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image
// 在分离头指针状态下,如果你做了某些更改然后提交它们,标签不会发生变化,但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交hash才能访问,因此,如果需要进行更改,比如要修复旧版本中的错误,那么通常需要创建一个新分支
git checkout -b version2 v2.0.0
Switched to a new branch "version2"
// 如果在这之后又进行了一次提交,version2分支就会因为这个改动向前移动,此时它就会和v2.0.0标签稍微有些不同,这就要当心了

git diff

git diff
// 查看工作区,暂存区,版本库之间二年间的差异
git diff HEAD
// 工作区和版本库之间的差异
git diff --staged
// 暂存区和版本库之间的差别

重置命令

git reset
// 重置分支的引用和替换暂存区和工作区
git reset --hard commitid
// 将当前分支的引用指向新的提交号
// 替换暂存区,替换后暂存区的内容和新提交的tree一致
// 替换工作区,替换后工作区内容和暂存区一支
// 执行这个命令后会让工作区,暂存区版本库的内容一致
git reset --soft commitid
// 更改当前分支的引用,不影响暂存区和工作区
git reset --soft HEAD^
// 将引用向前回退一次
git reset  --mixed commitid
// git reset命令默认的形式,改变当前分支的引用和替换暂存区,不影响工作区

git reset 或 git reset HEAD命令会用HEAD指向的目录树充值暂存区,不影响工作区

git reset 文件名 或 git reset HEAD 文件名,会将对应文件的改动撤出暂存区,即用HEAD提交中的文件替换暂存区中的文件,不影响工作区

git reset可以充值分支引用,是因为它修改了refs/heads/ 下的分支文件说明

暂存修改的命令

git stash
// 隐藏工作区
git stash apply
// 恢复工作区,stash内容不删除,需要用git stash drop删除
git stash pop
// 恢复工作区同时把stash内容删除
git stash list
// 查看工作区隐藏的位置
git stash apply stash@{0}
// 恢复指定的stash

复制特定提交到当前分支的命令

git cherry-pick <commit>
// 复制一个特定的提交到当前分支
// 场景:在master分支上修复的bug,想要合并到当前dev分支,使用该命令


git rebase
// 把分叉的提交历史整理成一条直线,看上去更直观,缺点是本地的分叉提交已经被修改过了
// rebase操作可以把本地未push的分叉提交历史整理成直线
// rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
 
git check-ignore -v <filename>
// 检查.gitignore文件是否写的有问题

git mv
// 移动或重命名工作区文件

设置别名的命令

git config --global alias.st status
// git status => git st

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

git config --global alias.last 'log -1'
// git last 显示最后一次提交信息

--global是针对当前用户起作用的,如果不加,表示针对当前仓库

配置文件放在.git/config文件中

可在该文件中删除别名