拾人牙慧系列--Git再学习

前言

本系列文章,将在各路大神文章的基础上,总结提炼出自己的感悟,力求将大神的观点总结的更加凝练,希望站在巨人的肩膀上,能看得更远

请务必先在无实际作用的测试工程中练习Git命令
                                                                        ——《鲁迅没说过的话精选集》

在还没有很熟悉Git命令之前,请务必先确认输入的指令是否是你想要的效果,如果不能确定,还是先使用可视化工具
                                                                    ——《跑路程序员告诫你的二三事》


本篇引用文章

廖雪峰大神的专题文章--史上最浅显易懂的Git教程!
另外,参考了这里:
易百教程--Git教程


内容提要

作为一名程序员,Git/SVN是我们每天都要打交道的东西(本篇不讨论SVN),然而,我们真的会用Git吗?你是不是也和我一样,只会git clone git pull git commit git push呢?如果你也是,请跟随我,在廖雪峰大神的带领下,一起重新学习一下Git的使用吧

当然有人会说,这都9102年了,GitHub for Desktop、Source Tree、TortoiseGit、SmartGit了解一哈,确实,各种工具为我们屏蔽了复杂的命令,提供了方便。但是,如果你基本不怎么了解Git有什么命令,以及常用命令的作用,那么,在你遇到一些突发情况时,你往往无法处理(也是我的亲身体会),所以我认为,虽然大部分时候我们还是会用工具去做事,但是还是有必要学习一下基本的命令


Git简介+安装

Git简介----不赘述,看大神的文章吧

Git安装----不赘述,看大神的文章吧


创建Git工程

初始化本地目录
git init

//正常情况下,输出如:
//Initialized empty Git repository in D:/work/code/gitLearning/project1/.git/
//就是成功啦
新建远程仓库
  • 1.打开Github,注册并登陆,这个就不详细说了
  • 2.
  • 3.
  • 4.

    创建好就长这样,有三个指引,分别对应初始化一个本地库并关联到远程库 关联本地库到远程库 用其他远程库来初始化当前库
关联仓库
关联本地库到远程库
git remote add origin git@github.com:NotSeriousCoder/GitLearning.git
git push -u origin master

首次push就报错

首次提交,如上图报错,后来尝试了,在本地工程目录新建一个文件aaa.txt(当然一般是新建一个README.md文件),然后提交如下:

git add
git commit -m "first commit"
git remote add origin git@github.com:NotSeriousCoder/GitLearning.git
git push -u origin master
//这里如果你的key设置了密码,需要输入密码
//Enter passphrase for key '/c/Users/Bingor/.ssh/note':***
用其他远程库来初始化当前库
  • 1.
  • 2.
  • 3.
    导入中
  • 4.
    导入完成
从远程仓库克隆

如果本地没有仓库,只有远程仓库,也可以直接从远程克隆下来,如下:

git clone git@github.com:NotSeriousCoder/GitLearning.git

多人协作

提交代码
//如果有新的文件/文件有变动
//git add 目的是让Git追踪文件变化,将文件的变化放入暂存区
git add xxx.xxx
//如果有多个文件变化,可使用 -A 来追踪所有变动
git add -A

//如果不清楚有哪些文件有变化,可以使用git status,会列出上一个Commit之后的所有变动
git status
//如果嫌输出的信息过于繁琐,可使用 -s 来简化输出
git status -s

//提交
git commit -m "commit说明"
推送代码到远端

commit好代码,我们通常需要将其推送到远端仓库(至少每天下班得推一次,不然太久不推,比较差异你就得疯)
然而你不能直接把代码推到远端,因为你的小伙伴大概率也会去修改提交代码
所以在推送之前,你需要将可能的远端变更先拉取下来

//远程主机名一般默认是origin,远程分支名则是你需要拉取的远程分支
//这句命令会执行两个操作,首先拉取远端文件,然后尝试跟本地文件合并
git pull <远程主机名> <远程分支名>

