Android 代码版本控制Git命令

引言:基于图形界面 Git 的使用已经熟练掌握了。偶尔遇到要使用命令行的情况。在此进行简单记录。

时间:2016年11月18日15:26:29

作者:JustDo23

邮箱:JustDo_23@163.com

01. 参考

廖雪峰 Git 教程 哈哈~没啥说的,强烈建议去看看。本文即个人笔记。

关键字

Git 的历史集中式分布式版本库安全性分支管理CVSSVNGit 的安装仓库repository工作区暂存区远程仓库GitHubSSH公钥私钥分支冲突标签

02. 配置用户

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

因为 Git 是分布式版本控制系统,所以每台机器都需要进行自报家门。

注意:命令中的--global参数是全局配置,整个机器上所有 Git 仓库的全局配置。

03. 创建仓库

$ git init

在一个空文件夹中执行命令,创建一个空的仓库。基本上瞬间就创建成功了,成功会有提示。

创建成功之后会在目录下生成一个.git的目录,这个目录是 Git 自动生成的用来跟踪管理版本库的,不要对其进行修改,否则会破坏版本库。这个目录是隐藏的,使用命令ls -ahf进行查看。

注意:文件夹可以不是空,可以有文件。.git目录千万不要随便修改。

04. 追踪文本

这里明确一下,所有的版本控制系统,都是只能追踪文本的改动。音频图片Microsoft 的 Word等都是二进制格式的,不能进行详细版本追踪。

文本都是有编码格式的,这里建议使用标准的UTF-8 编码

05. 查看状态

$ git status

使用命令可以查看当前版本库中文件跟踪的状态。文件状态会用不同的颜色进行标注。

  • 未添加追踪的文件——红色
  • 新添加的文件——绿色
  • 修改的文件——红色

06. 添加文件追踪

$ git add <file>
$ git add .

add 命令将文件添加追踪,如果指定了文件名称,则是将指定的文件进行添加追踪。如果使用.进行 add 则代表将所有未添加追踪的文件进行添加。

07. 提交本地仓库

$ git commit
$ git commit -m "注释"

commit 命令需要注意的是,commit 操作需要有相关的注释说明,对当前 commit 操作进行相关的解释说明。使用-m “注释”是代表加上注释进行 commit,如果没有使用则同样会跳转填写注释的界面。

commit 操作成功会有相关的提示。

08. 查看修改

$ git diff

diff其实就是difference的意思了。在对文件修改之后,可以使用命令查看具体修改的内容。

09. 查看提交记录

$ git log
$ git log --pretty=oneline

使用git log命令可以查看从最近到最远的提交记录。参数--pretty=oneline只是为了更好的查看提交记录。

10. 版本回退

$ git reset --hard HEAD^

在进行版本回退之前,一定要明确,当前版本是什么,将要回退的版本是什么。在 Git 中,使用HEAD表示当前版本,使用HEAD^表示上个版本,使用HEAD^^表示上上个版本。如果往上100个版本,则使用HEAD~100来表示。

使用命令cat file可以查看文件的内容。

$ git reset --hard commit_id

除了使用HEAD之外,同样可以使用每次 commit 的commit id进行回退操作。回退到之前或者之后的操作。在操作过程中 commit_id 并不是必须写全了,可以写开头几位,git 会自动去查找的。

11. 查看历史 commit id

$ git reflog

命令会显示出每次操作的id,从中可以找到历史的id进行使用。

12. 工作区和暂存区

  • 工作区[Working Directory]就是在电脑上直接看到的目录
  • 版本库[Repository]在工作区目录中有一个隐藏的.git目录就是 Git 的版本库
  • 暂存区[stage]在版本库中有暂存区,所有的修改都会先添加至暂存区,使用add命令添加至暂存区
  • 分支[branch]在版本库中可以有多条分支,默认生成的是master 分支,使用commit命令提交至分支
  • HEAD 指针同样是存在于版本库中,这是一个指针,指向分支

回顾一下把文件添加到 Git 版本库的两个步骤:

  • 使用git add把文件添加进去,实际上是把文件添加进了暂存区
  • 使用git commit进行提交更改,实际上就是把暂存区的所有文件提交到当前分支

