GIT操作 之 常用指令(入门级)

小叶哥github库里,已详细对每个git操作做出分析(还包含了很多原理级别的)。而我自己当初,在要接触git时,也是徘徊在门外兜兜转转,最后因为工作需要,天天摸索,才总算入了门。
所以,“熟能生巧”真的一点没错。
之前把一些常用的操作记录在纸质笔记本上,平时偶尔忘记指令可以回翻。现在我把这些操作总结出来,希望对大家有所帮助。主要还是给自己做个电子档备份。O(∩_∩)O哈哈~

概述

Git的整个操作要素,可以用下图的流程概括:

git-flow. 来源:阮大大博客

几个主要的结构体有:

  1. Workspace 工作区:git init后,当前文件夹(自己电脑上,眼睛看得见的那个和平常文件夹一毛一样的文件存储区域)就是工作区。
  2. Index 暂存区:一个临时放置工作区编辑后文件的区域。git add后,有变动的文件会跑到这里来。
  3. Repository 本地仓库:相当于是在自己电脑上的一个仓库。git init后,你会发现当前文件夹多了一个.git的隐形文件夹,这里就存放着本地仓库的版本相关内容。
  4. Remote 远程仓库:这个是一个联网的在某个服务器上的库,我们一般使用github或者gitlab等。若希望别人能远程下载clone你的文件,就必须放到远程仓库。

接下来,我们简单捋一捋这个过程:
下行路程:作为小前端的我在本地电脑(工作区)上的一个文件夹下进行初始化git init,紧接着马不停蹄的撸了一把代码,保存为file.html ------------> 通过 add ,把file.html放到了暂存区 ------------> 然后又通过 commit,把file.html送到了本地仓库 ------------> 最后通过 push,把file.html推送到了远程仓库。

上行路程:这个月拿到激励金的我买了台笔记本,想把之前撸过的file.html工程下载到这台电脑上。先获得远程库里对应工程的地址(一个xxx.git的下载地址)------------> 通过 clone ,把file.html所在工程下载到了本地仓库(操作指令的文件路径下,会自动初始化为本地仓库)。------------> 通过 checkout ,把file.html检出到了工作区

常用指令说明

我的入门参考过阮大大博客,也入手过图灵的教材。但真正比较有感知的还是廖雪峰大大的git教程系列。这个教程虽然有一点点年代了,但作为入门一点都不过时。只要按照步骤一步一步的走一遍,就能大体体味Git操作到底是什么个鬼东西了。
此处我是精炼出指令来,以备查阅。

1 创建版本库

#初始化版本库
git init

#添加工作区变动到暂存区
git add

#添加暂存区内容到本地仓库
git commit

#查看仓库状态(工作区的变动文件是红色,暂存区的文件是绿色,也会有相关提示操作的语句)
git status

#查看文件修改(本地仓库和工作区比较)
git diff file1.txt

2 版本回退

#查看提交日志(`git commit` 时,附录的说明)
git log

#查看提交日志(单行显示,看起来会更简洁)
git log --pretty=oneline

#回退上一个版本
git reset --hard HEAD^

# HEAD     当前版本
# HEAD^    上一个版本
# HEAD^^   上上一个版本
# HEAD~100 往上100个版本

#查看每一次命令(可以查看commit id,用以查找版本)
git reflog

#指定到commit id为3628164版本(实际的commit id数字串很长,可以不写全)
git reset --hard 368164

3 撤销修改

#把工作区的修改撤销(丢弃工作区修改)
git checkout -- file1.txt

# 注意:
# 1. 若file1.txt没有add,上面的指令会让工作区回到版本库相同的状态;
# 2. 若file1.txt已经add到了暂存区,上面的指令会让工作区回到暂存区状态上
# 补充说明:checkout 是检出的意思,也就是从本地仓库提取指定文件来覆盖工作区的文件。
#           暂存区是工作区和本地仓库中间的一个桥梁,所以检出时候会先到暂存区去探究下,若没有再到本地仓库取。

#把暂存区的修改撤销,修改只保留在了工作区
git reset HEAD file1.txt

