33 条常用 git 命令详解

您所在的位置:网站首页 idea如何切换git账号 33 条常用 git 命令详解

33 条常用 git 命令详解

2023-02-17 01:37| 来源: 网络整理| 查看: 265

git 是两个开放源码的分布式系统版控制技术,也是计算机系找组织工作的必不可少专业技能众所周知,其起初由 Linux Torvalds (Linux 之父) 缔造,于 2005 年正式发布。

有关 git 的讲义网路上早已有很多很多,其大体组织工作业务流程如下表所示图:

33 条常用 git 命令详解

其大体指示如下表所示图:

33 条常用 git 命令详解

责任编辑主要就如是说常见的 33 条 git 指示,期望能我们采用 git 增添许多协助。

版 git version 2.17.2 (Apple Git-113) 如是说

下列每一指示也可采用 git -h 来查阅相关联非官方文件格式。

init

能采用git init在pkg建立 git 库房,也可采用git init 在 path 方向下建立目录并建立 git 库房。注意有个–bare参数能生成一般作为远程库房的裸库房,其不包含组织工作区,具体可参考此博客。

clone

能直接采用 git clone 来克隆相关联库房代码,本地默认存储目录为pkg下的库房同名目录,也可在 url 之后指定本地的存储目录名。例如:

git clone git clone

具体的 url 有四种协议格式,分别是 local,git,ssh,https 协议,具体区别可参考此博客和博客。

此外在克隆某些存在较大文件的项目时,能采用 git clone –depth=n 来下载该项目 master 分支最近 n 次 commit 的相关文件和引用;采用 git clone –single-branch –branch=dev 来下载该项目 dev 分支的相关文件和引用。这样能大大加快克隆的速度。

config

通常只用来设置邮箱和用户名。注意有三个级别local,global和system,分别相关联项目级别,用户级别和机器级别。默认不指定是local级别,具体区别可参考此博客。

git config user.email “[email protected]”git config user.name “LebronAl”

此外,在单机配置多个 git 账号时,除了在目录~/.ssh/下生成 config 文件外,一般也需要在相关联库房重新设置非全局的正确用户名和邮箱以避免身份混淆,具体配置方式可参考此博客。

remote

通常见来管理上游库房,能通过 git remote -v 来查阅相关信息,其相关指示如下表所示:

// 添加远程库房关联git remote add // 删除远程库房关联git remote remove // 更名远程库房关联git remote rename // 显示某个远程库房的信息git remote show // 更新远程库房 urlgit remote set-url

此外,remote 指示也能为两个远程库房设置多个 url 地址,这样一次 push 就能同时对该远程库房的所有 url 进行推送,比如同时往 github 和 gitee 上推送,具体可参考此博客,相关指示如下表所示:

git remote set-url –add git remote set-url –delete

此外,remote 指示也能跟踪远程的所有分支和清理无效的远程分支跟踪,具体可参考此博客:

// 本地建立远程追踪分支git remote update // 本地清理无效的远程追踪分支git remote prune // 查阅无效的远程追踪分支git remote prune –dry-run add

用来从组织工作区向暂存区添加变更。能采用git add -e 或者git add -p 来交互性的添加组织工作区文件的部分变更到暂存区中去,具体可查阅此博客。

add 指示支持添加单个文件,带有通配符路径的所有相关联文件和所有文件。添加所有文件相关联三种指示,有细微的区别,如是说如下表所示:

// 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)git add -u// 提交当前目录下的所有变化git add .// 提交所有变化git add -A rm

用于删除组织工作区文件,并将此次删除放入到暂存区。(注:要删除的文件没有修改过,就是说和当前版库文件的内容相同。)

git rm

用于删除组织工作区和暂存区文件,并将此次删除放入暂存区。(注:要删除的文件早已修改过,就是说和当前版库文件的内容不同)

git rm -f // 对所有文件进行操作git rm -f -r .

用于删除暂存区文件,并将此次删除放入暂存区,但会保留组织工作区的文件。能理解成解除 git 对这些文件的追踪,将他们转入 untracked 状态。

git rm –cached // 对所有文件进行操作git rm –cached -r .

更多例子可参考此博客。

mv

用于移动或重命名两个文件、目录或软链接。

git mv

相当于mv old_file new_file,git rm old_file,git add new_file这三条指示一起运行,具体可参考此博客。

新文件名早已存在,若想强制覆盖则能采用 -f 参数:

git mv -f reset