Git 跟踪并管理的是修改,而非文件。

13. 撤销修改

$ git checkout -- <file>

执行此命令可以丢弃工作区的修改,将工作区文件还原到最近一次git add或者git commit时的状态。

命令中的--很重要,没有--命令就会变成切换分支的命令。

  • 文件修改后,没有被添加进暂存区,现在,撤销修改就回到和版本库中一样,也就是最近一次 commit 时的状态。
  • 文件修改后,已经被添加进暂存区,接着又进行了修改,现在,撤销修改就回到和暂存区中一样,也就是最近一次 add 时的状态。此种情况下撤销修改需要先有以下操作。
$ git reset HEAD <file>

执行命令,可以把暂存区中的修改进行撤销。

git reset命令可以进行版本回退,也可以把暂存区中的修改回退到工作区。使用HEAD时,表示最新的版本。

14. 删除文件

$ git rm <file>

执行命令后可以将本地文件进行删除,命令之后需要继续使用commit命令将删除进行提交。另外,命令执行之后,是无法使用checkout将文件还原的,此时还原文件需要使用reset命令回退版本库。

另外,删除文件同样可以先在文件目录中将文件直接删除,然后执行add命令,再执行commit命令进行提交。如果是直接本地删除的话,可以使用checkout命令进行还原。

15. SSH Key

$ ssh-keygen -t rsa -C "youremail@example.com"

本地仓库和远程仓库之间的传输是通过SSH进行加密的。所以需要创建并配置SSH Key

执行命令之后,可以在用户主目录下看到.ssh目录,应该是一个隐藏文件夹。打开目录之后会看到id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对。其中,id_rsa是私钥,不能对外泄露;id_rsa.pub是公钥,用公钥进行远程仓库的配置。

另外,在使用图形化界面的时候,不用配置 SSH Key 但是其实走的是账号密码的形式进行加密和校验的。

16. 关联远程仓库

$ git remote add origin git@server-name:path/repo-name.git

当我们在远程仓库创建出一个新的仓库的时候,会获得一个远程仓库的连接地址,直接复制地址并在本地仓库执行命令,就可以将本地仓库和远程仓库建立连接。

$ git push -u origin master

连接建立成功之后,远程仓库此时仍然是空的,我们需要进行第一次的提交,将本地仓库的所有内容推送到远程仓库。第一次推送的时候注意需要加上-u的参数。Git 不但会把本地master分支上所有内容提交到远程master分支,还会把本地master分支和远程master分支关联起来。

$ git push origin master

那么以后再进行提交就会简单,不用再加上-u的参数了。

另,origin代表了远程仓库的意思。

17. 仓库克隆

$ git clone git@server-name:path/repo-name.git

使用clone命令可以将远程的仓库克隆到本地。

另,在第一次使用clone或者push命令时候,可能会有一个 SSH 连接警告,第一次连接时候 SSH Key 的指纹验证。输入yes进行添加信任就可以了。

18. 分支管理

分支的概念初次接触其实还是有些摸不着头脑的。SVN 和 Git 都是支持分支操作,但是 Git 的分支管理更加的快捷好用。git init命令初始化仓库的时候会默认生成master主线,也就是master主分支,之后的文件修改提交等都在master分支上进行。多分支就像是多个平行的互补干扰的线。分支可以进行切换,可以进行合并。

master分支指向提交,HEAD指针执行master分支,也就是HEAD指针指向当前分支。

19. 分支操作

$ git branch

查看现有的分支,以及当前所在的分支,*号表示当前

$ git branch dev

创建了一个叫做dev的分支

$ git checkout dev

将当前分支切换到dev分支,在进行分支切换操作后发现工作区的文件会随之改变

$ git checkout -b dev

命令中包含有-b的参数,表示创建并切换分支,相当于创建和切换两条命令的合并

$ git merge dev

dev分支的内容合并到当前所在的分支中。命令中没有任何的参数,属于Fast-forward快进模式,就是将当前分支直接指向dev的当前提交,速度快。

$ git branch -d dev

dev分支进行删除

