TortoiseGit - 版本回退

http://www.cnblogs.com/McKean/p/6083447.html

1、show log

 

2、点击左上角的master,选择远程的master分支

 

3、右击需要回退到的目标点,选择 Reset "master" to this ...


选择 Hard: Reset working tree and index (discard all local changes)

 

 

4、处理完后,可以看到master分支已经跟orgin/HEAD orgin/master不在一个点上了

 


git 

git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态
git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop恢复。
git reset --hard HASH #返回到某个节点,不保留修改。
  git reset --hard HEAD~1    工作区、仓库区都回退到上一个版
  git reset --hard HEAD^     同 git reset --hard HEAD~1
  
git reset --soft HASH #返回到某个节点。保留修改,本地文件没有改变,需要 git checkout file再commit



git回到上一版本命令

 

git reset是指将当前head的内容重置,不会留log信息。

 

git reset HEAD filename  从暂存区中移除文件

 

git reset --hard HEAD~3  会将最新的3次提交全部重置,就像没有提交过一样。

 

git reset --hard commit (38679ed709fd0a3767b79b93d0fba5bb8dd235f8) 回退到 38679ed709fd0a3767b79b93d0fba5bb8dd235f8 版本

 

根据--soft --mixed --hard,会对working tree和index和HEAD进行重置:

 

git reset --mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息

 

git reset --soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

 

git reset --hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

例如:我要彻底返回在上一次提交以前的版本。git reset --hrad HEAD~1

 

我要回到上一次提交的版本:

 

git reset --hard



回滚单个文件

1.进入到文件所在文件目录,或者能找到文件的路径
查看文件的修改记录

1
 $ git log MainActivity.java

结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
commit 7641210b242a95eed17827dd8159e76bdad6d619Author: ronanhardiman <liqiang.isman@gmail.com>Date:   Mon Apr 29 00:51:00 2013 +0800

    System.currentTimeMillis() 替代 timer 实现 连续两次返回键退出

    System.currentTimeMillis() 替代 timer 实现 连续两次返回键退出commit a4e215234aa4927c85693dca7b68e9976948a35eAuthor: kaxi4it <gyj_android@sina.com>Date:   Sat Apr 27 16:54:48 2013 +0800

    修正了退出程序的BUG

    用INT代替BOOL标记,修正了快速点击返回键一直播放退出动画的BUG,跳转页面后标记commit d31fcc01223407492310c1567a7b84ece1287368Author: yjl <yujilong@eoemobile.com>Date:   Mon Mar 25 12:09:21 2013 +0800

2.回退到指定的版本

1
$ git reset a4e215234aa4927c85693dca7b68e9976948a35e MainActivity.java

结果

1
2
3
Unstaged changes after reset:M       source/src/cn/eoe/app/ui/MainActivity.javasu@SUCHANGLI /e/eoeclient/android-app/source/src/cn/eoe/app/ui (master)

3.提交到本地参考

1
$ git commit -m "revert old file because yjl commmit have a bug"

结果

1
2
3
[master 874e01a] revert old file because yjl commmit have a bug
 1 file changed, 26 insertions(+), 19 deletions(-)su@SUCHANGLI /e/eoeclient/android-app/source/src/cn/eoe/app/ui (master)

4.更新到工作目录

1
$ git checkout MainActivity.java

5.提交到远程仓库

1
$ git push origin master




Your local changes to the following files would be overwritten by merge

error: Your local changes to the following files would be overwritten by merge:



        protected/config/main.php

Please, commit your changes or stash them before you can merge.



参考http://blog.csdn.net/zwhfyy/article/details/8625228



如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:



git stash

git pull

git stash pop

然后可以使用git diff -w +文件名 来确认代码自动合并的情况.



反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:



git reset --hard

git pull

其中git reset是针对版本,如果想针对文件回退本地修改,使用





untracked working tree file

参考:http://blog.csdn.net/sheismylife/article/details/7204345

编写脚本自动编译并部署时的注意