#若希望把已添加暂存区的修改丢弃,就得分别执行两步: 先撤销暂存区的修改(此时修改还在工作区),再撤销工作区的修改。
git reset HEAD file1.txt
git checkout -- file1.txt

# 注意:以上两行代码会让临时修改的代码彻底消失,谨慎操作。

4 删文件

#1. 直接在工作区的文件夹把文件删除(右键-删除)

#2. 若确定要删除,继续执行以下指令
git rm file2.txt
git commit 

#3. 若误删了,可以使用撤销修改
git checkout -- file2.txt

5 远程库 origin

5.1 添加远程库

#1. 关联
git remote add origin git@server:path/repo.git

#2. 第一次推送 -u:是对本地master与远程master分支进行关联
git push -u origin master

#3. 以后的推送
git push origin master

# 或者
git push

5.2克隆远程库

#1. 关联
git clone git@server:path/repo.git

#也支持https协议,但速度会偏慢

5.3查看远程库

# 列出远程库,远程库默认名称origin
git remote

#显示远程库信息
git remote -v

#查看远程库详细信息
git remote show [origin]

5.4 向远程库推送分支

# 推送 master 分支
git push origin master

# 推送 dev 分支
git push origin dev

5.5从远程库拉取分支

# 方法一
# 获取远程所有分支
git fetch

# 查看所有远程分支
git branch -r

# 在本地新建一个同名分支,并与该远程分支关联
git checkout same_name_origin
#注意:不要使用 git checkout origin/mybranch ,会进入detached head状态,不会在本地新建分支。



# 方法二
# 语法
git checkout -b 本地分支名 origin/远程分支名

# 比如
git checkout -b dev2 origin/dev2

6 分支管理 branch

6.1 创建、合并分支

# 创建并切换到分支dev
git checkout -b dev

# 上面的指令等于下面两条指令的集合

# 创建分支
git branch dev

# 切换分支
git checkout dev

# 查看当前所有分支
git branch

# 查看当前所有分支,包括远程分支
git branch -a

# 推送分支:把dev分支推送到远程库
git push origin dev


# ... 在dev分支上做编辑,并add、commit等操作后

# 切回master分支
git checkout master

# ... dev分支上的修改不会出现在master分支上


# 把dev分支合并到master分支:可以把dev上的修改同步到master
git merge dev

# 删除dev分支(注意:不能在dev分支上删除dev分支)
git branch -d dev

6.2 查看两个分支区别

# 查看两个分支区别,将结果输出到指定文件
#1. 覆盖方式:若执行指令的路径下已经有file1.diff,会进行覆盖
git diff [branchA] [branchB] > file1.diff

#2. 追加方式
git diff [branchA] [branchB] >> file1.diff

#3. 显示出所有有差异的文件列表
git diff branch1 branch2 --stat 

#4. 显示指定文件的详细差异
git diff branch1 branch2  [filepath] 

#5. 显示出所有有差异的文件的详细差异
git diff branch1 branch2

# 查看分支创建时间
git reflog show --date=iso branchA

6.3 解决合并冲突

当使用merge操作合并时,若两个分支修改了相同位置内容,就会出现冲突。
可以具体查看发生冲突的文件,文件里头会有<<<< ==== >>>> 来标记出同一位置,不同分支各自的内容块。然后由我们来选择保留想要留下的内容,删除不要的内容以及标记符号。保存、add、commit,即可。

# ... 假设当前在master分支上,要合并dev分支
git merge dev

# ... 发生了冲突
# 1. 查看冲突发生文件:一般在进行git merge 时就会有提示文字
git status

# 2. 处理冲突:打开产生冲突的文件,进行主观编辑,然后保存

# 3. 之后进行正常的更新文件操作
git add
git commit -m "fix conflict"

# 最后,如果想要查看分支合并图
git log --graph --pretty=oneline --abbrev-commit

6.4 分支管理策略

分支是版本管理工具的一大特色。如何来管理分支,不同人不同团队采用的也不一样。
有两篇博文可以参考下:源代码主干分支开发四大模式 和 英文版的 A successful Git branching model