20. 解决冲突

冲突,在两个分支上对同一文件同一行代码均进行了修改并提交,随后进行两个分支的merge操作就会造成冲突的出现。merge操作其实本身会进行自动合并,没有冲突的地方就会自动合并在一起。看到Automatic merge failed; fix conflicts and then commit the result.就是提示自动合并失败,需要手动解决冲突,然后进行commit 提交。

出现冲突后打开冲突的文件会发现 Git 用<<<<<<<=======>>>>>>>标记出不同分支的内容。将冲突的地方手动修改之后进行addcommit操作。这样就把冲突解决掉了。查看提交记录,并将旧分支删除。

git log --graph --pretty=oneline --abbrev-commit带参数命令可以直观查看提交记录。

21. 分支管理策略

$ git merge --no-ff -m "message" dev

这里主要说明的是通常情况下 Git 会用Fast forword模式进行分支合并,但是这种模式下,删除分支后,会丢掉分支信息。这个理解起来有些费劲,动手敲了指令,似懂非懂的样纸。

注意命令中的参数--no-ff是禁止使用Fast forword模式,参数-m是合并后创建一个新的 commit 提交。合并后的历史有分支,能看出来曾经做过合并。

管理策略:

  • master分支是稳定的分支,只是用来进行版本发布的。
  • dev分支是非稳定的,在 dev 分支上干活,开发者在各自的分支上干活,然后合并到 dev 分支。

22. BUG 分支

当前在dev分支上努力的工作中,文件已经add,但是由于工作没有完全结束,没有进行commit操作。突然来了要修复 BUG 的任务,要创建一个 BUG 分支来进行修复。dev分支工作没有结束,又要创建新的issue分支来修复 BUG 。

$ git stash

stash功能可以将当前工作现场”储藏“起来,等以后恢复现场后继续工作。命令执行之后,gi status就会发现工作区是干净的了。接下来就可以在需要修改 BUG 的分支创建新的bug 分支然后进行修改,提交,合并,删除分支。当 BUG 修复工作结束掉后,切回dev分支。

$ git stash list

执行命令可以查看我们之前保存的工作现场

$ git stash apply

执行命令将工作现场进行恢复,恢复之后

$ git stash drop

执行命令将"储藏"记录删除

$ git stash pop

这条命令其实是上边两条的合并,恢复现场同时删除记录

$ git stash apply stash@{0}

如果说是有多次进行stash操作的时候,可以使用此命令恢复至指定的现场。

23. 多人协作

$ git remote
$ git remote -v

执行命令查看远程仓库,远程仓库的默认名称是origin,加上参数-v说明要查看详细信息。

$ git push origin <branchName>

将本地commit的数据提交至远程仓库指定的分支上。

$ git checkout -b dev origin/dev

创建本地dev分支,似乎也预先创建了一个远程的 dev 分支,进行一次push操作就可以在远程仓库k看到分支。

$ git branch --set-upstream dev origin/dev

远程仓库已经有了dev分支,本地的dev分支还没有和远程仓库的dev分支建立连接,执行命令进行连接建立。

$ git pull
$ git pull origin <远程仓库名称>

进行代码的拉去。

24. 标签

发布版本时候在版本库中打上一个标签[tag],标签与版本号相联系,将来想回到这个版本的代码就很方便了。标签其实就是指向某次 commit 的指针,这个和分支很像,但是分支是可以移动的,标签是不能移动的。标签可以创建,也可以删除。

$ git tag <tagName>

在需要打上标签的分支里直接执行命令,就可以创建一个新的标签了。默认情况下,标签是打在最新一次的commit上面。

$ git tag

执行命令,直接查看当前现有的标签。注意:标签的排序不是按照时间顺序排列,而是按照字母顺序进行排列的。

$ git tag <tagName> commit_id

标签是随时可以给某次commit打上的,需要带上相应的commit id就可以。

$ git show <tagName>

执行命令可以查看标签的信息。

$ git tag -a <tagName> -m "message" commit_id

使用参数-a指定标签名,使用参数-m指定说明文字。

$ git tag -s <tagName> -m "message" commit_id