如果想在C2上编写脚本自动从S1上获取最新代码时,要注意:



1.首先之前产生的公钥不能设密码,否则每次git pull的时候都会要求输入密码。



2.不要将项目中的编译中间文件提交到S1上,比如CMake工程里面的build目录的文件,Maven工程里面的target目录里面的文件。否则下次在C2等客户端用git pull会报类似于这样的错误:



error: Untracked working tree file 'public/p_w_picpaths/icon.gif' would be overwritten by merge.

需要执行下面的命令才能修复:



git reset --hard HEAD    

git clean -f -d    

git pull  



git 如何回滚远程仓库版本

关于远程仓库回滚

首先,必须要明白的一件事,任何普通用户不能擅自做有关远程仓库回退的操作,如果你擅自回滚了远程仓库,会对项目团队其他人造成不可预知的影响。如果需要回退版本,先联系项目的仓库管理员,在团队其他人都对自己本地未提交的工作做好备份之后,再进行远程仓库回退操作,操作结束后,团队成员需要重新同步远程仓库后继续自己的工作。

通常回滚远程仓库会有以下三种情形:

1、删除最后一次提交

这种情况是最简单的了,只需要以下两步就可以了

    git revert HEAD
    git push origin master
注意,revertreset的区别:

revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在,而reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。如果还没有理解的话,我们做如下测试:
假设我们有以下三次提交记录:

log

现在我们使用revert放弃最后一次提交,之后执行git log:

    git revert HEAD
    git log

revert

历史记录中还有第三次提交的记录,并且多了一次的提交,但是仓库内容已经回到了第二次提交之后的状态。 现在我们使用reset回到第三次提交,之后执行git log:

    git reset --hard HEAD^
    git log

reset

历史记录中已经没有之前revert生成的提交记录了,现在应该明白了吧。 如果删除远程仓库的最后一次提交的时候不需要保留历史记录的话,可以使用reset,命令如下:

    git reset --hard HEAD^
    git push origin master -f
    
报remote: GitLab: You are not allowed to access master![K
remote: error: hook declined to update refs/heads/master[K
To http://myserver.com/root/push2jump.git
 ! [remote rejected] master -> master (hook declined)
error: failed to push some refs to '

解决方法:
登录gitlab,把分支的保护去掉,打开项目,点击 左上角的 Edit,弹出页上点击  Protected branches,再点击Unprotect,重新 git push -f

-f 参数是强制提交,因为reset之后本地库落后于远程库一个版本,因此需要强制提交。

2、删除历史某次提交

这种情况需要先用git log命令在历史记录中查找到想要删除的某次提交的commit id,比如下图中圈出来的就是注释为"2"的提交的commit id(由此可见提交的注释很重要,一定要认真写)

commit

然后执行以下命令("commit id"替换为想要删除的提交的"commit id",需要注意最后的^号,意思是commit id的前一次提交):

    git rebase -i "commit id"^

执行该条命令之后会打开一个编辑框,内容如下,列出了包含该次提交在内之后的所有提交。

rebase

然后在编辑框中删除你想要删除的提交所在行,然后保存退出就好啦,如果有冲突的需要解决冲突。接下来,执行以下命令,将本地仓库提交到远程库就完成了:

    git push origin master -f

3、修改历史某次提交

这种情况的解决方法类似于第二种情况,只需要在第二条打开编辑框之后,将你想要修改的提交所在行的pick替换成edit然后保存退出,这个时候rebase会停在你要修改的提交,然后做你需要的修改,修改完毕之后,执行以下命令:

    git add .
    git commit --amend
    git rebase --continue

如果你在之前的编辑框修改了n行,也就是说要对n次提交做修改,则需要重复执行以上步骤n次。

需要注意的是,在执行rebase命令对指定提交修改或删除之后,该次提交之后的所有提交的"commit id"都会改变。


Git pull 强制覆盖本地文件


git fetch --all  

git reset --hard origin/master 

git pull