用于将指定 commit 和 branch 的文件替换暂存区的文件。有三个常见参数,分别是–hard,–soft,–mixed,默认是–mixed。具体细节和应用场景可参考此博客。

定义三种动作:

替换引用的指向,指向新的提交。替换暂存区。暂存区内容将和指定的提交内容一样。替换组织工作区。组织工作区和指定的提交内容一样。 // 执行 1。常见于合并多个 commit,类似于 squashgit reset –soft [commitId]/// 执行 12。常见于移出暂存区的文件以作为 add 指示的反动作git reset (–mixed) /// 执行 123。常见于无条件放弃本地所有变更以向远程分支同步git reset –hard /// 将暂存区的所有改动撤销到组织工作区git reset (–mixed) HEAD clean

用来从组织工作目录中删除所有没有 tracked 过的文件,git clean 经常和 git reset –hard 一起结合采用。记住 reset 只影响被 track 过的文件,所以需要 clean 来删除没有 track 过的文件。结合采用这两个指示能让组织工作目录完全回到两个指定 的状态,具体可参考此博客。

// 展示哪些文件会被删除,但不真正删除文件git clean -n// 删除指定目录(默认pkg)下所有没有 track 过的文件,但不会删除 .gitignore 文件里面指定的文件夹和文件git clean -f ()// 删除指定目录(默认pkg)下所有没有 track 过的文件,包括 .gitignore 文件里面指定的文件夹和文件git clean -fx ()// 删除指定目录(默认pkg)下所有没有被 track 过的文件和文件夹,但不会删除 .gitignore 文件里面指定的文件夹和文件git clean -df ()// 删除指定目录(默认pkg)下所有没有被 track 过的文件和文件夹,包括 .gitignore 文件里面指定的文件夹和文件git clean -dfx () stash

常见来保存和恢复组织工作进度。注意该指示只对被 git 跟踪的文件有效。这是两个非常有用的指示,具体相关用法可查阅此博客。

// 保存当前组织工作进度,将组织工作区和暂存区恢复到修改之前。默认 message 为当前分支最后一次 commit 的 messagegit stash// 作用同上,message 为此次进度保存的说明git stash save message// 显示此次组织工作进度做了哪些文件行数的变化,此指示的 stash@{num} 是可选项,不带此项则默认显示最近一次的组织工作进度相当于 git stash show stash@{0}git stash show stash@{num}// 显示此次组织工作进度做了哪些具体的代码改动,此指示的 stash@{num} 是可选项,不带此项则默认显示最近一次的组织工作进度相当于 git stash show stash@{0} -pgit stash show stash@{num} -p// 显示保存的组织工作进度列表,编号越小代表保存进度的时间越近git stash list// 恢复组织工作进度到组织工作区,此指示的 stash@{num} 是可选项,在多个组织工作进度中能选择恢复,不带此项则默认恢复最近的一次进度相当于 git stash pop stash@{0}git stash pop stash@{num}// 恢复组织工作进度到组织工作区且该组织工作进度可重复恢复,此指示的 stash@{num} 是可选项,在多个组织工作进度中能选择恢复,不带此项则默认恢复最近的一次进度相当于 git stash apply stash@{0}git stash apply stash@{num}// 删除一条保存的组织工作进度,此指示的 stash@{num} 是可选项,在多个组织工作进度中能选择删除,不带此项则默认删除最近的一次进度相当于 git stash drop stash@{0}git stash drop stash@{num}// 删除所有保存的组织工作进度git stash clear

此外有时我们只想保存部分文件,能通过 add 许多不想保存的文件到暂存区去,然后采用git stash –keep-index来将组织工作区的组织工作进度保存,从而保留暂存区的进度并保存组织工作区的进度。具体可参考此博客。

此外虽然 stash 指示默认不包含未跟踪的文件,但我们能通过显示声明 -u 的方式来保存未被 git 追踪的文件。即 git stash -u 。

status

用于显示文件和文件夹在组织工作区和暂存区的状态。

git status// 展示中包含被忽略的文件git status –ignored log

用来回顾提交历史。可参考此文件格式和此博客。下列只列出几个常见的打印格式:

git loggit log –onelinegit log –graph –pretty=format:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset –abbrev-commit –date=relative// 从 commit 信息中查找包含指定字符串的 commitgit log –grep // 从更改内容中查找包含指定字符串的 commit ,比如想查找哪些 commit 对代码中名为 的函数进行了更改git log -S show

用来显示某个 commit 的具体提交信息和元信息。

git showgit show git show shortlog