使用参数-s可以实现用私秘钥签名一个标签。签名采用PGP需要先安装GnuPG,如果没有就会报错,这个神马的就不清楚了。

$ git tag -d <tagName>

参数-d就是删除的意思了,这个和分支的删除都是类似的。

$ git push origin <tagName>
$ git push origin --tags

tag命令创建的标签都是在本地存储的,使用push命令可以将指定的标签推送到服务器上,使用参数--tags可以将本地所有尚未推送的标签进行推送。

$ git tag -d <tagName>
$ git push origin :refs/tags/<tagName>

要删除远程仓库的标签需要两步,先将本地的标签删除,然后将删除推送到远程。

这里注意参数:refs/tags/<tagName>就可以了。

25. 忽略特殊文件

对于一些配置文件或者是自动生成的文件,虽然放在工作目录里,但是却不能提交到仓库中进行版本管理,比如编译生成的.class文件或者是编译器本地配置的.iml文件等。这些文件对于版本管理库来说都是要忽略的,这些在另一篇文章中都已经有提到过了。

在 Git 工作区根目录创建.gitignore文件,并将需要忽略的文件进行配置,最后将.gitignore文件添加到版本库中,并提交远程仓库。

关于.gitignore文件的编写有一个网址参考:https://github.com/github/gitignore

Windows系统中无法直接创建.gitignore文件,可以在文本编辑器中选择保存或者另存为

$ git check-ignore -v <file>

执行命令可以检查文件的忽略配置。

$ git add -f <file>

注意使用参数-f可以实现强制添加。

26. 自定义 Git

$ git config --global color.ui true

执行命令,会上 Git 显示不同的颜色,醒目区分文件的状态。

$ git config --global alias.st status
$ git config --global alias.<别名> <原命令>

配置别名,参数config是配置的意思,参数--global是全局的意思,参数alias.是给原来的命令设置一个新的别名,注意.后边跟上指定要配置的别名。例如第一行配置就是给status配置了一个新的别名st,接下来使用git st就会有和git status一样的效果。

配置文件的位置:

  • 本地仓库的配置,可以在本地仓库.git/config中进行查看,也可以从中删除别名的配置。
  • 全局的配置,可以在用户主目录下隐藏文件.gitconfig中进行查看。

27. 结束

终于是写完了。本来只是想推荐大家看一下廖雪峰的教程,没想到自己打开就顺手开始敲命令,既然都已经开始动手实践了,就没有不记录的理由了。经过三天的努力,终于是完结了。总体来说以前没注意到的地方有了一个认知,收获多多。下面贴出之前学习总结起来的命令。

命令 功能
git --help 查看帮助
git --help 命令 查看指定命令的帮助
git init 初始化仓库
git status 查看状态[文件追踪状态]
git add file 添加指定的文件
git add . 添加所有的文件
git commit 代码提交
git commit -m "注释" 代码提交带有注释的提交
git branch 查看分支
git branch -v 查看分支详细
git branch dev 创建 dev 分支
git checkout dev 跳转 dev 分支
git checkout -b dev 创建并跳转 dev 分支
git branch -d dev 删除 dev 分支
git merge dev 合并 dev 分支到当前分支
git merge --no-ff -m "message" dev 不使用快进模式合并,且带上提交的注释
git clone url 从远程仓库克隆代码到本地
git pull origin dev 从远程仓库 dev 分支拉去最新代码
git push origin dev 将代码提交到远程仓库 dev分支
git diff 查看修改
git log 查看提交记录
git log --pretty=oneline 查看记录一行显示
git relog 查看所有记录
git rm file 删除文件

28. 彩蛋

git checkout -b branch-name origin/branch-name建立本地分支同时建立服务器分支
git branch --set-upstream branch-name origin/branch-name将本地分支与服务器分支连接
git push origin :branch-name在远程仓库删除分支

29. 推荐

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

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,395评论 9 163
  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,578评论 1 17
  • (本文约3500字,预计阅读时间5分钟) 自从排骨哥从事招聘工作以来,面对各种各样、形形色色的候选人放鸽子,让我一...
    排骨哥阅读 1,304评论 0 6