刚毕业的时候用过极短时间的 SVN,前面就始终在用 Git 来做代码的版本控制了,前前后后差不多 4 年的工夫,期间做了一些在应用 Git 过程中的记录和心得,在这里分享给大家,大家或者能够从中排汇到一些有用的货色。
无论是 github,还是 gitlab,还是其余的代码托管平台,代码治理都是用 git 去做的,git 能够说是一名程序员的必备技能,对于工作和面试都是十分有帮忙的。
- Git 常用命令
- 优雅应用 Git 的一些实际
- oh-my-zsh 常用命令
Git 常用命令
- git 克隆近程分支仓库:
git clone -b 分支名称 近程地址
git 克隆近程仓库我的项目时如果不指定分支,只会克隆默认分支的内容。 - 查看 git 用户名和明码
git config user.name
git config user.email
- 分支相干
git branch(查看以后分支)
git branch -a(查看所有分支)
git checkout 分支名(切换到对应分支)
会主动将代码更新为分支代码git branch 分支名
(创立一个分支)git branch -d 分支名
(删除一个分支)git branch -D 分支名
(强制删除一个未合并的分支)git checkout -b 分支名 [基于的分支名或 commit 值]
(切换分支并间接切换过来) - 查看 git 历史
history
- 依照关键词搜寻 git 历史
history | grep push
- 查看 commit 历史
git log
git log --summary
- 设置 git 账号
git config --global user.name "Frankkai"
git config --global user.email "gaokai20100801@gmail.com"
git config user.name "Frankkai"
git config user.email "gaokai20100801@gmail.com"
- 查看 git 账号
git config --global --list
git config --local --list
- 仅仅查看某一项的配置
git config --local user.name
- 回滚本次批改
git reset HEAD static/lib/js/constantsUrl.js
git checkout -- static/lib/js/constantsUrl.js
- 查看本次批改的代码
git diff
git diff HEAD
git diff --staged
- 提交后发现丢了几个文件没有提交
发现丢了批改记录,从新增加git add "*.html"
从新提交,最终只有一个提交git commit --amend
- 缓存某种后缀的文件
git add "*.js"
- 革除缓存区中的文件
git reset octofamily/octodog.txt
- 彻底删除某种后缀的文件
git rm "*.txt"
- 合并分支到 master
git merge 分支名
- add . 之前勾销提交某些文件
git checkout -- <filename>
- 藏代码到脏目录(实用于其余成员批改了雷同分支代码,但又不想提交)
git stash
- 开释脏目录代码
git stash pop
- 开释指定脏目录代码
git stash pop stash@{0}
- 删除近程分支(此分支必须是非默认分支)
git push origin --delete branchname
- 曾经 commit,强制回退到旧版本
git log
// 找到 commit hash 值git reset --hard hash 值
- 查看 stash 目录
git stash list
- 删除某一个 stash
git stash drop stash@{0}
- 设置近程仓库地址
git remote set-url origin git@foo.bar.com:baz/helloworld.git
- 本地创立了新分支,然而 orgin 没有,push 代码前
git push --set-upstream origin preproduction
- 指定 tag 到近程
git push origin <tag_name>
- 将全副 tag 打到近程
git push --tags
- 查看以后 tags
git tag --list
- 仅仅删除 index 不删除 working tree 上的.idea 文件
git rm --cached -r .idea
// –cached 仅仅删除 index,-r(recursive)递归删除.idea 目录下的所有文件 - git 被动 track 文件,管制文件,做好提交筹备
git add <file(s)>/.
- git unstage 文件,开释文件,选择性管制
git reset HEAD <file(s)>/.
- 暂存区文件如何笼罩工作目录文件
git reset HEAD <file(s)>/. && git checkout -- <file(s)>/.
- 提交曾经被 git 治理的,modified 为红色的所有文件
git add -u
- 重置工作区和暂存区的所有文件为原始状态
git reset --hard
- 比拟以后分支与某次提交的区别
git diff HEAD [commit hash fragment]
- 删除一个分支
git branch -D [branch name]
-
同步到 remote 后,合并多个 commit 为 1 个
git rebase -i HEAD~2/hash pick && squash :wq!
- 查看我的项目的 origin 代表的地址
git remote -v
- pick 中途误退出
git rebase --abort
- 未同步到 remote,从新提交
reset soft
-
gitflow release 公布新版本
git flow release start v0.5.0 npm version minor git flow release finish -n git push git checkout master git push
-
gitflow hotfix 修复一个 master 上的 bug
git flow hotfix start foo npm version patch // 留神:肯定要在修复 bug 代码之前新增版本号 git add . git commit -m "version change message" git flow hotfix finish -n git push git checkout master git push
-
比照 2 个分支的日志
git log develop..master
-
合并 master 代码到 feature
git checkout feature git merge master
git merge master feature
-
git rebase 抵触时怎么办
resolve conficts git add . git rebase --continue
-
squash 多个 commits 成一个怎么敲?
假如 merge feature 到 master。git checkout master git merge --squash feature git commit -m "这是一次 squash commit" git push
-
查看以后分支的父分支
git reflog show <childBranch> 32c3956 (HEAD -> currentBranch, origin/fatherBranch, fatherBranch, list) childBranch@{0}: branch: Created from fatherBranch
childBranch 是你新建的分支。
fatherBranch 是它的父分支,也就是起源分支。 -
撤销近程分支谬误提交
...reset git push --force
其实应用本地分支的提交代替近程分支。
-
误删除当先近程的本地分支如何复原?
git reflog // 找出最新的 commit sha1 值,HEAD@{1}比 HEAD@{2}新 git branch branchName <sha1>
通过 git reflog 找到一个 commit,而后再 cherry-pick 也能够。
-
删除由 npm version patch/minor/major 误增加的 tag
git tag | grep v1.1.38 git tag -d v1.1.38 git push origin :refs/tags/v1.1.38
-
git fetch 与 git pull 的区别
git fetch 更新 origin/* 下的所有分支,在公布 git flow feature 前很有用,用于更新 remote 分支。git pull 次要用来更新多人单干的以后分支,多用于更新 local 分支。
https://www.git-tower.com/lea…
-
近程分支删除,本地 git fetch 不能更新到最新分支
git fetch --prune
–prune
Before fetching, remove any remote-tracking references that no longer exist on the remote. -
及时查看本地所有分支的状态
git remote show origin
-
如果近程已不存在这个分支,git fetch –prune 也更新不到状态,该怎么办?
git push origin --delete feature/fix-chat-unread-msg-async
-
删除单个脱离的近程分支
git remote prune <name>
- 勾销一次合并(merge)
git merge --abort
- 回退一次 commit
git revert Head/[commit hash]
优雅应用 Git 的一些实际
- windows 下 gitbash 反对中文输出:
1)鼠标左键点击左上角 git 的 logo
2)找到 options 并且切换到 text 目录,将 Character set 设置为 UTF-8 - 生成 ssh-key
ssh-keygen -t rsa -C "gaokai20100801@qq.com"
- windows 查看 ssh-key
/c/Users/frank/.ssh/id_rsa.pub
- mac/linux 查看 ssh-key
cd ~/.ssh
ls
cat id_rsa.pub
- git flow
https://danielkummer.github.i… -
误删除 stash,该怎么办?
git fsck --unreachable | grep commit | cut -d\ -f3 | xargs git log --merges --no-walk --grep=WIP
找到对应的 commit hash 值
git stash apply 1f55da93d26cd51f15f9e93351dae6b75e25e36f
-
.idea 批改总是会揭示,.gitignore 不失效
.idea/
git rm -r --cached .idea
- Git 中的 origin 是什么?
origin 是一个变量,代表着一个 git 仓库地址。能够应用git remote -v
查看 origin 代表的地址。 -
Git 的 system,global 和 local 参数别离代表什么?
--system 能够输入很多 git 的零碎设置,其中最有用的是 alias,例如 git s 代表了 git status,零碎所有登录用户有用。--global 输入了 git 的全局设置,次要包含全局的 user.name 和 user.email,优先级低于单个仓库中设置的 user.name 和 user.email,以后用户所有仓库有用。--local 输入了 git 的我的项目设置,次要包含 remote.origin.url 以及 gitflow 的很多配置,只对某个仓库有用。
-
Git 工作区和暂存区的区别?
add commit 工作目录 ----> 暂存区 ----> 版本历史
暂存区:git 曾经取得了对文件的管理权限,暂存区文件有状态:new file,deleted,modified 等等。
版本历史:git log 查看每一次 commit 记录。
意外播种:
若是想十分细粒度的管制 commit 记录,能够应用 git add 指定文件,离开屡次 commit,每一次 commit 提交一个细粒度性能的变更文件汇合,屡次走文件目录 暂存区 版本历史这个流程。
-
Git 如何重命名文件?
git mv README.md readme.md
- Git 的 working tree 和 index 是什么意思?
index 指的是 git 索引,能够了解成 git 有文件的一个复制,仅删除 index 则仅删除存在于 git 中的文件。
working tree 则是指操作系统的工作树,也就是操作系统的磁盘上存储的文件。
举两个罕用的例子: - 仅删除 git index 中的文件,.idea 等 IDE 暗藏的工作树文件是不能删除的:–cached
git rm --cached -r .idea // **--cached 仅仅删除 index**,-r(recursive)递归删除.idea 目录下的所有文件
- 删除 index 和 working tree 上的文件,恩断义绝
git rm
删除 index 上和 working tree 上的文件,
仅仅删除 working tree 不删除 index 的状况,不存在。
- nothing to commit 和 working tree clean?
暂存区没有能够提交到版本历史的内容。
工作区也是洁净的。 -
如何高深莫测地区分出工作区和暂存区?
- Your branch is ahead of ‘origin/master’ by 1 commit 版本历史
- Changes to be committed 暂存区
- Untracked files 工作区
// 版本历史 Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) // 暂存区 Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: readme.md -> README.md new file: helloman // 工作区 Untracked files: (use "git add <file>..." to include in what will be committed) hi
- 如何更加优雅地查看日志?
git log --oneline
简洁的 commit 记录git log -n2 --oneline
最近的 2 次简洁的 commit 记录git log --all
所有分支的历史版本信息git log --graph
图形化查看版本演进历史git log --oneline --all -n4 --graph
组合查看日志 - 如何疾速定位到 git 的命令文档?
git help --web log
浏览器查看git log
的用法 - git 自带的图形化界面怎么看?
gitk
无需装置第三方插件,在纯命令行下,无第三方软件状况下可用。 - git 里的作者和提交人不一样吗?
作者是代码的生成者,是为了版权保护。 - 神秘的.git 目录
HEAD
工作分支 refs/heads/fooconfig
repo 的配置信息refs
heads,分支;tags,标签或者里程碑refs/heads/master
寄存了什么,最新的一个 commitrefs/tags/js01
寄存了什么,最新的一个 tag,蕴含一个 objectobjects
文件夹,2 个字符的和涣散的 pack 文件夹,寄存的是 tree,tree 下有 blob 文件
能够间接通过 vim 批改 HEAD,config 等信息,和命令的作用是雷同的。 -
如何判断 git 文件的类型?
git cat-file -t/-p [hash fragment]
// -t 类型,-p 内容
只有任何文件的文件内容雷同,在 git 眼里,它就是惟一的一个 blob。commit tree // 位于 objects 目录下 blob // 位于 objects 目录的二级目录下,具体的文件
- tree, commit, blob 的区别?
commit:一个 commit 必定会对应一棵树,蕴含了根 tree,author,committer,parent 等等一个 commit 对象的信息。
tree:取出一个 commit,寄存了一个快照,这个快照,对应了以后我的项目的所有的文件夹及其文件的快照,是特定工夫的整个仓库的一个状态;树里能够有 blob,也能够有树,因为树是文件夹;根树是最大的树。
blob: 与文件名是否雷同无关,只有内容雷同,就是惟一的 blob。
-
一个 commit 蕴含了哪些?
git cat-file -p [commit hash fragment]
蕴含 tree,parent,author 和 commiter。
tree f06f7f36af17cb9098031c66d22a7910c0fa1bac parent 92a55c8a5b1d38d224232ad84b9b728ae77189cb parent eda632a1f2a3ea049c5f5268f6b2f064b71898ce author FrankKai <gaokai20100801@gmail.com> 1548139120 +0800 committer FrankKai <gaokai20100801@gmail.com> 1548139120 +0800 Merge branch 'feature/chatBreakChange' into prerelease # Conflicts: # src/api/chat.js
-
一个 tree 蕴含了哪些?
git cat-file -p [tree hash fragment]
蕴含 tree,blob。
- blob 015aaf344153ed7822069b2a98898b7d7a215b0d .babelrc
- blob 9d08a1a828a3bd2d60de3952744df29f9add27fa .editorconfig
- blob 080140b833db5b758b1eb869a269f4bbb068a19e .eslintignore
- blob 8f777c376c0314e480f9bbba273d4902810bcb11 .eslintrc.js
- blob 895e844218637929546ed2295ae90f991ceb5d38 .gitignore
- blob db7b635d23657349dbe4c33cc353ef4efd8ca960 .npmrc
- blob 797e871f4b8c0a3071e8b6ab2cc40b804cd2971c .postcssrc.js
- blob d3983c1d6a5525aae58b823448723434ca83ceed .prettierrc
- blob 93cc7473ab066204f3329221111a945e2dc83576 BUS.md
- blob defc3d9914d1af08e6670b96995261bfe1fb61a6 CHANGELOG.md
- blob bfd46fd4008cbe7103181fc5cd64392a74426e96 MQTT.md
- blob abdb55935d833dd4f4b79475aa7d63ffcb0cc9cd README.md
- tree f1f80f844bb80389826198a15ec0f224a53525f8 build
- blob 2aefa3130f4ff753b5c3e538db53b9b186f12540 index.html
- blob 967b8f243420a9a8a07b8f429f0a7ba874a834ad package-lock.json
- blob 35d9fa46f569395b25a87daef4820de42d071831 package.json
- tree f6bdc675a8f9af805867b5a19c263e5bbfe4c26c src
- tree 09e231414b91779326447a0c8d5b3421aa2308c2 static
- tree ad94369cfdd2038a552e44fc0abbd1738113b5e6 test
-
blob 0b96f21c27a3759cecde02fba1e050d86a8e9a54 yarn.lock
-
一个 blob 蕴含了哪些?
git cat-file -p [tree hash fragment]
就是一个具体的文件。
- detached HEAD 是什么?
拆散头指针。git checkout [commit hash fragment]
,切换到拆散头指针状态,不与任何 branch 或 tag 关联,git 会认为这是不重要的,当成垃圾清理掉。
毛病:切换分支后,须要用 git branch [branch name] [commit hash fragment]
新建一个分支,否则会失落原音讯。
长处:能够基于某一次 commit 切出分支,而后新建一个 commit,疾速会退到想要的版本。
- HEAD 能够指向什么?
它位于.git/HEAD。
能够指向分支或者 commit,但其实分支归根结底还是指向了 commit。
git log 查看 HEAD 指针指向的分支名:(HEAD->foo, bar, master)
能够疾速 diff,git diff HEAD [commit hash fragment]
。
父亲的父亲 diff:git diff HEAD HEAD~2
,git diff HEAD HEAD^^
。
- 如何批改最新一次 commit 的 message?
git commit --amend
留神:不能在团队的集成分支上,做这样的变更,仅实用于本地。 -
如何批改老旧 commit 的 message?
git rebase -i [父 commit hash fragment] reward 增加批改后的 commit message
留神:不能在团队的集成分支上,做这样的变更,仅实用于本地。
- git stash pop stash@{n}还能做什么操作?
以后分支的本地代码未提交的状况下,pull 了当先的近程分支代码,此时近程代码会笼罩本地代码。
git 比拟聪慧,它不会齐全将本地的代码扔掉,即便没有人为的生成一次 commit 记录,也会主动为咱们在 stash 下生成一次记录,免得造成重大的代码失落。
- gitflow 模式下,如何标准版本公布?
版本号降级 | gitflow 对应 |
---|---|
bug -> patch | hotfix |
feature->minor | release |
零碎重构 ->major | release |
然而在 scrum 的状况下,迭代十分疾速,若所有 feature 都降级 minor,会导致 minor 数字很大,该怎么解决这种状况?
只降级 minor 时,在 commit 提交信息中,增加以下信息:
类型 | 提交信息 |
---|---|
bug patch | [bug patch] |
feature patch | [feature patch |
-
创立一个新的我的项目并上传到 git
git init git ac git remote add origin remote repository URL
-
git 参数 –decorate 是什么?
- 有 short,full,auto,no 几种值,–decorate=short
- 打印出 commit 的 ref name。
- short 时,ref name 前缀 refs/head,refs/tags/ 和 refs/remotes 不会打印
- full 时,残缺前缀会被打印
- auto 时,如果输入是一个终端,会依照 short 的形式打印;非终端会显示全副
- no 时,会暗藏 HEAD 和 tag 等等 refs 信息
- 默认值是 short
- cherry pick 是什么?
如何了解 git cherry pick? -
清空所有本地 git 缓存
git rm -r --cache .
- error Command “husky-run” not found
rm -rf .git/hooks/ -
一次残缺的 rebase 流程
- git checkout feature
- git rebase master
- resolve conflicts
- git add .
-
git rebase –continue
- git revert 和 git reset 的区别
git revert 生成一个新的 commit 的形式回滚到上一个或者指定 commit 版本的代码,原理是 Head 继续前进。有存在被回滚掉的 commit 分支代码合并过去时,代码失常被合并
git reset 删除某个 commit 之后的代码,原理是 Head 向后退。有存在被回滚掉的 commit 分支代码合并过去时,被 reset 掉的代码依然会合并上来
oh-my-zsh 常用命令
缩写全写对照表
缩写 | 全写 |
---|---|
gst | git status |
gaa | git add . |
gcmsg “” | git commit -m “” |
gp | git push |
glog | git log –oneline –decorate –graph |
gl | git pull |
gf | git fetch |
gfa | git fetch –all –prune |
应用小技巧
- 如何批改默认指令的参数,比方,glog 的 decorate 默认是 short,我想指定 glog 的 decorate 为 no,要怎么做?
glog --decorate=no
期待和大家交换,共同进步:
- 微信公众号:大大大前端 / excellent_developers
- Github 博客: 趁你还年老 233 的集体博客
- SegmentFault 专栏:趁你还年老,做个优良的前端工程师
致力成为优良前端工程师!