Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
git
提交
3459c2c4
G
git
项目概览
李少辉-开发者
/
git
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
git
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
3459c2c4
编写于
8月 29, 2005
作者:
J
Junio C Hamano
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add [HOWTO] revert/branch/rebase.
Signed-off-by:
N
Junio C Hamano
<
junkio@cox.net
>
上级
bc4af68a
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
199 addition
and
0 deletion
+199
-0
Documentation/howto/revert-branch-rebase.txt
Documentation/howto/revert-branch-rebase.txt
+199
-0
未找到文件。
Documentation/howto/revert-branch-rebase.txt
0 → 100644
浏览文件 @
3459c2c4
From: Junio C Hamano <junkio@cox.net>
To: git@vger.kernel.org
Subject: [HOWTO] Reverting an existing commit
Abstract: In this article, JC gives a small real-life example of using
'git revert' command, and using a temporary branch and tag for safety
and easier sanity checking.
Date: Mon, 29 Aug 2005 21:39:02 -0700
Content-type: text/asciidoc
Message-ID: <7voe7g3uop.fsf@assigned-by-dhcp.cox.net>
Reverting an existing commit
============================
One of the changes I pulled into the 'master' branch turns out to
break building GIT with GCC 2.95. While they were well intentioned
portability fixes, keeping things working with gcc-2.95 was also
important. Here is what I did to revert the change in the 'master'
branch and to adjust the 'pu' branch, using core GIT tools and
barebone Porcelain.
First, prepare a throw-away branch in case I screw things up.
------------------------------------------------
$ git checkout -b revert-c99 master
------------------------------------------------
Now I am on the 'revert-c99' branch. Let's figure out which commit to
revert. I happen to know that the top of the 'master' branch is a
merge, and its second parent (i.e. foreign commit I merged from) has
the change I would want to undo. Further I happen to know that that
merge introduced 5 commits or so:
------------------------------------------------
$ git show-branch --more=4 master master^2 | head
! [master] Merge refs/heads/portable from http://www.cs.berkeley....
! [master^2] Replace C99 array initializers with code.
--
+ [master] Merge refs/heads/portable from http://www.cs.berkeley....
++ [master^2] Replace C99 array initializers with code.
++ [master^2~1] Replace unsetenv() and setenv() with older putenv().
++ [master^2~2] Include sys/time.h in daemon.c.
++ [master^2~3] Fix ?: statements.
++ [master^2~4] Replace zero-length array decls with [].
+ [master~1] tutorial note about git branch
------------------------------------------------
The '--more=4' above means "after we reach the merge base of refs,
show until we display four more common commits". That last commit
would have been where the "portable" branch was forked from the main
git.git repository, so this would show everything on both branches
since then. I just limited the output to the first handful using
'head'.
Now I know 'master^2~4' (pronounce it as "find the second parent of
the 'master', and then go four generations back following the first
parent") is the one I would want to revert. Since I also want to say
why I am reverting it, the '-n' flag is given to 'git revert'. This
prevents it from actually making a commit, and instead 'git revert'
leaves the commit log message it wanted to use in '.msg' file:
------------------------------------------------
$ git revert -n master^2~4
$ cat .msg
Revert "Replace zero-length array decls with []."
This reverts 6c5f9baa3bc0d63e141e0afc23110205379905a4 commit.
$ git diff HEAD ;# to make sure what we are reverting makes sense.
$ make CC=gcc-2.95 clean test ;# make sure it fixed the breakage.
$ make clean test ;# make sure it did not cause other breakage.
------------------------------------------------
The reverted change makes sense (from reading the 'diff' output), does
fix the problem (from 'make CC=gcc-2.95' test), and does not cause new
breakage (from the last 'make test'). I'm ready to commit:
------------------------------------------------
$ git commit -a -s ;# read .msg into the log,
# and explain why I am reverting.
------------------------------------------------
I could have screwed up in any of the above steps, but in the worst
case I could just have done 'git checkout master' to start over.
Fortunately I did not have to; what I have in the current branch
'revert-c99' is what I want. So merge that back into 'master':
------------------------------------------------
$ git checkout master
$ git resolve master revert-c99 fast ;# this should be a fast forward
Updating from 10d781b9caa4f71495c7b34963bef137216f86a8 to e3a693c...
cache.h | 8 ++++----
commit.c | 2 +-
ls-files.c | 2 +-
receive-pack.c | 2 +-
server-info.c | 2 +-
5 files changed, 8 insertions(+), 8 deletions(-)
------------------------------------------------
The 'fast' in the above 'git resolve' is not a magic. I knew this
'resolve' would result in a fast forward merge, and if not, there is
something very wrong (so I would do 'git reset' on the 'master' branch
and examine the situation). When a fast forward merge is done, the
message parameter to 'git resolve' is discarded, because no new commit
is created. You could have said 'junk' or 'nothing' there as well.
There is no need to redo the test at this point. We fast forwarded
and we know 'master' matches 'revert-c99' exactly. In fact:
------------------------------------------------
$ git diff master..revert-c99
------------------------------------------------
says nothing.
Then we rebase the 'pu' branch as usual.
------------------------------------------------
$ git checkout pu
$ git tag pu-anchor pu
$ git rebase master
* Applying: Redo "revert" using three-way merge machinery.
First trying simple merge strategy to cherry-pick.
Finished one cherry-pick.
* Applying: Remove git-apply-patch-script.
First trying simple merge strategy to cherry-pick.
Simple cherry-pick fails; trying Automatic cherry-pick.
Removing Documentation/git-apply-patch-script.txt
Removing git-apply-patch-script
Finished one cherry-pick.
* Applying: Document "git cherry-pick" and "git revert"
First trying simple merge strategy to cherry-pick.
Finished one cherry-pick.
* Applying: mailinfo and applymbox updates
First trying simple merge strategy to cherry-pick.
Finished one cherry-pick.
* Applying: Show commits in topo order and name all commits.
First trying simple merge strategy to cherry-pick.
Finished one cherry-pick.
* Applying: More documentation updates.
First trying simple merge strategy to cherry-pick.
Finished one cherry-pick.
------------------------------------------------
The temporary tag 'pu-anchor' is me just being careful, in case 'git
rebase' screws up. After this, I can do these for sanity check:
------------------------------------------------
$ git diff pu-anchor..pu ;# make sure we got the master fix.
$ make CC=gcc-2.95 clean test ;# make sure it fixed the breakage.
$ make clean test ;# make sure it did not cause other breakage.
------------------------------------------------
Everything is in the good order. I do not need the temporary branch
nor tag anymore, so remove them:
------------------------------------------------
$ rm -f .git/refs/tags/pu-anchor .git/refs/heads/revert-c99
------------------------------------------------
It was an emergency fix, so we might as well merge it into the
'release candidate' branch, although I expect the next release would
be some days off:
------------------------------------------------
$ git checkout rc
$ git pull . master
Packing 0 objects
Unpacking 0 objects
* committish: e3a693c... refs/heads/master from .
Trying to merge e3a693c... into 8c1f5f0... using 10d781b...
Committed merge 7fb9b7262a1d1e0a47bbfdcbbcf50ce0635d3f8f
cache.h | 8 ++++----
commit.c | 2 +-
ls-files.c | 2 +-
receive-pack.c | 2 +-
server-info.c | 2 +-
5 files changed, 8 insertions(+), 8 deletions(-)
------------------------------------------------
And the final repository status looks like this:
------------------------------------------------
$ git show-branch --more=1 master pu rc
! [master] Revert "Replace zero-length array decls with []."
! [pu] git-repack-script: Add option to repack all objects.
* [rc] Merge refs/heads/master from .
---
+ [pu] git-repack-script: Add option to repack all objects.
+ [pu~1] More documentation updates.
+ [pu~2] Show commits in topo order and name all commits.
+ [pu~3] mailinfo and applymbox updates
+ [pu~4] Document "git cherry-pick" and "git revert"
+ [pu~5] Remove git-apply-patch-script.
+ [pu~6] Redo "revert" using three-way merge machinery.
+ [rc] Merge refs/heads/master from .
+++ [master] Revert "Replace zero-length array decls with []."
+ [rc~1] Merge refs/heads/master from .
+++ [master~1] Merge refs/heads/portable from http://www.cs.berkeley....
------------------------------------------------
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录