您现在的位置是:首页 > 科技前沿

常用Git 备忘指南

智慧创新站 2025-05-09【科技前沿】159人已围观

简介优雅使用Git的一些实践oh-my-zsh常用命令Git常用命令git克隆远程分支仓库:gitclone-b分支名称远程地址git克隆远程仓库项目时如果不指定分支,只会克隆默认分支的内容。查看git用户名和密码分支相关gitbranch(查看当前分支)gitbranch-a(查看所有分支)gitch...

优雅使用Git的一些实践

oh-my-zsh常用命令

Git常用命令

git克隆远程分支仓库:

gitclone-b分支名称远程地址git克隆远程仓库项目时如果不指定分支,只会克隆默认分支的内容。

查看git用户名和密码

分支相关

gitbranch(查看当前分支)gitbranch-a(查看所有分支)gitcheckout分支名(切换到对应分支)会自动将代码更新为分支代码gitbranch分支名(创建一个分支)gitbranch-d分支名(删除一个分支)gitbranch-D分支名(强制删除一个未合并的分支)gitcheckout-b分支名[基于的分支名或commit值](切换分支并直接切换过去)

查看git历史

history

按照关键词搜索git历史

history|greppush

查看commit历史

gitloggitlog--summary

设置git账号

"Frankkai""gaokai20100801@""Frankkai""gaokai20100801@"

查看git账号

gitconfig--global--listgitconfig--local--list

仅仅查看某一项的配置

回滚本次修改

gitresetHEADstatic/lib/js//lib/js/

查看本次修改的代码

gitdiffgitdiffHEADgitdiff--staged

提交后发现丢了几个文件没有提交

发现丢了修改记录,重新添加gitadd"*.html"重新提交,最终只有一个提交gitcommit--am

缓存某种后缀的文件

gitadd"*.js"

清除缓存区中的文件

gitresetoctofamily/

彻底删除某种后缀的文件

gitrm"*.txt"

合并分支到master

gitmerge分支名

add.之前取消提交某些文件

gitcheckout--filename

藏代码到脏目录(适用于其他成员修改了相同分支代码,但又不想提交)

gitstash

释放脏目录代码

gitstashpop

释放指定脏目录代码

gitstashpopstash@{0}

删除远程分支(此分支必须是非默认分支)

gitpushorigin--deletebranchname

已经commit,强制回退到旧版本

gitlog//找到commithash值gitreset--hardhash值

查看stash目录

gitstashlist

删除某一个stash

gitstashdropstash@{0}

设置远程仓库地址

gitremoteset-urlorigingit@:baz/

本地创建了新分支,但是orgin没有,push代码前

gitpush--set-upstreamoriginpreproduction

指定tag到远程

gitpushorigintag_name

将全部tag打到远程

gitpush--tags

查看当前tags

gittag--list

仅仅删除index不删除workingtree上的.idea文件

//--cached仅仅删除index,-r(recursive)递归删除.idea目录下的所有文件

git主动track文件,控制文件,做好提交准备

gitaddfile(s)/.

gitunstage文件,释放文件,选择性控制

gitresetHEADfile(s)/.

暂存区文件如何覆盖工作目录文件

gitresetHEADfile(s)/.gitcheckout--file(s)/.

提交已经被git管理的,modified为红色的所有文件

gitadd-u

重置工作区和暂存区的所有文件为原始状态

gitreset--hard

比较当前分支与某次提交的区别

gitdiffHEAD[commithashfragment]

删除一个分支

gitbranch-D[branchname]

同步到remote后,合并多个commit为1个

gitrebase-iHEAD~2/hashpicksquash:wq!

查看项目的origin代表的地址

gitremote-v

pick中途误退出

gitrebase--abort

未同步到remote,重新提交

resetsoft

gitflowrelease发布新版本

itpush

gitflowhotfix修复一个master上的bug

gitflowhotfixstartfoonpmversionpatch//注意:一定要在修复bug代码之前新增版本号"versionchangemessage"gitflowhotfixfinish-ngitpushgitcheckoutmastergitpush

对比2个分支的日志

gitlogdevelop..master

合并master代码到feature

gitcheckoutfeaturegitmergemaster
gitmergemasterfeature

gitrebase冲突时怎么办

squash多个commits成一个怎么敲?

假设mergefeature到master。

gitcheckoutmastergitmerge--squashfeaturegitcommit-m"这是一次squashcommit"gitpush

查看当前分支的父分支

gitreflogshowchildBranch32c3956(HEAD-currentBranch,origin/fatherBranch,fatherBranch,list)childBranch@{0}:branch:CreatedfromfatherBranch

撤销远程分支错误提交

resetgitpush--force

其实使用本地分支的提交替代远程分支。

误删除领先远程的本地分支如何恢复?

gitreflog//找出最新的commitsha1值,HEAD@{1}比HEAD@{2}新gitbranchbranchNamesha1