用于汇总 git 日志输出。非常人性化的两个指示。

// 按照用户列出其 commit 的次数以及每次 commit 的注释git shortlog// 按照 commit 数量从多到少的顺序列出本库房的贡献者并省略注释git shortlog -sn diff

用来比较文件之间的不同。具体用法可参考此博客。diff 结果的格式可参考此博客了解。

// 查阅组织工作区与暂存区所有文件的变更git diff// 查阅暂存区与最后一次 commit 之间所有文件的变更git diff –cached// 查阅组织工作区与最后一次 commit 之间所有文件的变更git diff HEAD// 查阅两次 commit 之间的变动git diff …// 查阅两个分支上最后一次 commit 的内容差别git diff … branch

用于分支的操作,比如建立分支,查阅分支等等。

// 能查阅本地分支相关联的远程分支git branch -vv // 查阅远程版库分支列表git branch -r// 查阅所有分支列表,包括本地和远程git branch -a// 在当前位置新建 name 分支git branch // 在指定 commit 上新建 name 分支git branch // 强制建立 name 分支,原来的分支会被新建分支覆盖,从而迁移 name 分支指针git branch -f // 删除 dev 分支,如果在分支中有许多未 merge 的提交则会失败git branch -d dev// 强制删除 dev 分支git branch -D dev// 重命名分支git branch -m checkout

用于切换分支或更新组织工作树文件以匹配索引或指定树中的版,具体可参考此博客。

// 切换到指定分支git checkout // 在当前位置新建分支并切换git checkout -b // 在指定 commit 上新建分支并切换git checkout -b // 切换到指定 v1.2 的标签git checkout tags/v1.2// 切换到指定 commitgit checkout // 基于当前所在分支新建两个赤裸分支,该分支没有任何的提交历史但包含当前分支的所有内容,相当于 git checkout -b 和 git reset –soft 两条指示 git checkout –orphan // 放弃组织工作区单个文件的变更,默认会从暂存区检出该文件,如果暂存区为空,则该文件会回滚到最近一次的提交状态git checkout — // 放弃组织工作区所有文件的变更(不包含未跟踪的)git checkout . commit

用于将暂存区里的改动给提交到本地的版库。

// 提交两个描述为 message 的 commitgit commit -m “message”// 提交两个描述为 message 的 commit 并签名(部分开放源码社区会要求开发者提交的每个 commit 均采用 signoff 签名)git commit -s -m “message”// 相当于 git add -a 和 git commit -m “message” 两条指示git commit -am “message”// 在不增加两个新 commit 的情况下将新修改的代码追加到前一次的 commit 中,会弹出两个编辑器界面重新编辑 message 信息git commit –amend// 在不增加两个新 commit 的情况下将新修改的代码追加到前一次的 commit 中,不需要再修改 message 信息git commit –amend –no-edit// 提交一次没有任何改动的空提交,常见于触发远程 cigit commit –allow-empty -m “message”// 修改 commit 时间git commit -m “message” –date=” Wed May 27 00:35:36 2020 +0800″ revert

撤销某个 commit 的改动。在多人协作中如果某个 commit 早已被推到了远程,此时采用 revert 相比 reset + force-update 是更优雅的撤销变更方式。可参考此博客和博客。

// 能撤销指定的提交git revert // 能撤销不包括 commit1,但包括 commit2 的一串提交git revert …// revert 指示会对每个撤销的 commit 进行一次提交,–no-commit 后能最后一起手动提交git revert –no-commit …// 退出 revert 过程,常在处理冲突出错时采用git revert –abort// 继续 revert 过程,常在处理完冲突时采用git revert –continue merge

用于将两个或两个以上的开发历史合并在一起的操作,具体详细指示及如是说可看此博客。

// 合并某个分支git merge // 退出 merge 过程,常在处理冲突出错时采用git merge –abort// 继续 merge 过程,常在处理完冲突时采用git merge –continue

此外,有关在能 fast-forward 合并时是否再提交两个 commit 有许多争议,具体可看此博客。

git merge –no-ff

此外能在 merge 时也能采用 –squash 参数,该指示能将合并分支上的多个 commit 合并成两个 commit 放在当前分支上。相比 rebase 的 squash,其主要就区别是该 commit 的 author 不一样。具体可查阅此博客。

git merge –squash rebase

相比 merge,合并分支历史的另一种管理方式,区别可查阅此博客。

// 变基某个分支git rebase // 退出 rebase 过程,常在处理冲突出错时采用git rebase –abort// 继续 rebase 过程,常在处理完冲突时采用git rebase –continue