如果成功,长这样:


pull成功,无冲突

如果失败,长这样:


代码Merge失败

你需要解决冲突,然后提交,再推送
冲突长这样

你需要和一起开发的小伙伴确认应该保留哪部分代码,然后删除与之冲突的
删除完毕

接下来把Merge add并提交,然后就可以push了(当然,理论上来说,在你解决冲突的期间,会不会远端仓库的文件又更新了呢?有可能的吧?所以也许需要再pull一次,看你具体需要了)

git push <远程主机名> <本地分支名>:<远程分支名>
push完成

回溯历史

查看当前工作区与上次commit/add的差异
//会详细列出当前工作区未暂存的修改内容
git diff
//会详细列出当前工作区中指定文件未暂存的修改内容
git diff 文件名
//会详细列出当前工作区中指定文件未暂存的修改内容与某个指定版本的不同
git diff 版本号 文件名

git diff 执行结果

增加的行,会以+xxx的形式标注
删去的行,会以-xxx的形式标注
修改的行,会以-原来的内容 +现在的内容标注

//上文提到过,可以总览有哪些文件发生了修改
git status
//嫌输出的信息太多,也可以简略输出
git status -s

git status -s 的执行结果

修改过的文件,会以M作为前缀
删除的文件,会以D作为前缀
新增的文件,会以?作为前缀

还没有commit,修改的内容不想要了,想回退到上一次add/commit的状态
  • 如果已经add
//必须先reset,否则无法checkout
git reset
git checkout xxx
撤销修改
  • 如果还没add
//没有add的情况下,不需要reset
git checkout xxx
还没add,直接checkout 即可
已经commit,修改的内容不想要了,想回退到上一次add/commit的状态
//回退到上一个版本
git reset hard HEAD^
//回退到上N个版本
git reset hard HEAD~n
//回退到上指定版本
git reset --hard commit_id

//可以结合log命令,查看以往的提交,n表示查看最近n次提交记录,不设置的话将展示所有历史记录
git log -n

分支管理

查看所有分支
git branch -a
新建一个分支
//你可以选择
git checkout -b xxx
//或者
git branch xxx

区别在于,前者只创建分支,后者还会帮你切换过去

创建新分支
在某个特定commit的基础上新建一个分支

会有这么一种场景,我想新建一个分支,但是当前版本包含了一些新分支不需要的变更,而前n个版本有适合用于新建分支的commit,那么,我们可以在那个commit的基础上去新建分支。例如:


举个栗子

于是乎,我通过翻找log,找到一个合适的版本,id为:ae081072xxx(不需要完整的id,有前几位即可,当然也不能太短)

//你可以选择
git checkout -b xxx commitId
//或者
git branch xxx commitId
//commitId即代表你指定的版本对应的commit
执行结果

再看看项目目录


不希望保留的文件已经消失
切换分支
git checkout 分支名称

切换分支前,需要提交当前工作区的变更,否则将会报错


先提交,后切换
删除分支

删除需谨慎
                                                                        ——《不要问我为什么说这个话》

git branch -d 分支名称
合并分支
//将指定分支合并到当前分支来
git merge 分支名

如果像我这样遇到冲突

  • 1.可以手动解决(前文有提及)
  • 2.如果是某些文件单纯的只使用某个分支的就行(比如A文件,想完全采用dev1分支的版本),可以使用命令
//ours表示采用当前分支版本
git checkout --ours 文件名
//theirs表示采用合并过来的分支版本
git checkout --theirs 文件名

需要注意,如果用的是rebase,那么ours跟theirs的意思相反(rebase的用法还没吃透,这里不演示)

最后,提交即可


merge完记得提交哦

其他

//清空屏幕
reset

总结

本篇结合git的常用场景,介绍了git的部分命令,git的功能绝不仅限于此,更多的内容有待我们去挖掘,目前我也只是用到了这些,以后随着遇到的场景和问题的增加,我会陆续将更多的内容分享上来


未完待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343