团队开发中,一般会有以下几种分支分类(仅供参考):

  1. master - 主分支,时刻与远处同步
  2. dev - 开发分支,团队成员在此分支上工作
  3. bug - 本地修复bug分支,可以不推送到远程
  4. feature - 新功能分支,若是团队合作,可以push到远程

关于分支合并,分为两种模式:快速模式和普通模式。

# 快速模式:上面使用的合并模式。
git merge dev

# 普通模式:以非 “Fastforward” 模式合并,合并后历史记录有分支,能看出合并过
git merge --no-ff -m "merge with noff" dev

# 目前我都是用普通模式。 0 0 因为我使用快速模式的时候,都会自动进入 -m 编写提示文字模块。还没有去仔细研究为何这样。

6.5 Bug分支 git stash:保存工作现场

场景模拟:
... 在dev分支上热火朝天干活ING ... 但完整模块还没有完成,并不想提交
... 但线上出现紧急bug需要修复,必须切到master分支修改bug ...
... 该如何是好 ... 别怕!我们有 git stash 来保存当前工作现场

# 在dev分支上,保存当前工作现场
git stash


# ... 切到master分支上,进行bug修复 ...
git checkout master

# 创建修复bug新分支 issue-101
git checkout -b issue-101

# ... 修改代码后
git add
git commit -m "fix bug 101"
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101
git branch -d issue-101


# ... 切回到dev分支,要继续之前的工作 ...
git checkout dev

# 查看保存的工作现场
git stash list

# 恢复并删除stash内容
git stash pop


# 以上 git stash pop 等同于下面两条指令

# 恢复工作现场
git stash apply

# 删除stash内容
git stash drop

注意:在dev分支创建的stash内容,是属于本地库的,而不隶属于分支。所以如果当前的工作现场,我希望在其他分支进行编辑提交,就可以在其他分支上进行 git stash pop

6.6 给分支添加描述

#给当前分支添加描述
git branch --edit-description

#执行上面指令,界面会进入一个编辑界面,可以按【insert】键,然后在里面噼里啪啦写下你的感言
#写完后,【Q】键退出编辑,然后输入":wq!"保存退出。

#查看分支描述
git config branch.<branch>.description

注意:

  1. 分支描述是保存在.git/config下的,是本地存储,所以不能被推送。当删除分支时,对应的分支描述也会一起删除。
  2. 设置 git config --global branchdesc true, 就可以将此描述推送到合并提交。即git merge --log<branch>,分支描述会添加到合并提交消息。(此条规则我还没有测试,你们可以先测测看。)

7 标签 Tag

标签的作用相当是 commit版本号的一个别称,能方便我们回退到指定的commit。

7.1 创建标签

# 切换到要打标签的分支上
git checkout master

# 给最新提交打上标签 v1.0
git tag v1.0


# 若想给历史提交打标签,可以git log查看其版本号
git log --pretty=oneline --abbrev-commit

# 假如查阅到的 commit id 是 6224937****
git tag v0.9 6224937

# 查看标签
git tag

# 查看标签信息
git show v0.9

# 创建带有说明文字的标签
git tag -a v1.0 -m "version 1.0 released"

# 把标签推送到远程
git push origin v0.1

# 一次性全部推送
git push origin --tags

# 获取远程tag
git fetch origin tag <tagname>

7.2 删除标签

#本地删除标签
git tag -d v1.0

# 若标签已推送到远程,要删除就得两步:先本地删除、再远程删除
git tag -d v1.0
git push origin :refs/tags/v1.0

7.3 删除远程tag

git push origin --delete tag <tagname>

也可以使用推送一个空分支到远程分支,其实就相当于删除远程分支:

# 推送一个空分支到远程分支
git push origin :<branchName>

# 推送一个空tag到远程tag
git tag -d <tagname>
git push origin :refs/tags/<tagname>

以上两种语法,作用完全相同。

8 远程分支的相关操作

8.1 查看远程分支

加上 -a 参数可以查看远程分支,远程分支会用红色表示出来(如果开了颜色支持的话)

git branch -a

8.2 删除远程分支

git push origin --delete <branchName>
(8) 查看分支的创建时间
git reflog show --date=iso master

参考文章:

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