通过gitreflog找到一个commit,然后再cherry-pick也可以。

删除由npmversionpatch/minor/major误添加的tag

gittag|:refs/tags/

gitfetch与gitpull的区别

gitfetch更新origin/*下的所有分支,在发布gitflowfeature前很有用,用于更新remote分支。gitpull主要用来更新多人合作的当前分支,多用于更新local分支。

远程分支删除,本地gitfetch不能更新到最新分支

gitfetch--prune

及时查看本地所有分支的状态

gitremoteshoworigin

假如远程已不存在这个分支,gitfetch--prune也更新不到状态,该怎么办?

gitpushorigin--deletefeature/fix-chat-unread-msg-async

删除单个脱离的远程分支

gitremoteprunename

取消一次合并(merge)

gitmerge--abort

回退一次commit

gitrevertHead/[commithash]

优雅使用Git的一些实践

windows下gitbash支持中文输入:

生成ssh-key

ssh-keygen-trsa-C"gaokai20100801@"

windows查看ssh-key

/c/Users/frank/.ssh/id_

mac/linux查看ssh-key

cd~/.sshlscatid_

gitflow

误删除stash,该怎么办?

gitfsck--unreachable|grepcommit|cut-d\-f3|xargsgitlog--merges--no-walk--grep=WIP

找到对应的commithash值

gitstashapply1f55da93d26cd51f15f9e93351dae6b75e25e36f

.idea修改总是会提醒,.gitignore不生效

.idea/

Git中的origin是什么?

origin是一个变量,代表着一个git仓库地址。可以使用gitremote-v查看origin代表的地址。

Git的system,global和local参数分别代表什么?

--system可以输出很多git的系统设置,其中最有用的是alias,例如gits代表了gitstatus,系统所有登录用户有用。--global输出了git的全局设置,主要包括全局的和,优先级低于单个仓库中设置的和,当前用户所有仓库有用。--local输出了git的项目设置,主要包括以及gitflow的很多配置,只对某个仓库有用。

Git工作区和暂存区的区别?

addcommit工作目录----暂存区----版本历史

暂存区:git已经获得了对文件的管理权限,暂存区文件有状态:newfile,deleted,modified等等。

版本历史:gitlog查看每一次commit记录。

意外收获:若是想非常细粒度的控制commit记录,可以使用gitadd指定文件,分开多次commit,每一次commit提交一个细粒度功能的变更文件集合,多次走文件目录暂存区版本历史这个流程。

Git如何重命名文件?

Git的workingtree和index是什么意思?

index指的是git索引,可以理解成git有文件的一个复制,仅删除index则仅删除存在于git中的文件。workingtree则是指操作系统的工作树,也就是操作系统的磁盘上存储的文件。举两个常用的例子:

仅删除gitindex中的文件,.idea等IDE隐藏的工作树文件是不能删除的:--cached

//**--cached仅仅删除index**,-r(recursive)递归删除.idea目录下的所有文件

删除index和workingtree上的文件,恩断义绝

gitrm删除index上和workingtree上的文件,

仅仅删除workingtree不删除index的情况,不存在。

nothingtocommit和workingtreeclean?

暂存区没有可以提交到版本历史的内容。工作区也是干净的。

如何一目了然地区分出工作区和暂存区?

Yourbranchisaheadof'origin/master'by1commit版本历史

Changestobecommitted暂存区

Untrackedfiles工作区

//版本历史Yourbranchisaheadof'origin/master'by1commit.(use"gitpush"topublishyourlocalcommits)//暂存区Changestobecommitted:(use"gitresetHEADfile"tounstage)renamed::helloman//工作区Untrackedfiles:(use"gitaddfile"toincludeinwhatwillbecommitted)hi

如何更加优雅地查看日志?

gitlog--oneline简洁的commit记录gitlog-n2--oneline最近的2次简洁的commit记录gitlog--all所有分支的历史版本信息gitlog--graph图形化查看版本演进历史gitlog--oneline--all-n4--graph组合查看日志

如何快速定位到git的命令文档?

githelp--weblog浏览器查看gitlog的用法

git自带的图形化界面怎么看?

gitk无需安装第三方插件,在纯命令行下,无第三方软件情况下可用。

git里的作者和提交人不一样吗?

作者是代码的生成者,是为了版权保护。

神秘的.git目录

HEAD工作分支refs/heads/fooconfigrepo的配置信息refsheads,分支;tags,标签或者里程碑refs/heads/master存放了什么,最新的一个commitrefs/tags/js01存放了什么,最新的一个tag,包含一个objectobjects文件夹,2个字符的和松散的pack文件夹,存放的是tree,tree下有blob文件可以直接通过vim修改HEAD,config等信息,和命令的作用是相同的。

如何判断git文件的类型?

gitcat-file-t/-p[hashfragment]//-t类型,-p内容只要任何文件的文件内容相同,在git眼里,它就是唯一的一个blob。

committree//位于objects目录下blob//位于objects目录的二级目录下,具体的文件

tree,commit,blob的区别?

commit:一个commit肯定会对应一棵树,包含了根tree,author,committer,parent等等一个commit对象的信息。

tree:取出一个commit,存放了一个快照,这个快照,对应了当前项目的所有的文件夹及其文件的快照,是特定时间的整个仓库的一个状态;树里可以有blob,也可以有树,因为树是文件夹;根树是最大的树。

blob:与文件名是否相同无关,只要内容相同,就是唯一的blob。

一个commit包含了哪些?

gitcat-file-p[commithashfragment]

包含tree,parent,author和commiter。

treef06f7f36af17cb9098031c66d22a7910c0fa1bacparent92a55c8a5b1d38d224232ad84b9b728ae77189cbparenteda632a1f2a3ea049c5f5268f6b2f064b71898ceauthorFrankKaigaokai20100801@+0800committerFrankKaigaokai20100801@+0800Mergebranch'feature/chatBreakChange'intoprereleasesrc/api/

一个tree包含了哪些?

gitcat-file-p[treehashfragment]

包含tree,blob。

100644tree09e231414b91779326447a0c8d5b3421aa2308c2static040000treead94369cfdd2038a552e44fc0abbd1738113

一个blob包含了哪些?

gitcat-file-p[treehashfragment]

就是一个具体的文件。

detachedHEAD是什么?

分离头指针。gitcheckout[commithashfragment],切换到分离头指针状态,不与任何branch或tag关联,git会认为这是不重要的,当成垃圾清理掉。

缺点:切换分支后,需要用gitbranch[branchname][commithashfragment]新建一个分支,否则会丢失原消息。

优点:可以基于某一次commit切出分支,然后新建一个commit,快速会退到想要的版本。

HEAD可以指向什么?

它位于.git/HEAD。

可以指向分支或者commit,但其实分支归根结底还是指向了commit。

gitlog查看HEAD指针指向的分支名:(HEAD-foo,bar,master)

可以快速diff,gitdiffHEAD[commithashfragment]。

父亲的父亲diff:gitdiffHEADHEAD~2,gitdiffHEADHEAD^^。

如何修改最新一次commit的message?

gitcommit--am注意:不能在团队的集成分支上,做这样的变更,仅适用于本地。

如何修改老旧commit的message?

gitrebase-i[父commithashfragment]reward添加修改后的commitmessage

注意:不能在团队的集成分支上,做这样的变更,仅适用于本地。

gitstashpopstash@{n}还能做什么操作?

当前分支的本地代码未提交的情况下,pull了领先的远程分支代码,此时远程代码会覆盖本地代码。

git比较聪明,它不会完全将本地的代码扔掉,即使没有人为的生成一次commit记录,也会自动为我们在stash下生成一次记录,以免造成重大的代码丢失。

gitflow模式下,如何规范版本发布?

版本号升级

gitflow对应

bug-patch

hotfix

feature-minor

release

系统重构-major

release

但是在scrum的情况下,迭代非常快速,若所有feature都升级minor,会导致minor数字很大,该怎么处理这种情况?

只升级minor时,在commit提交信息中,添加以下信息:

类型

提交信息

bugpatch

[bugpatch]

featurepatch

[featurepatch

创建一个新的项目并上传到git

gitinitgitacgitremoteaddoriginremoterepositoryURL

git参数--decorate是什么?

有short,full,auto,no几种值,--decorate=short

打印出commit的refname。

short时,refname前缀refs/head,refs/tags/和refs/remotes不会打印

full时,完整前缀会被打印

auto时,如果输出是一个终端,会按照short的方式打印;非终端会显示全部

no时,会隐藏HEAD和tag等等refs信息

默认值是short

cherrypick是什么?

如何理解gitcherrypick?

清空所有本地git缓存

gitrm-r--cache.

errorCommand"husky-run"notfound

/hooks/

一次完整的rebase流程

1.

gitrevert和gitreset的区别

gitrevert生成一个新的commit的方式回滚到上一个或者指定commit版本的代码,原理是Head继续前进。有存在被回滚掉的commit分支代码合并过来时,代码正常被合并

gitreset删除某个commit之后的代码,原理是Head向后退。有存在被回滚掉的commit分支代码合并过来时,被reset掉的代码仍然会合并上来

oh-my-zsh常用命令缩写全写对照表

缩写

全写

gst

gitstatus

gaa

gitadd.

gcmsg""

gitcommit-m""

gp

gitpush

glog

gitlog--oneline--decorate--graph

gl

gitpull

gf

gitfetch

gfa

gitfetch--all--prune

使用小技巧

如何修改默认指令的参数,比如,glog的decorate默认是short,我想指定glog的decorate为no,要怎么做?

glog--decorate=no

很赞哦!(167)