R7R5和R75哪个收益高

git中reset和revert用法和区别
一. reset的hard,soft,mixed参数区别
git reset :和git add命令作用相反,撤销add操作,把index区内容撤销到working
git reset的--hard& --mixed&
--soft参数区别:
hard:把working directory和index区的内容都重置为指定的commit 版本
soft:保留现在working directory和index区的内容,HEAD指向制定的commit 版本
mixed:保留working区的内容,将index区和HEAD内容都修恢复到指定的commit版本
reset和revert区别
reset是回朔到指定的commit版本(指定commit版本之后的操作都消失了)。revert是删除指定的commit操作的内容(指定的版本内容消失,之前和之后commit版本内的操作都保留),但是这个操作也会做了一个commit提交版本。
加入有三次提交分别提交了3个文件a.txt,b.txt,c.txt。
git& log --pretty=oneline 会显示如下:
b61b1ca0af7293b6307b1aca5a7991 add c
1ce388e2fadd42cf7ad79e add b
f86e6dd1c863b6eefd2ed4ded77fdf5 add a
我们分别做一下reset操作和revert操作对比一下效果:
1.使用git reset --hard HEAD^
&& ls当前目录,发现只有a.txt,b.txt。
&& git log
--pretty=oneline内容如下:
1ce388e2fadd42cf7ad79e add b
f86e6dd1c863b6eefd2ed4ded77fdf5 add a
2.若使用git revert
HEAD^(注:若你已经进行了上面reset的操作,要先恢复到最开始的版本,才能比较差别)
ls当前目录,发现只有a.txt,c.txt
&&& git log
--pretty=oneline内容如下:
&&&&&&&&&&&
aae855fe4f1d5c77aed2f992f27e72d2c642bfc3 Revert "git revert
&&&&&&&&&&&
b61b1ca0af7293b6307b1aca5a7991 add c
&&&&&&&&&&&
1ce388e2fadd42cf7ad79e add b
&&&&&&&&&&&
f86e6dd1c863b6eefd2ed4ded77fdf5 add a
到此,上面的应该看的很明显了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。标签:至少1个,最多5个
博客原文地址:
题记:团队中大多数成员使用 sourceTree 和 github 两款 git 工具,然而大家对于图形化工具提供的 reset,checkout,revert 功能点并不是很了解,甚至于混淆,然后凭借猜测去使用。功夫不负有心人,在尝试过多次冲突处理或分支开发的坑后,终于形成了自己的一套使用方式,可喜可贺。然而问题的解决方案的并不是效率最高的,内部的执行过程我们也不清楚,这对于一个自律的程序艺术家是无法接受的。基于这个问题,翻译这篇博客,为 git 中高级用户的 undo 操作提供参考。鼓励在熟悉命令行操作再通过图形化工具提高开发效率。水平有限,释疑为主,翻译为辅
and Revert
原文地址:
git reset, git checkout, git revert
命令是最有用的三条 git 命令。他们可以帮助你撤销 repo 的一些操作,并且前两条命令既可以用于 commit 级别,也可以用于 file 级别。
因为他们很相似,所以很容易混淆。这片文章,我们将比较他们的相同和不同之处。
阅读本文前需要了解 git
的三大 components,分别是 working directory(代码仓库)
staged snapshot(快照:add的缓存库)
commit history(commit历史) ,这将更好的帮助你理解这三条命令。
commit 级别的操作
传递给 git reset 和
git checkout的参数会决定命令的作用范围。当命令并不包括含一个文件路径时,命令作用于整个 commit。
在 commit 级别上,git reset 命令移动 HEAD 到当前分支的一个 commit, 这可以用来撤销当前分支的一些 commit 。
例如,下面的命令会让 `hotfix` 分支回退两个 commits
git checkout hotfix
git reset HEAD~2
先前在 HEAD 之前的两次 commit 现在处在 HEAD 之后,这意味着他们在下一次 git 提交时被作为垃圾删掉,换句话说这两次提交会被抛弃。如下图所示:
git reset用于撤销未被提交到远端的改动。除了可以移动当前分支的HEAD,你可以通过不同的标记选择修改 staged snapshot 或者 working directory
--soft: staged snapshot 和 working directory 都未被改变 (建议在命令行执行后,再输入 git status 查看状态)
--mixed: staged snapshot 被更新, working directory 未被更改。【这是默认选项】(建议同上)
staged snapshot 和 working directory
都将回退。
--hard 很危险,它会直接回退你之前所有的修改,使用前,可以事先保存 commit id.
【这些标记经常和HEAD一起使用。例如,git reset --mixed HEAD可撤销所有缓存改动,但是保留他们在工作目录下。git reset --hard HEAD可彻底删除没有提交的改动。】
到现在为止,你应该已经熟悉 commit 级别的 git checkout 了。当你传送一个 branch name 名字时,你将更换当前的分支.
git checkout hotfix
上面的命令会切换 HEAD 到不同的分支,并且更新当前的 working directory 去匹配。因为会覆盖当前的本地更改,所以更换分支前git强制你彻底放弃或者提交存储当前的更改。不同于 git reset, git checkout 不会废弃任何分支或提交。
你也可以 checkout 到任何一次 commit,通过提供 commit Id 作为参数.
比如下面的命令。
git checkout HEAD~2/[commit id]
这对于 review repo 的某个 version 的代码很有用。然而,如果再次添加新的提交就无法返回原先的状态。因此,你应该在修改前总是创建一个新的分支。
git revert 命令通过创建一次新的 commit 来撤销一次 commit 所做出的修改。这种撤销的方式是安全的,因为它并不修改 commitm history, 比如下边的命令将会查出倒数第二次(即当前commit的往前一次)提交的修改,并创建一个新的提交,用于撤销当前提交的上一次 commit。
git checkout hotfix
git revert HEAD~2
如下图所示:
File 级别的操作
git reset 和 git checkout 命令同样可以接受一个可选的文件路径作为参数,这样可以将操作限制在一个单独的文件中。
当调用一个文件路径时,git reset 命令会更新 staged snapshot 去匹配某次 commit。 下面的命令将会使文件回退一个 commit。
HEAD~1 [文件](不建议使用)
【--soft、--mixed、--hard标记此时不起作用,会更新staged snapshot,但不更新working directory】
git checkout 命令 和
类似,除了它会更新 working directory, 而不是 staged snapshot
如下命令将会更新 working directory 去匹配某次 commit
git checkout HEAD~1 [文件]
common user cases
Discard commits in a private branch or throw away uncommited changes
Unstage a file
git checkot
switch between branches or inspect old snapshot
git checkout
Discard changes in
working directory
git revert
Undo commits in a public branch
git revert
6 收藏&&|&&56
你可能感兴趣的文章
3 收藏,597
git checkout HEAD~1 [文件] 会更新 working directory和 staged snapshot 呀
分享到微博?
技术专栏,帮你记录编程中的点滴,提升你对技术的理解收藏感兴趣的文章,丰富自己的知识库
明天提醒我
我要该,理由是:
扫扫下载 Appgit 回退到某版本后,想再前进…… · Ruby China
A状态:代码版本A
B状态:代码版本B(比A状态时增加了图片、代码)
这时,git add.  git commit -m"" 。push之前,意识到忘了让git忽略图片的添加,就:
git reset --hard HEAD^
然后在.gitignore中加了句:app/assets/image,(以为这下会忽略图片上传)
然后git add. git commit -m"" git push了
这时,我以为效果是:B状态的一切还在,push了代码版本B,只是忽略了图片……
可结果是:B状态一切消失了(代码、图片都没了),一切还原到代码版本A……
请问:怎样回到B状态?
要用git fsck --lost-found去找了
git reset --hard cat .git/ORIG_HEAD ?
git reflog 列出近期修改,找到要的 hash 然后 reset。
问题可能在这里,git reset --hard HEAD,“--hard”在这里是搞破坏的。
86 gewang@LM-SHC-:28:53:~/test
=& git init git-revert-change
Initialized empty Git repository in /Users/gewang/test/git-revert-change/.git/
87 gewang@LM-SHC-:28:57:~/test
=& cd git-revert-change/
88 gewang@LM-SHC-:28:58:~/test/git-revert-change
=& git config user.name 'loveky'
89 gewang@LM-SHC-:29:07:~/test/git-revert-change
=& git config user.email ''
90 gewang@LM-SHC-:29:15:~/test/git-revert-change
=& touch a b c
91 gewang@LM-SHC-:29:22:~/test/git-revert-change
=& git status -s
92 gewang@LM-SHC-:29:24:~/test/git-revert-change
=& git add .
93 gewang@LM-SHC-:29:26:~/test/git-revert-change
=& git commit -m "initial drop"
[master (root-commit) 9e3ca95] initial drop
0 files changed
create mode 100644 a
create mode 100644 b
create mode 100644 c
#此时为状态A
94 gewang@LM-SHC-:29:32:~/test/git-revert-change (master)
=& git log -1
commit 9e3ca95aa23bd433acaa
Author: loveky &&
Thu Jul 18 09:29:32
initial drop
97 gewang@LM-SHC-:30:03:~/test/git-revert-change (master)
=& touch code image
98 gewang@LM-SHC-:30:07:~/test/git-revert-change (master)
=& git status -s
99 gewang@LM-SHC-:30:09:~/test/git-revert-change (master)
=& git add .
100 gewang@LM-SHC-:30:12:~/test/git-revert-change (master)
=& git commit -m "add code & image"
[master 15a573d] add code & image
0 files changed
create mode 100644 code
create mode 100644 image
# 此时为状态B
101 gewang@LM-SHC-:30:21:~/test/git-revert-change (master)
=& git log -2
commit 15a573d0eea96be3e11e3b19f7aa7c6
Author: loveky &&
Thu Jul 18 09:30:21
add code & image
commit 9e3ca95aa23bd433acaa
Author: loveky &&
Thu Jul 18 09:29:32
initial drop
102 gewang@LM-SHC-:30:25:~/test/git-revert-change (master)
=& git reset --hard HEAD^
HEAD is now at 9e3ca95 initial drop
# 通过reset --hard回到状态A
103 gewang@LM-SHC-:30:40:~/test/git-revert-change (master)
# 所有B的change已经回滚, 可以通过查看reflog找到reset之前HEAD指向的commit,也就是B
104 gewang@LM-SHC-:30:42:~/test/git-revert-change (master)
=& git reflog
9e3ca95 HEAD@{0}: reset: moving to HEAD^
15a573d HEAD@{1}: commit: add code & image &&&&&
倒数第2条,即回滚之前的HEAD, commit B
9e3ca95 HEAD@{2}: commit (initial): initial drop
# 然后把B中的tree拿出来覆盖index和workspace,但HEAD依旧指向A
105 gewang@LM-SHC-:32:27:~/test/git-revert-change (master)
=& git checkout HEAD@{1} -- .
# 可以看到B里添加的2个文件在index中
106 gewang@LM-SHC-:34:09:~/test/git-revert-change (master)
=& git status -s
# 将image从index中移除
112 gewang@LM-SHC-:40:48:~/test/git-revert-change (master)
=& git rm --cached image
rm 'image'
# 此时image已经成为untrack的状态
113 gewang@LM-SHC-:41:01:~/test/git-revert-change (master)
=& git status -s
# 将image添加到.gitignore
114 gewang@LM-SHC-:41:03:~/test/git-revert-change (master)
=& echo image && .gitignore
# 看到B已经被忽略,多出来.gitignore。可以将其加入版本控制,也可以忽略它
115 gewang@LM-SHC-:41:13:~/test/git-revert-change (master)
=& git status -s
?? .gitignore
# 选择忽略它
116 gewang@LM-SHC-:41:15:~/test/git-revert-change (master)
=& echo .gitignore && .gitignore
117 gewang@LM-SHC-:41:40:~/test/git-revert-change (master)
=& git status -s
# 重新commit,大功告成
118 gewang@LM-SHC-:41:43:~/test/git-revert-change (master)
=& git commit -m "I'm good now"
[master 099a28f] I'm good now
0 files changed
create mode 100644 code
119 gewang@LM-SHC-:41:58:~/test/git-revert-change (master)
=& git log
commit 099a28f3e19aa7102fad41c95ef28a6d89f8b438
Author: loveky &&
Thu Jul 18 09:41:58
I'm good now
commit 9e3ca95aa23bd433acaa
Author: loveky &&
Thu Jul 18 09:29:32
initial drop
120 gewang@LM-SHC-:42:00:~/test/git-revert-change (master)
=& git log --name-status
commit 099a28f3e19aa7102fad41c95ef28a6d89f8b438
Author: loveky &&
Thu Jul 18 09:41:58
I'm good now
commit 9e3ca95aa23bd433acaa
Author: loveky &&
Thu Jul 18 09:29:32
initial drop
昨天也遇到了类似的情况,我的简化版操作:
# 撤销 commit 操作
git reset --soft HEAD@{1}
# 撤销 add 操作
git reset HEAD hello.png
谢谢,感动得一塌糊涂:)
那个……我已经执行到“git rm --cached image”移除图片那一步了,但我要移除的是整个文件夹(图片好多好多),用“git rm --cached app/assets/image/”可以吗?貌似提示“fatal: not removing 'app/assets/image' recursively without -r”
git help rm
Allow recursive removal when a leading directory name is given.
-r参数就是干这个的,跟系统的rm命令一样,递归删除
谢谢,搞定了,好开心:)关注了你微博哦……
谢谢亲们:)
有时间可以翻翻pro git那本书的前3章,网上有中文版的
后方可回复, 如果你还没有账号请点击这里 。
共收到 13 条回复}

我要回帖

更多关于 R5和R7 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信