手机网站建设的费用,东莞建设工程质量网站,乐山旅游英文网站建设,网文网站排名大家好#xff0c;我是若川。今天分享一篇关于git的好文章。我自己经常用命令行终端和git缩写。具体可以看我以往的文章。使用 ohmyzsh 打造 windows、ubuntu、mac 系统高效终端命令行工具#xff0c;用过都说好。点击下方卡片关注我、加个星标学习源码整体架构系列、年度总结… 大家好我是若川。今天分享一篇关于git的好文章。我自己经常用命令行终端和git缩写。具体可以看我以往的文章。使用 ohmyzsh 打造 windows、ubuntu、mac 系统高效终端命令行工具用过都说好。点击下方卡片关注我、加个星标学习源码整体架构系列、年度总结、JS基础系列前言最近在网上有个真实发生的案例比较火说的是一个新入职的员工不会用 Git 拉代码第二天被开除。由此可见 Git 对我们工作的重要性无论是前端后端都是离不开 Git 的下面就让我们一探究竟吧。上面的案例引申出一个问题入职一家新公司你的 leader 给你分配了仓库的权限后如何配置本地的 Git 环境并拉取代码莫慌按照下面我讲的四个步骤走保证你可以顺利使用 Git 进行拉取代码下载 Git 下载地址 (https://git-scm.com/downloads) 选择自己系统对应的版本下载即可。在你的电脑上生成 ssh 秘钥打开终端执行 ssh-keygen -t rsa -C 你公司内部邮箱地址如果执行成功切换到 ~/.ssh 目录下此时目录应该如下所示。复制 id_rsa.pub 的内容。这里以 Github 为例如下图所示进入 settings - SSH and GPG keys 通过 cat 命令查看文件 id_rsa.pub 的内容然后复制过来点击 add ssh key这一步等于说把你的公钥放到了 Github 上进行托管。全局配置 Git 的用户名和邮箱git config --global user.name xxx
git config --global user.email xxxxx.com
完成以上四步你就可以愉快 pull 代码开发了。和 https 拉取方式不同的是https 方式需要每次提交前都手动输入用户名和密码ssh 的方式配置完毕后 Git 都会使用你本地的私钥和远程仓库的公钥进行验证是否是一对秘钥从而简化了操作流程。Git简介在介绍 Git 的相关操作前我觉得非常有必要了解 Git 的由来以及 Git 是用来解决什么问题的。Git读音为/gɪt/是一个开源的分布式版本控制系统可以有效、高速地处理从很小到非常大的项目版本管理。Linus Torvalds 这个人我相信大家都知道吧开源 Linux 系统的发明人。如今你看到的大部分服务器其实都是运行在 Linux 系统上令人感到称叹的是这位大神级别的程序员不仅创造了 Linux 系统。那 Linux 的代码是如何管理的呢2002年之前世界各地的志愿者把源代码文件通过 diff 的方式发给 Linus然后由 Linus 本人通过手工方式合并代码要知道当时的 Linux 的代码量已经很大了通过人工管理的方式一是容易出错二是效率低。于是 Linus 选择了一个商业的版本控制系统 BitKeeperBitKeeper 的东家 BitMover 公司出于人道主义精神授权 Linux 社区免费使用这个版本控制系统。最后出于某种原因BitMover 公司收回了 Linux 社区的免费使用权于是 Linus 花了两周时间自己用 C 语言写了一个分布式版本控制系统这就是 Git 的由来了。Git 的工作区域和流程要想弄懂 Git 是怎么对我们的代码进行管理的那首当其冲的是了解 Git 的工作区域是如何构成的。因为只有彻底弄懂了 Git 工作区域的构成你才可以在适当的区域使用合适的命令。如下图所示此图包含了 Git 的 4 个工作区和一些常见的操作。Workspace工作区就是平时进行开发改动的地方是当前看到最新的内容在开发的过程也就是对工作区的操作。Index暂存区当执行 git add 的命令后工作区的文件就会被移入暂存区暂存区标记了当前工作区中哪些内容是被 Git 管理的当完成某个需求或者功能后需要提交代码第一步就是通过 git add 先提交到暂存区。Repository本地仓库位于自己的电脑上通过 git commit 提交暂存区的内容会进入本地仓库。Remote远程仓库用来托管代码的服务器远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改本地仓库修改完代码后通过 git push 命令同步代码到远程仓库。一般来说Git 的工作流程分为以下几步在工作区开发添加修改文件。将修改后的文件放入暂存区。将暂存区域的文件提交到本地仓库。将本地仓库的修改推送到远程仓库。Git 基本操作git add添加文件到暂存区# 添加某个文件到暂存区后面可以跟多个文件以空格区分
git add xxx
# 添加当前更改的所有文件到暂存区。
git add .
git commit# 提交暂存的更改会新开编辑器进行编辑
git commit
# 提交暂存的更改并记录下备注
git commit -m you message
# 等同于 git add . git commit -m
git commit -am
# 对最近一次的提交的信息进行修改,此操作会修改 commit 的 hash 值
git commit --amend
git pull# 从远程仓库拉取代码并合并到本地可简写为 git pull 等同于 git fetch git merge
git pull 远程主机名 远程分支名:本地分支名
# 使用 rebase 的模式进行合并
git pull --rebase 远程主机名 远程分支名:本地分支名
git fetch与 git pull 不同的是 git fetch 操作仅仅只会拉取远程的更改不会自动进行 merge 操作。对你当前的代码没有影响# 获取远程仓库特定分支的更新
git fetch 远程主机名 分支名
# 获取远程仓库所有分支的更新
git fetch --all
git branch# 新建本地分支但不切换
git branch branch-name
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看本地和远程分支
git branch -a
# 删除本地分支
git branch -D branch-nane
# 重新命名分支
git branch -m old-branch-name new-branch-name
工作中使用 Git 解决问题的场景git rebase 让你的提交记录更加清晰可读git rebase 的使用rebase 翻译为变基他的作用和 merge 很相似用于把一个分支的修改合并到当前分支上。如下图所示下图介绍了经过 rebase 后提交历史的变化情况。现在我们来用一个例子来解释一下上面的过程。假设我们现在有 2 条分支一个为 master一个为 feature/1他们都基于初始的一个提交 add readme 进行检出分支之后master 分支增加了 3.js ,和 4.js 的文件分别进行了 2 次提交feature/1 也增加了 1.js 和 2.js 的文件分别对应以下 2 条提交记录。此时对应分支的提交记录如下。master 分支如下图feature/1 分支如下图结合起来看是这样的此时切换到 feature/1 分支下执行 git rebase master成功之后通过 git log 查看记录。如下图所示可以看到先是逐个应用了 mater 分支的更改然后以 master 分支最后的提交作为基点再逐个应用 feature/1 的每个更改。所以我们的提交记录就会非常清晰没有分叉上面演示的是比较顺利的情况但是大部分情况下rebase 的过程中会产生冲突的此时就需要手动解决冲突然后使用依次 git add 、git rebase --continue 的方式来处理冲突完成 rebase 的过程如果不想要某次 rebase 的结果那么需要使用 git rebase --skip 来跳过这次 rebase 操作。git merge 和 git rebase 的区别不同于 git rebase 的是git merge 在不是 fast-forward快速合并的情况下会产生一条额外的合并记录类似 Merge branch xxx into xxx 的一条提交信息。另外在解决冲突的时候用 merge 只需要解决一次冲突即可简单粗暴而用 rebase 的时候 需要依次解决每次的冲突才可以提交。git rebase 交互模式在开发中常会遇到在一个分支上产生了很多的无效的提交这种情况下使用 rebase 的交互式模式可以把已经发生的多次提交压缩成一次提交得到了一个干净的提交历史例如某个分支的提交历史情况如下进入交互式模式的方式是执行git rebase -i base-commit
参数 base-commit 就是指明操作的基点提交对象基于这个基点进行 rebase 的操作对于上述提交历史的例子我们要把最后的一个提交对象 ac18084 之前的提交压缩成一次提交我们需要执行的命令格式是git rebase -i ac18084
此时会进入一个 vim 的交互式页面编辑器列出的信息像下列这样。想要合并这一堆更改我们要使用 Squash 策略进行合并即把当前的 commit 和它的上一个 commit 内容进行合并 大概可以表示为下面这样在交互模式的 rebase 下至少保留一个 pick否则命令会执行失败。pick ... ...
s ... ...
s ... ...
s ... ...
修改文件后 按下 : 然后 wq 保存退出此时又会弹出一个编辑页面这个页面是用来编辑提交的信息修改为 feat: 更正最后保存一下接着使用 git branch 查看提交的 commit 信息rebase 后的提交记录如下图所示是不是清爽了很多rebase 操作可以让我们的提交历史变得更加清晰。特别注意只能在自己使用的 feature 分支上进行 rebase 操作不允许在集成分支上进行 rebase因为这种操作会修改集成分支的历史记录。使用 git cherry-pick 获取指定的 commitgit cherry-pick 可以理解为”挑拣”提交和 merge 合并一个分支的所有提交不同的是它会获取某一个分支的单笔提交并作为一个新的提交引入到你当前分支上。当我们需要在本地合入其他分支的提交时如果我们不想对整个分支进行合并而是只想将某一次提交合入到本地当前分支上那么就要使用 git cherry-pick 了。如下场景以下有三条分支feature/cherry-pick1 和 feature/cherry-pick2 都是基于 master 检出的两条功能性分支对应的分支 log 记录如下master 分支的提交如下现在 master 只需要 feature/cherry-pick1 和 feature/cherry-pick2 有关 change 的修改并不关心有关 fix 内容的修改。此时就可以用 cherry-pick 指令了。语法 git cherry-pick [commit-hash]commit-hash 表示的是某次 commit 的 hash 值。现在依次执行以下两条指令 git cherry-pick e0bb7f3、git cherry-pick c9a3101过程中如果出现冲突解决冲突后 进行 git add接着执行 git cherry-pick --continue最后master 上的提交如下此时master 分支上应用了需要的提交就达到了我们想要的效果。如果需要多个 cherry-pick 需要同步到目标分支可以简写为 git cherry-pick first-commit-id...last-commit-id这是一个左开右闭的区间也就时说 first-commit-id 提交带来的代码的改动不会被合并过去如果需要合并过去可以使用 git cherry-pick first-commit-id^...last-commit-id它表示包含 first-commit-id 到 last-commit-id 在内的提交都会被合并过去。使用 git revert 回滚某次的提交想象这么一个场景你的项目最近有2个版本要上线这两个版本还伴随着之前遗留的 bug 的修复一开始的时候你将 bug 修复在了第一个版本的 release 分支上突然在发版前一天测试那边反馈需要把第一个版本修复 bug 的内容改在第二个版本上这个时候第一个版本的集成分支的提交应该包括了第一个版本的功能内容遗留 bug 修复的提交和其他同事提交的内容想要通过 reset 的方式粗暴摘除之前的关于 bug 修复的 commit 肯定是不行的同时这种做法比较危险此时我们既不想破坏之前的提交记录又想撤回我们遗留 bug 的 commit 记录应该怎么做呢git revert 就派上了用场。git revert 撤销某次操作此操作不会修改原本的提交记录而是会新增一条提交记录来抵消某次操作。语法 git revert commit-id 针对普通 commitgit revert commit-id -m 针对 merge 的 commit下面就用一个案例来理解一下这个命令如下图所示假设被红框框起来的地方是会引起 bug 的一次提交在他的提交之后又进行了 2 次提交其中包含了其它同事的提交。此时想把引起提交的 bug 的干掉执行 git revert 1121932执行操作后再打开查看日志如下图所示可以看到是新增了一条 commit 记录这个 commit 的产生的 msg 是自动生成的Revert 开头后面跟撤回的 commit-msg 信息之前的 commit 记录并没有消失此时也达到了代码回退的效果此外 git revert 也可以回滚多次的提交语法git revert [commit-id1] [commit-id2] ... 注意这是一个前开后闭区间即不包括 commit1 但包括 commit2 。回滚我们的提交有二种方式一种是上文提到的git revert命令外还可以使用 git reset 命令那么它们两者有什么区别呢git revert 会新建一条 commit 信息来撤回之前的修改。git reset 会直接将提交记录退回到指定的 commit 上。对于个人的 feature 分支而言可以使用 git reset 来回退历史记录之后使用 git push --force 进行推送到远程但是如果是在多人协作的集成分支上不推荐直接使用 git reset 命令而是使用更加安全的 git revert 命令进行撤回提交。这样提交的历史记录不会被抹去可以安全的进行撤回。使用 git stash 来暂存文件会有这么一个场景现在你正在用你的 feature 分支上开发新功能。这时生产环境上出现了一个 bug 需要紧急修复但是你这部分代码还没开发完不想提交怎么办这个时候可以用 git stash 命令先把工作区已经修改的文件暂存起来然后切换到 hotfix 分支上进行 bug 的修复修复完成后切换回 feature 分支从堆栈中恢复刚刚保存的内容。基本命令如下git stash //把本地的改动暂存起来
git stash save message 执行存储时添加备注方便查找。
git stash pop // 应用最近一次暂存的修改并删除暂存的记录
git stash apply // 应用某个存储,但不会把存储从存储列表中删除默认使用第一个存储,即 stash{0}如果要使用其他个git stash apply stash{$num} 。
git stash list // 查看 stash 有哪些存储
git stash clear // 删除所有缓存的 stash
下面通过几幅图对 stash 的命令做进一步了解。此时我正在开发一个新功能修改了 1.js 文件里的内容还没开发完成这个时候我想切换到 hotfix 分支上修复 bug得暂停下开发切换到 hotfix 分支但是现在工作区还有内容此时如果切换分支 Git 会报出下面的错误error: Your local changes to the following files would be overwritten by checkout: 1.jsPlease commit your changes or stash them before you switch branches.Aborting
上面那句话的意思就是说工作区有文件修改不能提交需要先进行 commit 或者 stash 操作执行 git stash结果如下Saved working directory and index state WIP on stash: 22e561c feat: add 1.js
此时我们的工作区已经干净了可以切换到 hotfix 分支进行 bug 修复的工作假设我们现在 bug 修复完成了继续切回 feature 分支进行原本功能的开发此时只需要执行 git stash pop之前我们暂存的修改就会恢复到工作区如下图所示。当我们想要暂存文件切换分支做某些事的时候可以用 git stash 这种机制帮助开发。推荐在使用 stash 的相关命令时每一次暂存的时候不要直接使用 git stash 命令进行暂存下来而是使用 git stash save message... 这种方式给本次的提交做一个信息的记录。这样想应用更改的时候先通过 git stash list 查看一下所有的暂存列表。之后推荐使用 git stash apply stash${num} 的方式进行应用对应的 stash这样不会清空已有的 stash 的列表项并且能应用到当前的工作区不需要这个暂存的话再手动清除就可以了。不同的工作区域撤销更改开发中我们经常需要回退代码的操作在不同的工作区域中回退代码的方式也是不相同的。如下图所示假设现在要在 feature/revoke 分支上进行开发,首先通过 git status 查看下现在的状态。目前我们的工作区是很干净的没有任何修改的操作此时修改一下代码再次查看状态可以看到1.js 这个文件被修改了。现在我们想把 1.js 这个文件恢复到修改前的状态即撤回工作区的修改就可以使用 git checkout -- filename 的命令如果要撤回多个文件的修改文件之间使用空格隔开如下图所示我们撤回了 1.js 文件的修改工作区也恢复干净了。如果说现在我们对文件进行了修改并且已经提交到暂存区了这部分文件我们不想要的话那么就可以通过 git reset filename 的命令来对特定的文件进行撤销git reset 会撤回所有存在暂存区的文件如下图所示查看前后的状态可知文件最后成功撤回到工作区了。配置 git alias 提升工作效率一般我们在工作中接到开发任务后需要新创建一个分支进行开发 此时需要 用到 git branch、git checkout、 git pull 等命令在我们一顿操作后开发完成到了提交代码的阶段又要诸如此类 git add 、git commit、git push 等命令虽然简单但是输入起来也是不够简洁作为一个程序员开发程序就是为了提高我们的效率的懒是人类进步的源泉所以我们可以通过配置别名的方式简化这些命令。它的基本用法是 git config --global alias.简化的字符 原始命令如下面的例子$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
这里将 co 表示 checkoutci 表示 commitbr 表示 branch以后提交就可以简写成--global 是全局参数也就是配置一次后这些命令可以在这台电脑下的所有仓库都适用。这些命令其实是更新你全局的 .gitconfig 文件该文件用来保存全局的 git 配置vim ~/.gitconfig执行这段命令后显示如下下图展示了刚才通过 git config --global alias 添加的 alias。除了上面那种直接通过命令的方式外也可以通过修改这个文件的 alias 项来设置别名。这里分享一个我自己常用的别名设置把以下配置替换到 .gitconfig 文件里的 [alias] 所属的区域然后就可以愉快的使用了~[alias]
st status -sb
co checkout
br branch
mg merge
ci commit
ds diff --staged
dt difftool
mt mergetool
last log -1 HEAD
latest for-each-ref --sort-committerdate --format\%(committername)%(refname:short) [%(committerdate:short)] %(contents)\
ls log --prettyformat:\%C(yellow)%h %C(blue)%ad %C(red)%d %C(reset)%s %C(green)[%cn]\ --decorate --dateshort
hist log --prettyformat:\%C(yellow)%h %C(red)%d %C(reset)%s %C(green)[%an] %C(blue)%ad\ --topo-order --graph --dateshort
type cat-file -t
dump cat-file -p
lg log --color --graph --prettyformat:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset --abbrev-commit
这样我们每次想查看 Git 的历史记录,就不用输入那么一长串命令 直接使用 git lg 下图是 axios 源码里的提交记录使用封装后的 git lg 查看的效果图分支之间的关系一眼就很明了在哪个 commit 上进行的 merge 操作也很清晰可以帮助我们很好的追溯历史的提交和解决问题。总结本文由浅入深的的讲解了 Git 的环境搭建基本用法以及工作中使用较为高频的 Git 命令的用法无论你是前端后端还是其它端的开发日常工作中少不了对 Git 的使用我们不仅要会用还要用的漂亮用的灵活用的稳健。这样才能在和同事协作项目的时候更加得心应手学会了本文这些 Git 的使用技巧后在日常工作中多多练习相信会给你带来很大的收获参考文献阮一峰的git教程 (https://www.ruanyifeng.com/blog/2014/06/git_remote.html)Git merge和rebase分支合并命令的区别 (https://juejin.cn/post/6844903603694469134#heading-3)最近组建了一个湖南人的前端交流群如果你是湖南人可以加我微信 ruochuan12 拉你进群。今日话题略。欢迎分享、收藏、点赞、在看我的公众号文章~一个愿景是帮助5年内前端人成长的公众号可加我个人微信 ruochuan12长期交流学习推荐阅读我在阿里招前端该怎么帮你可进面试群2年前端经验做的项目没技术含量怎么办点击上方卡片关注我、加个星标················· 若川简介 ·················你好我是若川毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》多篇在知乎、掘金收获超百万阅读。从2014年起每年都会写一篇年度总结已经写了7篇点击查看年度总结。同时活跃在知乎若川掘金若川。致力于分享前端开发经验愿景帮助5年内前端人走向前列。