1. 首页
  2. IT资讯

花 20 分钟,再来梳理一下 Git 基础知识

“u003Cpu003EJava后端,选择“”u003Cu002Fpu003Eu003Cpu003E优质文章,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRcsUnd92eoboDR” img_width=”640″ img_height=”29″ alt=”花 20 分钟,再来梳理一下 Git 基础知识” inline=”0″u003Eu003Cpu003E作者 | 你喜欢吃青椒么u003Cu002Fpu003Eu003Cpu003E来源 | juejin.imu002Fpostu002F5d157bf3f265da1bcc1954e6u003Cu002Fpu003Eu003Cpu003E上篇 | 在 Spring Boot 中,如何干掉 if elseu003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E前言u003Cu002Fh1u003Eu003Cpu003E本文是参考廖雪峰老师的Git资料再u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-5″u003E加上u003Cu002Fiu003E我自己对Git的理解,记录我的Git学习历程,作下此文是为以后学习,工作,开发中如果遇到问题可以回过头来参考参考。因为水平有限,难免会有出错的地方,欢迎指正。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003EGit是什么u003Cu002Fh1u003Eu003Cpu003E官方话:Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。u003Cu002Fpu003Eu003Cpu003E引用廖雪峰老师的话,它能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E为什么要学习Gitu003Cu002Fh1u003Eu003Culu003Eu003Cliu003Eu003Cpu003E面试要被问。可以应付面试。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E很多公司开发都用Git来处理项目。现在不学,以后肯定还要学。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E在我看来Git是现如今所有程序员都要掌握的,以后与同事共同开发项目必定要用到的,熟练掌握Git命令,可以提高开发的效率。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E安装Gitu003Cu002Fh1u003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003EWindowsu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E直接在官网上去u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E下载u003Cu002Fiu003E。u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E下载u003Cu002Fiu003E完成后,随便在某个文件下右键如果有Git Bash Here就安装成功。安装后,还要在命令行输入u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E$git config –global user.name “你的名字”u003Cu002Fcodeu003Eu003Ccodeu003E$git config –global user.email “你的邮箱”u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eglobal表示全局,这台机器所有的Git仓库都会使用这个配置。允许单个仓库使用其他的名字和邮箱。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003EMacu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cblockquoteu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003EMac也可以像Windows一样,按上面的步骤安装。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E也可以直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E仓库u003Cu002Fh1u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FRdXNPs8BiRxAWw” img_width=”640″ img_height=”321″ alt=”花 20 分钟,再来梳理一下 Git 基础知识” inline=”0″u003Eu003Cpu003E本地仓库是对于远程仓库而言的。本地仓库 = 工作区 + 版本区。u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E工作区即磁盘上的文件集合。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E版本区(版本库)即.git文件。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E版本库 = 暂存区(stage) + 分支(master) + 指针Head。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E以我使用最频繁的git命令为例,即提交到github为例。u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit init 原本本地仓库只包含着工作区,这是最常见的工作状态。此时,git init一下,表示在本地区域创建了一个.git文件,版本区建立。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit add . 表示把工作区的所有文件全部提交到版本区里面的暂存区u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E当然你也可以通过 git add .u002Fxxxu002F 一条一条分批添加到暂存区。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit commit -m “xxx” 把暂存区的所有文件提交到仓库区,暂存区空空荡荡。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit remote add origin https:u002Fu002Fgithubu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fnameu002Fname_cangku.git 把本地仓库与远程仓库连接起来。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push -u origin master 把仓库区的文件提交到远程仓库里。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。会有这样的信息nothing to commit, working tree cleanu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E提交到GitHubu003Cu002Fh1u003Eu003Cpu003E以前不熟悉git命令的时候,我提交项目到github上都是直接在网页上直接拉取文件提交上去的。有点羞耻。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdXNPsSF9mJqXv” img_width=”1080″ img_height=”462″ alt=”花 20 分钟,再来梳理一下 Git 基础知识” inline=”0″u003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit init .初始化,表示把这个文件变成Git可以管理的仓库。初始化后打开隐藏的文件可以看到有一个.git文件。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit add . 后面的一个点表示把这个文件全部提交到暂存区。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit add .u002Freadme.mdu002F 表示把这个文件下面的readme.md文件提交到暂存区。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit commit -m “你要评论一点什么东西” git commit的意思是把暂存区的全部文件提交到本地仓库。-m后接评论。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit remote add origin https:u002Fu002Fgithubu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fnameu002Fname_cangku.git表示把你本地的仓库与GitHub上的远程仓库连接起来。只需要连接一次,以后提交的时候就可以不用谢这条命令了。name是你的github名字,name_cangku是你的仓库名。注意不要把后面的.git给漏掉了。因为我前面就是这么走过来的,绕了很多弯路。至于如何在GitHub上新建仓库,网上有很多教程,这里不再赘述了。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push -u origin master 把本地仓库提交到远程仓库。(最后一步)在你的远程仓库上刷新一下就可以看到你提交的文件了。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E最后提到的是,在git commit -m “”之前,可以重复git add到暂存区。但是git commit会把你之前存放在暂存区的全部文件一次性全部提交到本地仓库。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E版本的回溯与前进u003Cu002Fh1u003Eu003Cpu003E提交一个文件,有时候我们会提交很多次,在提交历史中,这样就产生了不同的版本。每次提交,Git会把他们串成一条时间线。如何回溯到我们提交的上一个版本,用git reset –hard + 版本号即可。版本号可以用git log来查看,每一次的版本都会产生不一样的版本号。u003Cu002Fpu003Eu003Cpu003E回溯之后,git log查看一下发现离我们最近的那个版本已经不见了。但是我还想要前进到最近的版本应该如何?只要git reset –hard + 版本号就行。退一步来讲,虽然我们可以通过git reset –hard + 版本号,靠记住版本号来可以在不同的版本之间来回穿梭。u003Cu002Fpu003Eu003Cpu003E但是,有时候把版本号弄丢了怎么办?git reflog帮你记录了每一次的命令,这样就可以找到版本号了,这样你又可以通过git reset来版本穿梭了。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E撤销u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E场景1:u003Cu002Fstrongu003E在工作区时,你修改了一个东西,你想撤销修改,git checkout — file。廖雪峰老师指出撤销修改就回到和版本库一模一样的状态,即用版本库里的版本替换工作区的版本。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E场景2:u003Cu002Fstrongu003E你修改了一个内容,并且已经git add到暂存区了。想撤销怎么办?回溯版本,git reset –hard + 版本号,再git checkout — file,替换工作区的版本。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E场景3:u003Cu002Fstrongu003E你修改了一个内容,并且已经git commit到了master。跟场景2一样,版本回溯,再进行撤销。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E删除u003Cu002Fh1u003Eu003Cpu003E如果你git add一个文件到暂存区,然后在工作区又把文件删除了,Git会知道你删除了文件。如果你要把版本库里的文件删除,git rm 并且git commit -m “xxx”.u003Cu002Fpu003Eu003Cpu003E如果你误删了工作区的文件,怎么办?使用撤销命令,git checkout –u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E分支u003Cu002Fh1u003Eu003Cpu003E分支,就像平行宇宙,廖雪峰老师如是说。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。用 Git 和 Github 提高效率的 10 个技巧!这篇也推荐看下。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E创建与合并分支u003Cu002Fh2u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRdXNPsl5jordR7″ img_width=”553″ img_height=”291″ alt=”花 20 分钟,再来梳理一下 Git 基础知识” inline=”0″u003Eu003Cpu003E在没有其他分支插进来时,只有一个master主分支。每次你git push -u origin master 提交就是增加一条时间轴,master也会跟着移动。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FRdXNPt671VsJKb” img_width=”640″ img_height=”355″ alt=”花 20 分钟,再来梳理一下 Git 基础知识” inline=”0″u003Eu003Cpu003E创建一个other的分支,通过other提交,虽然时间轴向前走了,但是主分支master还在原来的位置。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FRdXNQOo19yOCvW” img_width=”640″ img_height=”340″ alt=”花 20 分钟,再来梳理一下 Git 基础知识” inline=”0″u003Eu003Cpu003E理论分析完,看一下命令怎么写。u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E创建分支other,切换到other分支。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Egit branch otheru003Cu002Fcodeu003Eu003Ccodeu003Egit checkout otheru003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E查看当前所有分支u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cpreu003Eu003Ccodeu003Egit branchu003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpreu003Eu003Cdivu003Eu003Cpreu003Eu003Ccodeu003E* otheru003Cu002Fcodeu003Eu003Ccodeu003E masteru003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpu003E当前的分支会有一个*u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E用other提交u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cpreu003Eu003Ccodeu003Egit add .u002Fxxxu002Fu003Cu002Fcodeu003Eu003Ccodeu003Egit commit -m “xxx”u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003Eother分支完成,切换回masteru003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cpreu003Eu003Ccodeu003Egit checkout masteru003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpu003E此时,master分支上并没有other的文件,因为分支还没有合并。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E合并分支u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cpreu003Eu003Ccodeu003Egit merge otheru003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpu003E合并完成之后,就可以在master分支上查看到文件了。u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span” class=”highlight-text”u003E删除other分支u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cpreu003Eu003Ccodeu003Egit branch -d otheru003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpu003E我由此想到,在以后工作中,应该是一个开放小组共同开发一个项目,组长会创建很多分支,每一个分支可以交给一个人去开发某一个功能,一个小组共同开发而且不会相互干扰。谁的功能完成了,可以由组长合并一下完成了的分支。哦,完美!u003Cemu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E关注u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E微信u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E公众号u003Cu002Fiu003E Java后端 获取更多推送。u003Cu002Femu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E解决合并分支问题u003Cu002Fh1u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdXNQP5ALnjTVa” img_width=”610″ img_height=”393″ alt=”花 20 分钟,再来梳理一下 Git 基础知识” inline=”0″u003Eu003Cpu003E假如有这样一种情况,分支other已经commit了,但是此时指针指回master时,并且master没有合并,而是git add u002F commit 提交了。这样,就产生了冲突,主分支master文件内容与other分支的内容不一样。合并不起来!所以,u003Cu002Fpu003Eu003Cpu003E修改文件的内容,让其保持一致。u003Cu002Fpu003Eu003Cpu003Egit add git commit 提交。u003Cu002Fpu003Eu003Cpu003E分支合并了。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRdXNQPICU0RZ7t” img_width=”640″ img_height=”339″ alt=”花 20 分钟,再来梳理一下 Git 基础知识” inline=”0″u003Eu003Cpu003Egit log –graph 查看分支合并图u003Cu002Fpu003Eu003Cpu003Egit branch -d other 删除分支,任务结束。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E分支管理策略u003Cu002Fh1u003Eu003Cpu003Egit merge –no-ff other 禁用Fast forward模式,因为使用Fast forward模式,删除分支后,分支历史信息会丢失。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003EBUG分支u003Cu002Fh2u003Eu003Cblockquoteu003Eu003Cdivu003Eu003Cblockquote toutiao-origin=”span”u003E廖雪峰老师提到,工作中每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。u003Cu002Fblockquoteu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003E但如果你手上有分支在工作中,你的上级要你改另外的分支的BUG。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cbru003Eu003Cdivu003Eu003Cblockquote toutiao-origin=”span”u003E你要把现在正在工作的分支保存下来,git stash,把当前工作现场“存储”起来,等以后恢复后继续工作。u003Cu002Fblockquoteu003Eu003Cblockquote toutiao-origin=”span”u003E当你解决BUG后,git checkout other回到自己的分支。u003Cu002Fblockquoteu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003E用git stash list查看你刚刚“存放”起来的工作去哪里了。u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cu002Fblockquoteu003Eu003Cpu003E此时你要恢复工作:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit stash u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Ely恢复却不删除stash内容,git stash drop删除stash内容。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit stash pop恢复的同时把stash内容也删了.u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E此时,用git stash list查看,看不到任何stash 内容。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E总结:u003Cu002Fstrongu003Eu003Cstrongu003E修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E删除分支u003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit branch -d + 分支有可能会删除失败,因为Git会保护没有被合并的分支。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit branch -D + 分支 强行删除,丢弃没被合并的分支。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E多人协作u003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit remote 查看远程库的信息,会显示origin,远程仓库默认名称为originu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit remote -v显示更详细的信息u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push -u origin master推送master分支到origin远程仓库。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push -u origin other 推送other到origin远程仓库。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E抓取分支u003Cu002Fh2u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRdXNQPVITP9E6A” img_width=”520″ img_height=”313″ alt=”花 20 分钟,再来梳理一下 Git 基础知识” inline=”0″u003Eu003Cpu003E产生上图的冲突时,u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit pull 把最新的提交从远程仓库中抓取下来,在本地合并,解决冲突。在进行git pullu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E如果git pull 也失败了,还要指定分支之间的链接,这一步Git会提醒你怎么做。然后再git pull。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E廖雪峰老师的总结:多人协作的工作模式通常是这样:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E首先,可以试图用git push origin u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E如果合并有冲突,则解决冲突,并在本地提交;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E没有冲突或者解决掉冲突后,再用git push origin u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream-to u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003ERebaseu003Cu002Fh2u003Eu003Cpu003Egit rebase 把分叉的提交历史“整理”成一条直线,看上去更直观.缺点是本地的分叉提交已经被修改过了。u003Cu002Fpu003Eu003Cpu003E最后在进行git push -u origin masteru003Cu002Fpu003Eu003Cpu003Erebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E标签管理u003Cu002Fh1u003Eu003Cpu003E比如一个u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003EAPPu003Cu002Fiu003E要上线,通常在版本库中打一个标签(tag),这样,就确定了打标签的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。u003Cemu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E关注u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E微信u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E公众号u003Cu002Fiu003E Java后端 获取更多推送。u003Cu002Femu003Eu003Cu002Fpu003Eu003Cpu003EGit的标签虽然是版本库的快照,但其实它就是指向某个commit的指针。u003Cu002Fpu003Eu003Cpu003Etag其实就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。比如tag v2.1就是把历史上的一个版本的东西叫做v2.1u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E创建标签u003Cu002Fh2u003Eu003Cpu003E步骤:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit branch查看当前分支,git checkout master切换到master分支。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit tag <name> 打标签,默认为HEAD。比如git tag v1.0u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E默认标签是打在最新提交的commit上的。如果想要打标签在以前的commit上,要git log找到历史提交的commit id.u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E如果一个commt id是du2n2d9,执行git tag v1.0 du2n2d9就把这个版本打上了v1.0的标签了。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit tag 查看所有标签,可以知道历史版本的tagu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E标签不是按时间顺序列出,而是按字母排序的。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit show <tagname> 查看标签信息。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit tag -a <标签名> -m “<说明>”,创建带说明的标签。-a指定标签名,-m指定说明文字。用show可以查看说明。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E操作标签u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit tag -d v1.0 删除标签。因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push origin <tagname> 推送某个标签到远程u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push origin –tags 一次性推送全部尚未推送到远程的本地标签u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E如果标签推送到远程。git tag -d v1.0 先删除本地标签v1.0。git push origin :refsu002Ftagsu002Fv1.0删除远程标签v1.0u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E自定义Gitu003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit config –global color.ui true让Git显示颜色,会让命令输出看起来更醒目u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E忽略特殊文件 创建一个.gitignore文件,把需要忽略的文件名填进去。Git就会自动忽略这些文件。我也在学习中遇到过这样的问题,比如node_modules文件就可以忽略。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cblockquoteu003Eu003Cpu003E忽略文件原则:忽略操作系统自动生成的文件,比如缩略图等;忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;忽略你自己的带有u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-5″u003E敏感u003Cu002Fiu003E信息的配置文件,比如存放口令的配置文件。u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Culu003Eu003Cliu003Eu003Cpu003E强制提交已忽略的的文件。git add -f <file>u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit check-ignore -v <file>检查为什么Git会忽略该文件。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E给Git命令配别名,这个有点骚,就是你以后想输入git rebase时,你给它一个“外号”,就叫它git nb。以后你可以通过git nb来代替git rebase。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E常用Git命令总结u003Cu002Fh1u003Eu003Culu003Eu003Cliu003Eu003Cpu003Egit config –global user.name “你的名字” 让你全部的Git仓库绑定你的名字u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit config –global user.email “你的邮箱” 让你全部的Git仓库绑定你的邮箱u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit init 初始化你的仓库u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit add . 把工作区的文件全部提交到暂存区u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit add .u002F<file>u002F 把工作区的<file>文件提交到暂存区u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit commit -m “xxx” 把暂存区的所有文件提交到仓库区,暂存区空空荡荡u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit remote add origin https:u002Fu002Fgithubu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fnameu002Fname_cangku.git 把本地仓库与远程仓库连接起来u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push -u origin master 把仓库区的主分支master提交到远程仓库里u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push -u origin <其他分支> 把其他分支提交到远程仓库u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit status查看当前仓库的状态u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit diff 查看文件修改的具体内容u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit log 显示从最近到最远的提交历史u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit clone + 仓库地址u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E下载u003Cu002Fiu003E克隆文件u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit reset –hard + 版本号 回溯版本,版本号在commit的时候与master跟随在一起u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit reflog 显示命令历史u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit checkout — <file> 撤销命令,用版本库里的文件替换掉工作区的文件。我觉得就像是Git世界的ctrl + zu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit rm 删除版本库的文件u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit branch 查看当前所有分支u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit branch <分支名字> 创建分支u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit checkout <分支名字> 切换到分支u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit merge <分支名字> 合并分支u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit branch -d <分支名字> 删除分支,有可能会删除失败,因为Git会保护没有被合并的分支u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit branch -D + <分支名字> 强行删除,丢弃没被合并的分支u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit log –graph 查看分支合并图u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit merge –no-ff <分支名字> 合并分支的时候禁用Fast forward模式,因为这个模式会丢失分支历史信息u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit stash 当有其他任务插进来时,把当前工作现场“存储”起来,以后恢复后继续工作u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit stash list 查看你刚刚“存放”起来的工作去哪里了u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit stash u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Ely 恢复却不删除stash内容u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit stash drop 删除stash内容u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit stash pop 恢复的同时把stash内容也删了u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit remote 查看远程库的信息,会显示origin,远程仓库默认名称为originu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit remote -v 显示更详细的信息u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit pull 把最新的提交从远程仓库中抓取下来,在本地合并,和git push相反u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit rebase 把分叉的提交历史“整理”成一条直线,看上去更直观u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit tag 查看所有标签,可以知道历史版本的tagu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit tag <name> 打标签,默认为HEAD。比如git tag v1.0u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit tag <tagName> <版本号> 把版本号打上标签,版本号就是commit时,跟在旁边的一串字母数字u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit show <tagName> 查看标签信息u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit tag -a <tagName> -m “<说明>” 创建带说明的标签。-a指定标签名,-m指定说明文字u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit tag -d <tagName> 删除标签u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push origin <tagname> 推送某个标签到远程u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push origin –tags 一次性推送全部尚未推送到远程的本地标签u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit push origin :refsu002Ftagsu002F<tagname> 删除远程标签<tagname>u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit config –global color.ui true 让Git显示颜色,会让命令输出看起来更醒目u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit add -f <file> 强制提交已忽略的的文件u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Egit check-ignore -v <file> 检查为什么Git会忽略该文件u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E-END-u003Cu002Fpu003E”

原文始发于:花 20 分钟,再来梳理一下 Git 基础知识

主题测试文章,只做测试使用。发布者:℅傍ㄖ免沦陷dε鬼,转转请注明出处:http://www.cxybcw.com/18014.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code