本文内容参考了廖雪峰老师的博文,并做了适当整理,方便大家查阅。

原帖地址

https://wangfanggang.com/Git/git/

常用命令

仓库初始化 - git init

1
git init

我们新建一个文本文件readme.txt

12
Git is a distributed version control system.Git is free software.

将文件添加到仓库中 - git add

1
git add .

将文件提交到仓库 - git commit

1
git commit -m "wrote a readme file"

查看仓库状态 - git status

1
git status

对比文件区别 - git diff

对文件内容进行简单修改并保存,这时还未提交(commit)到仓库,如果这时我们希望对比一下自从上次提交后,该文件发生了哪些变化,可以用git diff命令实现。

1
git diff readme.txt

注:diff比较的是当前未提交(commit)的版本跟上一个版本之间的差别。一旦commit到仓库,就无法比较了。

查看日志 - git log

1
git log

我们通过git log命令可以清楚地看到之前提交的版本。这里的一大串数字叫commit id。我们可以清楚地看到当前HEAD即是当前位置(append GPL

回退版本 - git reset

当前所处的位置为HEAD,如果我们希望回退到上一步(即add distribute),可以用HEAD^来表示。上两步是HEAD^^,以此类推。

1
git reset --hard HEAD^

查看文件,内容已经更改回版本2了。

此时我们再用git log查看历史记录:

发现版本3已经不见了,这时如果想再回复回去还有办法么?答案当然是肯定的,只要你记得commit id,随时可以用以下命令穿梭回去。

1
git reset --hard acc1d

注:这里的acc1dcommit id的前几位,不需要写全,git会自动匹配。

再次git log查看一下:

查看所有历史记录 - git reflog

如果你忘记了之前的commit id也不要紧,可以用过git reflog来查找。

1
git reflog

撤销工作区修改 - git checkout -- filename

假设现在我们又修改了文件内容。
readme.txt

12345
Git is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.Git tracks changes of files.My stupid boss still prefers SVN.

这时我们保存了,但还没有提交到缓冲区。用git status查看,git提示文件已修改。

这时,我们可以用git checkout -- filename撤销修改就回到和版本库一模一样的状态。

结论:

  • 如果文件还没被提交到缓冲区,git checkout -- filename撤销修改就回到和版本库一模一样的状态;
  • 如果文件已经被提交到缓冲区,git checkout -- filename撤销修改就回到添加到暂存区后的状态;

注:git checkout -- filename命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。

撤销缓冲区修改 - git reset

git reset HEAD filename命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

这时如果还想撤销缓存区的修改,同样运行git checkout -- filename即可。

删除文件 - git rm filename

当你删除了本地文件后,可能有两种情况:

  • 你确认要删除该文件,无论本地还是代码库;
  • 本地误操作,想要从代码库回复;

如果是第一种情况,可以用如下命令:

1
git rm test.txt

再用git commit把正式提交删除即可。

1
git commit -m "delete test.txt"

如果是第二种情况,可以简单地用git checkout命令回退。

1
git checkout -- test.txt

远端仓库

将本地仓库关联到远程仓库 - git remote add origin [your repo url]

在Github上新建一个仓库,例如:learngit

Github会提示你可以将本地的仓库(目录)跟新建的仓库关联起来。
这里的https://github.com/wfg2513148/learngit.git是刚刚创建的仓库,origin是远程仓库默认的名字,一般看到origin字样就知道是远程库。

12
git remote add origin https://github.com/wfg2513148/learngit.gitgit push -u origin master
12345678910
~/Desktop/learngit(master) » git push -u origin masterCounting objects: 9, done.Delta compression using up to 8 threads.Compressing objects: 100% (6/6), done.Writing objects: 100% (9/9), 820 bytes | 820.00 KiB/s, done.Total 9 (delta 1), reused 0 (delta 0)remote: Resolving deltas: 100% (1/1), done.To github.com:wfg2513148/learngit.git * [new branch]      master -> masterBranch 'master' set up to track remote branch 'master' from 'origin'.

注:当时在推送到远端仓库时遇到了以下异常:

123456
~/Desktop/learngit(master) » git push -u origin masterERROR: Repository not found.fatal: Could not read from remote repository.

Please make sure you have the correct access rightsand the repository exists.

可以尝试以下方法解决:

重新生成ssh-key并绑定到Github上

运行ssh-keygen -t rsa -C "wfgdlut@gmail.com" 需要替换成你自己的Github账号邮箱。

123456789
~/Desktop/learngit(master) » ssh-keygen -t rsa -C "wfgdlut@gmail.com"Generating public/private rsa key pair.Enter file in which to save the key (/Users/kwang/.ssh/id_rsa):/Users/kwang/.ssh/id_rsa already exists.Overwrite (y/n)? yEnter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /Users/kwang/.ssh/id_rsa.Your public key has been saved in /Users/kwang/.ssh/id_rsa.pub.

查看生成好的公钥文件内容,本例中的为/Users/kwang/.ssh/id_rsa.pub

将公钥内容原封不动的添加到Github上(Settings -> SSH and GPG keys -> New SSH key

如果还是报错,继续以下步骤。

显式指定远端仓库路径 - git remote set-url origin [your repo url]

git remote set-url origin [YOUR REPO] 明确指定远端仓库,再次推送,应该就可以了。

1
git remote set-url origin git@github.com:wfg2513148/learngit.git

克隆远端仓库 - git clone [your repo url]

1
git clone git@github.com:wfg2513148/gitskills.git

分支

创建新分支 - git checkout -b [new branch name]

1
git checkout -b dev

-b参数表示创建完立刻切换,相当于执行了以下两条命令:

12
git branch devgit checkout dev

查看分支 - git branch

切换分支 - git branch [branch name]

1
git branch master

合并分支

Fast-forward模式 - git merge [branch name merged]

当前我们处在master分支,现在想把dev分支合并到master分支上

1
git merge dev

可以看到,当前合并模式是Fast-forward,即快进模式,合并速度非常快。Git分支合并还有其他的模式。

留痕模式 - git merge --no-ff -m "no-ff merge" [branch name merged]

我们可以使用--no-ff参数来合并,这样会保留合并历史分支的痕迹。

可以看到,dev分支的信息被保留下来了。

删除分支

正常删除分支 - git branch -d [branch name]

1
git branch -d feture1

强行删除分支 -branch -D [branch name]`

12
```bashgit branch -D feture1

临时分支

创建临时分支 - git stash

有时候我们手头的工作还没做完,代码还没有提交(add & commit),但临时有其他事情要做,需要切换分支。这时候可以使用临时分支把当前工作进展储存起来,以便有空的时候“恢复”回来。

1
git stash

可以看到当前工作情况已经被储存起来了,这时候可以放心地切换分支了。

查看所有临时分支 - git stash list

1
git stash list

恢复临时分支内容 - git stash apply

当紧急工作做完后,重新切换回dev分支,取回临时分支中的工作。

1
git stash apply

注:git stash apply仅仅恢复临时分支的内容,并不会主动删除stash。需要用git stash drop来删除。

删除临时分支 - git stash drop

1
git stash drop

恢复同时删除临时分支 - git stash pop

1
git stash pop

多人协作

查看远端分支 - git remote

1
git remote

远端仓库默认名称是origin

查看远端分支详情 - git remote -v

1
git remote -v

根据当前访问权限,可以看到fetch抓取地址以及push推送地址。

推送分支 - git push origin master

注: 这里的origin master代表要将本地内容推送到远端仓库(origin)的 master 分支上。

并不是所有的本地分支都要推送到远端的,推送原则:

  • master主干分支,应该时刻与远端保持同步;
  • dev开发分支,也要保持与远端同步;
  • bug分支,可以保持在本地即可;
  • feature特性分支,是否要推送取决于你是否要跟他人协作;

拉取分支

远端仓库

1
git clone git@github.com:wfg2513148/gitskills.git

这时当我们查看分支时,只能看到本地的master分支

1
git branch

在本地创建远端分支

1
git checkout -b dev origin/dev

如果在提交的时候报冲突(其他人已经提交了),可以先用git pull抓取最新的代码,在本地合并后再推送。

如果git pull提示no tracking information,说明本地分支和远端分支没有链接起来,这时候可以用以下语句完成链接:

1
git branch --set-upstream branch-name origin/branch-name

标签管理

创建标签

标签的作用就是方便快速切换分支,创建标签也很简单,直接git tag v1.0就可以生成一个标签。

1
git tag v1.0

查看所有标签

1
git tag

补打标签

先查出要打标签的commit id,再运行命令补打标签。

1
git log --pretty=oneline --abbrev-commit

比如我们希望对conflict fiexed补打标签,找到对应的commit id是20adf59

补打标签:

1
git tag v0.9 20adf59

再次查看标签:

1
git tag

可以看到标签并不是按照时间顺序显示的。

通过git show <tagname>进一步查看标签内容

1
git show v0.9

可以用-a指定标签名,-m指定说明文字。

1
git tag -a v0.1 -m "version 0.1 released" 53fe235

再次查看标签详情git tag v0.1

删除标签

1
git tag -d v0.1

推送标签到远端分支

1
git push origin v1.0

一次性推送全部尚未推送的标签

1
git push origin --tags

删除远端标签

如果标签已经推送到远端,需要先删除本地标签:

1
git tag -d v0.9

然后再删除远端标签,格式如下:

1
git push origin :refs/tags/v0.9

结语

本文作为个人学习Git的参考资料,会不断丰富内容,也希望能够对大家有帮助。

本文标题:Git学习笔记 - 钢钢更新

文章作者:王方钢 / Kenny Wang

发布时间:2018年04月19日 - 14:04

最后更新:2018年05月03日 - 23:05

原始链接:https://wangfanggang.com/Git/git/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

【转帖】Git学习笔记 记录一下的更多相关文章

  1. Git学习笔记(10)——搭建Git服务器

    本文主要记录了Git服务器的搭建,以及一些其他的配置,和最后的小总结. Git远程仓库服务器 其实远程仓库和本地仓库没啥不同,远程仓库只是每天24小时开机为大家服务,所以叫做服务器.我们完全可以把自己 ...

  2. GIT学习笔记(1):创建版本库

    GIT学习笔记(1):创建版本库 创建版本库 1.创建合适目录并初始化为仓库 版本库即需要交由Git进行版本控制的目录,其下所有文件的修改.删除,Git都能跟踪还原. 说明:初始化后,当前目录下会多出 ...

  3. GIT学习笔记(3):分支管理

    GIT学习笔记(3):分支管理 何谓分支 GIT是如何存储数据的 GIT不是存储文件差异或者变化量,而是一系列文件的快照.在Git提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容 ...

  4. Git学习笔记与IntelliJ IDEA整合

    Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...

  5. Git学习笔记(四)

    一.忽略特殊文件 在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件. 不需要从头写.gitignore文件,GitHub已经为我们 ...

  6. Activiti 学习笔记记录(2016-8-31)

    上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

  7. Activiti 学习笔记记录(二)

    上一篇:Activiti 学习笔记记录 导读:对于工作流引擎的使用,我们都知道,需要一个业务事件,比如请假,它会去走一个流程(提交申请->领导审批---(批,不批)---->结束),Act ...

  8. git 学习笔记6--remote & log

    git 学习笔记6--remote & log 创建SSH Keys ssh-keygen -t rsa -C "1050244110@qq.com" 本地关联远程 git ...

  9. Git学习笔记---协作的一般流程

    一般的操作流程 1.pull 王小坤与另一个同事张大炮一起开发一个项目,张大炮昨天修改了数据库读写的api,优化了执行速度,并把read()函数改名成了Read(),下午下班之前把这些代码push到服 ...

随机推荐

  1. 矿难让显卡压了那么多货咋办?NV如是说

    在苏州 GTC 开幕的几天前,英伟达刚刚遭遇了一次股价的腰斩. 近来加密货币的热度渐低,受到挖矿热潮照顾许多的英伟达「矿机」销量受到打击,甚至出现了严重的库存危机,加上近来刚刚发的 RTX20 系列显 ...

  2. JAVA框架 Spring 和Mybatis整合(动态代理)

    一.使用传统方式的dao的书写方式,不建议.目前采用的是动态代理的方式交给mybatis进行处理. 首先回顾下动态代理要求: 1)子配置文件的中,namespace需要是接口的全路径,id是接口的方法 ...

  3. git回滚命令reset、revert的区别

    ##使用git,总有一天会遇到下面的问题: (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚. (2)改完代码测试也没有问题,但是上线发现你的修改影响了之前运行正常的代码报错,必须回滚. 所 ...

  4. Android解决Intent中的数据重复问题

    转载地址:http://www.cnblogs.com/anrainie/articles/2383941.html 最近在研究Android,遇到了一些Notification(通知)的问题: .N ...

  5. 为什么重写equals还要重写hashcode??

    equals和hashcode是object类下一个重要的方法,而object类是所有类的父类,所以所有的类都有这两个方法 equals和hashcode间的关系: 1.如果两个对象相同(即equal ...

  6. 运放参数的详细解释和分析-part3,输入失调电压Vos及温漂

    运放参数的详细解释和分析-part3,输入失调电压Vos及温漂 在运放的应用中,不可避免的会碰到运放的输入失调电压Vos问题,尤其对直流信号进行放大时,由于输入失调电压Vos的存在,放大电路的输出端总 ...

  7. odoo方法

    一. 类似于前面有个_ 的方法,格式是如下def _getdlvqty(self, cr, uid, ids, field_names, args, context=None): def _get_p ...

  8. 对寄存器ESP和EBP的一些理解

    PS:EBP是当前函数的存取指针.即存储或者读取数时的指针基地址:ESP就是当前函数的栈顶指针. 每一次发生函数的调用(主函数调用子函数)时,在被调用函数初始时,都会把当前函数(主函数)的EBP压栈, ...

  9. 10、MySQL 的复制

    10.1 复制的概述 10.2 配置复制 10.3 复制的原理 有两种 1.基于sql语句的复制:传输数据少(sql语句文件),就能复制大量的数据,不过由于一些自定义的函数问题,会有一些限制: 2.基 ...

  10. mfc CString,string,char* 之间的转换

    知识点: CString转char*,string string转char*,CString char* 转CString,string 一.CString转char*,string //字串转换测试 ...