git笔记
这篇有关git的博客,写着写着有些崩了。里面有些碎碎念了。下次一定注意这个问题。
创建项目:
- midir xx :创建xx文件夹
- git init : 为当前文件夹创建代码仓库
提交代码:
- git add xx : 将文件名为xx的文件暂存起来,当commit的时候就提交到代码仓库
- git commit -m "xx" : 为当前提交添加描述
检查状态:
- git status : 检查当前仓库的状态,即查看是否存在未提交的新文件
- git log : 查看更改清单
单行历史
你可以很好的控制处理 log
命令要精确显示的内容。我喜欢 单行格式:
$ git log --pretty=oneline
你应该看到:
$ git log --pretty=oneline
1f7ec5eaa8f37c2770dae3b984c55a1531fcc9e7 Added a comment
582495ae59ca91bca156a3372a72f88f6261698b Added a default value
323e28d99a07d404c04f27eb6e415d4b8ab1d615 Using ARGV
94164160adf8faa3119b409fcfcd13d0a0eb8020 First Commit
控制显示哪个条目
log
命令有许多选项用来选择显示哪个条目。玩玩下面的选 项:
$ git log --pretty=oneline --max-count=2
$ git log --pretty=oneline --since='5 minutes ago'
$ git log --pretty=oneline --until='5 minutes ago'
$ git log --pretty=oneline --author=<your name>
$ git log --pretty=oneline --all
参阅 man git-log
了解更多细节。
更加漂亮
这是我用来复查上周所做更改的命令。如果我只想看自己所 作的更改,那么我将添加--author=jim
。
$ git log --all --pretty=format:'%h %cd %s (%an)' --since='7 days ago'
终极日志格式
随着时间的推移,我发现在工作时最喜欢下列日志格式。
$ git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short'
它看起来像这样:
$ git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
* 1f7ec5e 2013-04-13 | Added a comment (HEAD, master) [Jim Weirich]
* 582495a 2013-04-13 | Added a default value [Jim Weirich]
* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]
* 9416416 2013-04-13 | First Commit [Jim Weirich]
让我们看一下细节:
--pretty="..."
定义输出的格式%h
是提交 hash 的缩写%d
是提交的装饰(如分支头或标签)%ad
是创作日期%s
是注释%an
是作者姓名--graph
使用 ASCII 图形布局显示提交树--date=short
保留日期格式更好且更短
获取旧版本:
- git checkout <hash> :检查日志输出,并且找到hash对应的提交,和下面的配合,能看到这次提交的改变
- cat 文件名 : 如 hello.rb
- git checkout master : 返回最新的版本
为版本打标签
- git tag xx : 为当前版本打上标签XX, 如 git tag v1
标记先前的版本======》通过上面的方法获取旧版本,然后再为当前版本打标签。
- git tag :获取日志中的所有标签
去除标签:
- git tag -d xx : 移除标签xx
撤销更改:(这里都以hello.rb文件为例)
- 撤销本地更改(更改的内容没有缓存,更没有提交)
@处理之前确定你在master的最新提交上===》 git checkout master ;
@检查状态,确定更改的内容没有缓存,更没有提交,属于撤销本地更改===》 git status;
@使用checkout命令检出更改的文件,在仓库中的版本,以hello.rb文件为例
- $ git checkout hello.rb //这句就撤销了本地更改,下面两句是查看 hello.rb 的内容
- $ git status
- $ cat hello.rb
2.撤销缓存更改
@检查状态,确定更改的内容已经缓存,但没有提交,属于撤销缓存更改===》 git status;
@清空暂存区内容===》git reset HEAD hello.rb
@使用checkout命令检出提交的版本(即上一次提交的内容)===》git checkout hello.rb
3.撤销提交的更改
@使用创建一个提交来移除由不想 要的提交所引入的更改===》git reset HEAD
@上面的语句将进入编辑器,你可以编辑默认的提交信息,或直接 离开它。保存并关闭文件。会看到:
- $ git revert HEAD
- [master f98cb24] Revert "third commit"
- 1 file changed, 1 insertion(+), 3 deletions(-)
@第二步就已经成功了,此时让我们来查看提交记录(这里的git hist 是自己定义的命令,可以用git log 查看):
- $ git hist
- * f98cb24 2016-04-04 | Revert "third commit" (HEAD -> master) [mecury]
- * da6b209 2016-04-04 | third commit [mecury]
- * d44641b 2016-04-04 | second commit (tag: v1) [mecury]
- * 46de4a5 2016-04-04 | First Commit (tag: v1-beta) [mecury]
重置分支:
首先,标记分支
但在我们移除提交前,让我们使用一个标签来标记最新的提 交以便能够再次找到它。
$ git tag oops
重置到 Oops 前
看看上面的日志历史,我们将知道标记为“v1”的提交是错误 提交之前的正确提交。让我们重置分支到该位置。因为分支 已经标记,所以我们可以在 reset
命令中使用标签名( 如果它没有被标记,那么我们只能使用哈希值)。
$ git reset --hard v1
$ git hist
$ git reset --hard v1
HEAD is now at 1f7ec5e Added a comment
$ git hist
* 1f7ec5e 2013-04-13 | Added a comment (HEAD, v1, master) [Jim Weirich]
* 582495a 2013-04-13 | Added a default value (v1-beta) [Jim Weirich]
* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]
* 9416416 2013-04-13 | First Commit [Jim Weirich]
我们的 master 分支现在指到 v1 提交,并且 Oops 和 Revert Oops 提 交已经不在分支中。--hard
参数表示应当更新工作目录以便与新的分 支头保持一致。
什么也没丢
但错误的提交发生了什么?结果是提交仍然在仓库中。事实上,我们仍然 能够引用它们。记得在本实验开始我们使用标签“oops”标记了还原的提交。 让我们看看所有的提交。
$ git hist --all
$ git hist --all
* a10293f 2013-04-13 | Revert "Oops, we didn't want this commit" (oops) [Jim Weirich]
* 838742c 2013-04-13 | Oops, we didn't want this commit [Jim Weirich]
* 1f7ec5e 2013-04-13 | Added a comment (HEAD, v1, master) [Jim Weirich]
* 582495a 2013-04-13 | Added a default value (v1-beta) [Jim Weirich]
* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]
* 9416416 2013-04-13 | First Commit [Jim Weirich]
在这儿我们看到错误的提交并没有消失。它们仍然在仓库中。它们只是不再 列到 master 分支中。如果我们没有标记它们,它们依然在仓库中,但除了 使用哈希值外没有别的方法引用它们。未引用的提交保留在仓库中,一直到 系统运行垃圾回收软件时。
修正提交:
更改程序并提交
给程序添加作者注释。
# Default is World
# Author: Jim Weirich
name = ARGV.first || "World"
puts "Hello, #{name}!"
$ git add hello.rb
$ git commit -m "Add an author comment"
唉,该有 Email 啊
在你做了提交之后,你意识到任何好的作者注释都应该包含 Email 地址。更新 hello 程序来包含 Email。
# Default is World
# Author: Jim Weirich (jim@somewhere.com)
name = ARGV.first || "World"
puts "Hello, #{name}!"
修正先前的提交
我们真的不想因为 Email 而分开提交。让我们修正先前的提交 来包含 Email 更改。
$ git add hello.rb
$ git commit --amend -m "Add an author/email comment"
$ git add hello.rb
$ git commit --amend -m "Add an author/email comment"
[master eb30103] Add an author/email comment
1 files changed, 2 insertions(+), 1 deletions(-)
回顾历史
$ git hist
$ git hist
* eb30103 2013-04-13 | Add an author/email comment (HEAD, master) [Jim Weirich]
* 1f7ec5e 2013-04-13 | Added a comment (v1) [Jim Weirich]
* 582495a 2013-04-13 | Added a default value (v1-beta) [Jim Weirich]
* 323e28d 2013-04-13 | Using ARGV [Jim Weirich]
* 9416416 2013-04-13 | First Commit [Jim Weirich]
我们可以看到最初的“author”提交现在消失了,而且它已经 被“author/email”提交替换。通过重置分支到某个提交并重 新提交新的更改,你可以实现相同的效果。
移动文件:
- mkdir xx : 在当前文件夹下,创建 XX 文件
- git mv hello.rb lib ===>将hello.rb 文件移动到 lib 文件夹下
- git status : 查看到以下的状态
- $ git status
- On branch master
- Changes to be committed:
- (use "git reset HEAD <file>..." to unstage)
- renamed: hello.rb -> lib/hello.rb
- Changes not staged for commit:
- (use "git add <file>..." to update what will be committed)
- (use "git checkout -- <file>..." to discard changes in working directory)
- git commit -m "xxxx" :将此次改变提交
通过使用 Git 来移动文件,我们通知了 Git 两件事:
- 文件 hello.rb 已被删除。
- 文件 lib/hello.rb 已被创建
Git
创建分支
git checkedou -b greet //创建了一个名为greet的新分支
!上面语句是git branch branchname 及 git checkout branchname的简写(branchname:分支名)
导航分支
git checkout master //切换到master主分支
git checkout branchname:切换到分支branchname
当有两个或多个分支时,使用
git hist --all //--all能显示出来所有的分支
合并分支
git merge master //将分支mster合并到当前分支
冲突产生于解决(坑太多,只举个小例子)
将分支切到master,此时更改hello.rb并且提交就会产生冲突。
原因:应为master已经和greet分支合并,但现在在master又有一个新的提交还没有合并回greet,冲突产生。
如果此时返回greet分支并且尝试合并master分支后,查看hello.rb,如图
冲突解决:在hello.rb中改正后,重新提交hello.rb
解决后:
变址vs合并
- 重置greet分支
- 重置master分支
(未知的问题:在重置greet分支后,立即重置master分支出现错误,好像需要重新提交所有文件)
变基失败
实用篇
与远程仓库建立联系remote
查看所有的远程链接信息
git remote -v
查看某个远程连接的详细信息
git remote show [remote-name]
为本地添加一个普通的远程仓库
git remote add pb git://github.com/paulboone/ticgit.git
pb为仓库的别名,后面为仓库的地址
为本地添加一个origin仓库
git remote add origin [仓库url]
重命名远程连接
git remote renamed [old name] [new name]
删除远程仓库
git remote rm [shortname]
pull 和 fetch 的区别:
1.git fetch 相当于是从远程获取最新版本到本地,不会自动merge
git fetch origin master
2.git pull 当于是从远程获取最新版本并merge到本地
git向github提交代码
1. 创建新的版本库
在GitHub中,一个项目对应一个版本库,创建一个新的版本库,就是创建一个新的项目。
在GitHub中创建一个新的版本库后,采取先克隆,再通过推送完成GitHub版本库的初始化。步骤如下:
1.克隆版本库:
git clone git@github.com:mecury/HelloWorld.git //mecury是注册时的名字,HelloWorld是新创建的版本库</br>
2.添加README.md文件并提交(这个也可以直接在GitHub中修改)
git add REAMDE.md
3.向GitHub中推送,完成版本库的初始化
git push origin master
2.从已有的版本库中创建
对于要上传的项目,首先应该建立本地的仓库.
git init //在当前项目的根目录下
向文件中添加README.md文件,并且提交(可以省略)
git add README.md
git commit -m"README for project"
执行推送命令
git push -u origin master
强制推送命令,将会覆盖远程仓库的不同之处
git push -f origin master
退出git的vim编辑器:
1.按 i ,进入insert编辑模式
2. 编辑完成后,按 esc 键
3. 输入 :wq! ,然后回车即可删除
git笔记的更多相关文章
- Git 笔记三 Git的初步使用
Git 笔记三 Git的初步使用 在上一篇中,学习了如何配置Git环境,这一篇,开始学习Git的初步使用.Git的初步使用还是很简单的.总体上知道git init, git clone, git ad ...
- Git 笔记二-Git安装与初始配置
git 笔记二-Git安装与初始配置 Git的安装 由于我日常生活和工作基本上都是在Windows上,因此此处只说windows上的安装.Windows上的安装和其他程序一样,只需要到http://g ...
- Git 笔记一 Git简介
git 笔记一 什么是版本控制 所谓版本控制就是记录对文件的修改记录,这样以后就能回退到需要的 版本.比如你对一段代码进行了几次修改,有几次修改不想要了,如果 使用了版本控制,就可以回退到未做这些修改 ...
- 项目管理---git----快速使用git笔记(七)------coding.net项目管理多人操作的流程规范--合并代码审核
我们在前面已经介绍了coding.net和本地git的基本用法. 但是多人协作开发时情况会复杂得多,所以我们最好有一些规范来保证项目多人开发顺利进行. 比如说 规范一 master代码分支 需要开启 ...
- 项目管理---git----快速使用git笔记(五)------本地项目代码提交到远程仓库---新建项目
上一篇我们已经知道了怎么从远程仓库获取项目文件代码. 项目管理---git----快速使用git笔记(四)------远程项目代码的首次获取 git还有一种使用场景是 我本来在电脑里就有一个项目,现在 ...
- 项目管理---git----快速使用git笔记(四)------远程项目代码的首次获取
使用git最常见的场景是 你需要参与到一个项目中,而这个项目的代码,同事已经上传到github或者https://coding.net了. 这时候他会给你一个项目代码的远程仓库链接. 例如: http ...
- GIT笔记:将项目发布到GITHUB
GIT笔记:将项目发布到GITHUB 本机配置 1.在项目目录初始化GIT $ git init 2.用命令git add告诉Git,把文件添加到仓库 $ git add . // 这里是所有文件,用 ...
- GIT笔记:GITHUB教程【官方自译版】
GIT笔记:将项目发布到GITHUB GITHUB是什么 GitHub是版本控制和协作的代码托管平台.它可以让你和其他人在任何地方一起工作. 1.创建一个新的仓库 存储库通常用于组织单个项目.存储库可 ...
- GIT笔记:将项目发布到码云
GIT笔记:将项目发布到码云 发布步骤 1.码云创建项目 记录下项目的远程地址: https://gitee.com/mrsaber/ms_supplyAndSale.git 2.在本地创建GIT仓库 ...
- Note-Git:Git 笔记
ylbtech-Note-Git:Git 笔记 1.返回顶部 · Git 分支管理: 主干/master.热修正/hotfix.预生产/release.开发develop.个人1(个人.小团队)/f ...
随机推荐
- 一个简易的MysQL性能查询脚本
如下: #!/bin/sh mysqladmin -P3306 -uroot -p ext |\ awk -F"|" \ "BEGIN{ count=0; }" ...
- 深入seajs源码系列三
入口方法 每个程序都有个入口方法,类似于c的main函数,seajs也不例外.系列一的demo在首页使用了seajs.use(),这便是入口方法.入口方法可以接受2个参数,第一个参数为模块名称,第二个 ...
- Cesium原理篇:4Web Workers剖析
JavaScript是单线程的,又是异步的,而最新的HTML5中,通过Web Workers可以在JS中支持多线程开发.这是几个意思?异步还是单线程,这怎么理解?Web Workers又是什么原理?实 ...
- iOS_常用C语言函数
一.随机数: 1.rand(); 范围: 0-无穷大. 特点: 仅第一次随机,其他次都是和第一次相同.常用于调试. 返回值: long 实例: int ...
- Josephus环问题
约瑟夫环问题 问题描述: Josephus问题可以描述为如下的一个游戏:N个人编号从1到N,围坐成一个圆圈,从1号开始传递一个热土豆,经过M次传递后拿着土豆的人离开圈子,由坐在离开的人的后面的人拿起热 ...
- PHP中的__toString方法(实现JS里的链式操作)
_toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错 Catchable fatal error: Object of class String could not be co ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- [Web API] Web API 2 深入系列(4) Action的选择
目录 ApiController HttpActionDescriptor IHttpActionSelector ApiController 在上节中,讲到如何选择并激活对应的IHttpContro ...
- JS实现-页面数据无限加载
在手机端浏览网页时,经常使用一个功能,当我们浏览京东或者淘宝时,页面滑动到底部,我们看到数据自动加载到列表.之前并不知道这些功能是怎么实现的,于是自己在PC浏览器上模拟实现这样的功能.先看看浏览效果: ...
- [Asp.net 5] Logging-新日志系统目录
楼主有个美好的愿望——把asp.net 5所有能看懂的代码一一呈现给大家(比如C++,楼主就看不懂).现在已经做完了依赖注入.多语言.配置文件三部分,比较基础的日志就成为了楼主的下一个目标.下面是楼主 ...