git 获取历史版本的几种方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git 获取历史版本的几种方式相关的知识,希望对你有一定的参考价值。
我们简单的描述一个例子:a)初始化操作
有两个文件file1.txt和file2.txt
1, 初始化的时候就有这两个文件
操作:
git init
git status
git add .
git commit -m “init version”
2, 在master分支上修改了file1.txt,并提交
操作:
(修改file1.txt)
git add file1.txt
git commit -m “change file1”
3, 然后新建分支banana,并切换到banana分支上
操作:
git branch banana
git checkout banana
4, 修改file1.txt和file2.txt,并提交。
操作:
(修改file1.txt和file2.txt)
git add file1.txt file2.txt
git commit -m “change by banana”
这个时候,我们可以输入 gitk,查看一下当前的版本情况。如下图:git-001
5, 然后,切换到master分支上,修改file2.txt,并提交。
操作:
git checkout master
(修改file2.txt)
git add file2.txt
git commit -m “change by master”
输入gitk,查看当前版本情况,如下图:git-002
b)发现问题需要查看历史版本
我们现在发现当前的版本有点问题,还不能提交到版本库。
1,我们需要从git commit中返回.
则输入:
git reset --soft HEAD^
解释一下,HEAD是当前分支的最新版本。^表示父节点。当前节点的父节点,就是上一次提交的版本。也就是标记为“change file1”的版本。
问为什么不是”change by banana”这个版本呢?不同的分支哦。”change by banana”是banana分支的最新代码,和master分支不同的。
这个时候输入
git status
看看,是不是显示file2.txt修改了没有提交呢。
2,我们需要从git add中返回
再仔细查看之后,我们发现file2.txt真的写错了,需要返回到git add之前的状态。
输入:
git reset -q file2.txt
这个时候,file2.txt就回到了解放前了。用git status查看一下,file2.txt是”change not staged for commit”状态。
3,回到没有做过的情况
我们最终确定,最后一次修改的file2.txt是无用的代码,我们需要废弃掉。
注意,这个操作不能恢复的哦。
git reset --hard
这个命令,不能指定具体的文件。是把当前的修改全部清除,恢复到最后一次提交的版本。
这个时候,用gitk查看一下:git-003
已经彻底回复到了“change file 1”的版本了。
4,直接回复到某个版本
我们现在切换到banana分支。
git checkout banana
然后用gitk看一下。可以看出,我们之前的操作,对banana分支一点影响也没有。现在我们需要把banana分支回复到初始状态,但是当前的改动的代码还是需要留着。我们可以看,init版本是当前版本的父节点的父节点。我们可以这么操作:
git reset --soft HEAD^^
然后用gitk看一下:git-004
最近的版本已经变成了init version了。所有的改动都是add未提交状态。
5,得到当前最新代码
最后。我们把file1.txt和file2.txt都删掉。我们需要从版本库中取得当前最新的代码。
很简单:
git checkout master
如果是要banana分支的最新代码,则:
git checkout banana
以上的操作,我们知道了如何查看版本分支,和如何回复到以前的版本。 参考技术A 直接co版本的hash值就是。
AngularJS中获取数据源的几种方式
在AngularJS中,可以从$rootScope中获取数据源,也可以把获取数据的逻辑封装在service中,然后注入到app.run函数中,或者注入到controller中。本篇就来整理获取数据的几种方式。
■ 数据源放在$rootScope中
var app = angular.module("app",[]); app.run(function($rootScope){ $rootScope.todos = [ {item:"",done:true}, {item:"",done:false} ]; }) <div ng-repeat="todo in todos"> {{todo.item}} </div> <form> <input type="text" ng-model="newTodo" /> <input type="submit" ng-click=""todos.push({item:newTodo, done:false}) /> </form>
以上,把数据源放在$rootScope中的某个字段中,很容易被重写。
■ 数据源放在service中,把servie注入到run函数中
app.service("TodoService", function(){ this.todos = [ {item:"",done:true}, {item:"",done:false} ]; }) app.run(function($rootScope, TodoService){ $rootScope.TodoService = TodoService; }) <div ng-repeat="todo in TodoService.todos"> {{todo.item}} </div> <form> <input type="text" ng-model="newTodo" /> <input type="submit" ng-click=""TodoService.todos.push({item:newTodo, done:false}) /> </form>
在html中似乎这样写比较好:
<input type="submit" ng-click=""TodoService.todos.addodo(newTodo) />
在service中增加一个方法:
app.service("TodoService", function(){ this.todos = [ {item:"",done:true}, {item:"",done:false} ]; this.addTodo = fucntion(newTodo){ this.todos.push({item:newTodo, done:false}) } })
■ 数据源放在service中,把servie注入到controller中
app.controller("TodoCtrl", function($scope, TodoService){ this.TodoService = TodoServce; })
在对应的html中:
<body ng-app="app" ng-controller="TodoCtrl as todoCtrl">
<div ng-repeat="todo in todoCtrl.TodoService.todos">
{{todo.item}}
</div>
</body>
<form>
<input type="text" ng-model="newTodo" />
<input type="submit" ng-click="todoCtrl.TodoService.addTodo(newTodo)"/>
</form>
■ 数据源放在service中,把servie注入到controller中,与服务端交互
在实际项目中,service还需要和服务端交互。
var app = angular.module("app",[]); app.service("TodoService", function($q, $timeout){ this.getTodos = function(){ var d = $q.defer(); //模拟一个请求 $timeout(function(){ d.resolve([ {item:"", done:false}, ... ]) },3000); return d.promise; } this.addTodo = function(item){ this.todos.push({item:item, done:false}); } }) app.controller("TodoCtrl", function(TodoService){ var todoCtrl = this; TodoService.getTodos().then(function(result){ todoCtrl.todos = result; }) todoCtrl.addTodo = TodoService.addTodo; })
以上是关于git 获取历史版本的几种方式的主要内容,如果未能解决你的问题,请参考以下文章