此外也能采用git rebase -i HEAD~n来合并 n 个 commit,具体过程可参考此博客。切记不要在共用的分支上进行 rebase,具体原因可查阅此博客。

此外也能采用git rebase –onto 来将 (fromCommitId,toCommitId] 上的所有 commit 合并到指定分支上,具体可参考此博客。其实类似于 cherry-pick 多个提交。

cherry-pick

用于将指定的 commit 应用于其他分支,具体可参考此博客。

// 将指定的提交应用于当前分支git cherry-pick // 将指定分支的最近一次提交应用于当前分支git cherry-pick // 将指定的两个提交先后应用于当前分支git cherry-pick // 将指定范围内的多个提交(不包含 commitId1,包含 commitId2)先后应用于当前分支git cherry-pick ..// 将指定范围内的多个提交(包含 commitId1,包含 commitId2)先后应用于当前分支git cherry-pick ^..// 退出 cherry-pick 过程,常在处理冲突出错时采用git cherry-pick –abort// 继续 cherry-pick 过程,常在处理完冲突时采用git cherry-pick –continue tag

常见于正式发布版的管理,是指向某个 commit 的指针,具体可查阅此博客。

// 查阅所有 taggit tag// 基于本地当前分支最后两个 commit 建立 taggit tag // 基于指定 commit 建立 taggit tag // 基于指定 commit 建立 tag 并指定 messagegit tag -a -m “message”// 删除本地指定 taggit tag -d push

用于将本地版库的分支推送到远程服务器上相关联的分支,具体用法可查阅此博客。

// 向远程推送指定分支git push // 向远程推送指定分支并绑定git push -u // 删除远程分支git push :// 向远程推送 taggit push // 删除远程 taggit push :// 向远程推送本地所有 taggit push –tags

此外,当本地版库的分支和远程版库的相关联分支有冲突时,如果想要强制覆盖,千万不要用git push -f,而是应该用git push –force-with-lease,具体原因可查阅此博客。

fetch

博客。

// 取回指定远程库房的所有分支git fetch // 取回指定远程库房的指定分支git fetch // 取回所有远程库房的所有分支git fetch –all pull

FETCH_HEAD的简写。有关其与 fetch 的区别,能参考此博客。

// 相当于 fetch + mergegit pull :// 相当于 fetch + rebasegit pull –rebase : bisect

用于在 git 历史里面二分查找有 bug 的 commit。这是找 bug 时两个非常有用的指示,能快速定位出引入 bug 的 commit。具体采用方式可查阅此博客。

// 开始查找git bisect start [endCommitId] [startCommitId]// 版正确git bisect good// 版错误git bisect bad// 退出查找git bisect reset reflog

常见来恢复本地错误操作。用户每次采用更新 HEAD 的 git 指示比如 commit、amend、cherry-pick、reset、revert 等都会被记录下来(不限分支),就像 shell 的 history 一样。 这样用户如果发生误操作删除了某个 commit 找不到时,调用此指示就能查找到相关联的 commit,从而回到误删前的状态了。具体采用场景可查阅此博客。

git reflog fsck

常见来恢复本地错误操作。只要是对 HEAD 进行操作的错误,一般情况下 reflog 都能恢复,然而有些错误并不会对 HEAD 进行操作,例如将部分代码 stash 之后又不小心 drop 或 clear 掉了,那么此时 HEAD 并没有发生变化,reflog 对此类错误是无能为力的,这个时候 fsck 就能派上用场了,该指示会更加底层,即直接检查 git 中的 blob,tree 和 commit 对象并找到悬空的对象,找到后即能通过git show 来查阅该 commit 是否是被误操作删掉的 commit,如果是的话知道这个 commitId 无论如何都可以恢复了,不论用 merge 还是 cherry-pick 还是 checkout 等,能参考两个恢复误删 stash 数据的修复实例,也能进一步参考官网实例。

git fsck grep

用于检索文件中的文本内容,更多用法可参考此博客。

// 检索所有包含指定关键字的文件git grep text// 检索关键字出现在哪一行git grep -n text// 统计每两个文件中检索到指定关键字的行数git grep -c text blame

用于查阅某个文件的每一行内容由谁所写,类似于 IDEA 的 annotate 功能,具体可查阅此博客。

git blame gc

用来清理 git 目录,删除掉无效的应用和文件,节约存储空间和传输大小。具体功能可参考此博客。

git gc submodule

用于管理多个子项目。该指示允许两个 git 库房作为另两个 git 库房的子目录,并且保持父项目和子项目相互独立。具体用法可参考此博客。

配置

Git 自带两个 git config 的工具来协助设置控制 Git 外观和行为的配置变量。这些变量存储在三个不同的位置:

/etc/gitconfig 文件: 包含系统上每两个用户及他们库房的通用配置。如果采用带有 –system 选项的 git config 时,它会从此文件读写配置变量。

~/.gitconfig 文件:只针对当前用户。能传递 –global 选项让 Git 读写此文件。

当前采用库房的 Git 目录中的 config 文件(就是 .git/config):针对该库房。

每两个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。

.gitignore

.gitignore 文件可能从字面含义也不难猜出:这个文件里配置的文件或目录,会自动被 git 所忽略,不纳入版控制。

在日常开发中,我们的项目经常会产生许多临时文件,如编译 Java 产生的 *.class 文件,又或是 IDE 自动生成的隐藏目录(Intellij 的 .idea 目录、Eclipse 的 .settings 目录等)等等。这些文件或目录实在没必要纳入版管理。在这种场景下,你就需要用到 .gitignore 配置来过滤这些文件或目录。

配置的规则很简单,也没什么可说的,看几个例子,自然就明白了。

这里推荐一下 Github 的开放源码项目。在这里,你能找到很多常见的模板,如:Java、Nodejs、C++ 的 .gitignore 模板等等。

一般有两个级别的 .gitignore 文件:两个是全局的 ~/.gitignore 文件,另两个是库房目录下的 .gitignore 文件。前者会覆盖后者的过滤条件,因此两个项目具体有哪些文件会被 git 忽略与两个文件都有关。我们能将 .idea,*.class 这种常有的过滤目录添加到全局的 ~/.gitignore 中,这样子就不用在每个库房的 .gitignore 中再次添加了。

我的 alias 设置 a = add aa = add -Aau = add -uae = add -eap = add -pbm = blamebr = branch -vvbra = branch -abrd = branch -Dbrf = branch -fbrm = branch -mbs = bisectbss = bisect startbsb = bisect badbsg = bisect goodbsr = bisect resetcf = configcfl = config –listcfg = config –globalcfgl = config –global –listcfs = config –systemcfsl = config –system –listcl = cloneclb = clone –single-branch –branchcld = clone –depthcn = cleancnn = clean -ncnf = clean -fcnfx = clean -fxcndf = clean -dfcndfx = clean -dfxcm = commitcmm = commit -s -mcmme = commit -s –allow-empty -mcma = commit -s –amendcman = commit -s –amend –no-editco = checkoutcob = checkout -bcod = checkout — coda = checkout .coo = checkout –orphancp = cherry-pickcpa = cherry-pick –abortcpc = cherry-pick –continuedf = diffdfc = diff –cacheddfh = diff HEADfh = fetchfha = fetch –allfc = fsckge = grep -n gec = grep -c it = initlg = loglgo = log –onelinelgga = log –graph –pretty=format:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset –abbrev-commit –date=relativelgge = log –greplgs = log -Sme = mergemea = merge –abortmec = merge –continuemen = merge –no-ffmvf = mv -fpl = pullplr = pull –rebaseps = pushpsu = push -upsf = push –force-with-leasepst = push –tagsrb = rebaserba = rebase –abortrbc = rebase –continuerbi = rebase -irbo = rebase –ontorf = reflogrmc = rm –cachedrmca = rm –cached -r .rmf = rm -frmfa = rm -f -r .rs = resetrse = reset HEAD rsh = reset –hardrss = reset –softrv = revertrva = revert –abortrvc = revert –continuervn = revert –no-commitrt = remoterta = remote addrtp = remote prunertpd = remote prune –dry-runrtrm = remote removertrn = remote renamertsu = remote set-urlrtsua = remote set-url –addrtsud = remote set-url –deleterts = remote showrtu = remote updatertv = remote -vsh = stashshu = stash -ushk = stash –keep-indexsha = stash applyshc = stash clearshd = stash dropshl = stash listshp = stash popshsh = stash showshshp = stash show -pshsa = stash saveshsak = stash save –keep-indexso = showsl = shortlogslsn = shortlog -s -nst = status –show-stashsti = stash —ignored –show-stashtg = tagtga = tag -atgd = tag -d 相关资料

githuglearnGitBranchingGit原理入门解析Git 从入门到精通,这一篇就够了

举报/反馈


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3