##// END OF EJS Templates
uncommit: document when the commit will be pruned...
Martin von Zweigbergk -
r36991:d63c5c65 default
parent child Browse files
Show More
@@ -1,257 +1,260 b''
1 1 # uncommit - undo the actions of a commit
2 2 #
3 3 # Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
4 4 # Logilab SA <contact@logilab.fr>
5 5 # Pierre-Yves David <pierre-yves.david@ens-lyon.org>
6 6 # Patrick Mezard <patrick@mezard.eu>
7 7 # Copyright 2016 Facebook, Inc.
8 8 #
9 9 # This software may be used and distributed according to the terms of the
10 10 # GNU General Public License version 2 or any later version.
11 11
12 12 """uncommit part or all of a local changeset (EXPERIMENTAL)
13 13
14 14 This command undoes the effect of a local commit, returning the affected
15 15 files to their uncommitted state. This means that files modified, added or
16 16 removed in the changeset will be left unchanged, and so will remain modified,
17 17 added and removed in the working directory.
18 18 """
19 19
20 20 from __future__ import absolute_import
21 21
22 22 from mercurial.i18n import _
23 23
24 24 from mercurial import (
25 25 cmdutil,
26 26 commands,
27 27 context,
28 28 copies,
29 29 error,
30 30 node,
31 31 obsutil,
32 32 pycompat,
33 33 registrar,
34 34 rewriteutil,
35 35 scmutil,
36 36 )
37 37
38 38 cmdtable = {}
39 39 command = registrar.command(cmdtable)
40 40
41 41 configtable = {}
42 42 configitem = registrar.configitem(configtable)
43 43
44 44 configitem('experimental', 'uncommitondirtywdir',
45 45 default=False,
46 46 )
47 47
48 48 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
49 49 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
50 50 # be specifying the version(s) of Mercurial they are tested with, or
51 51 # leave the attribute unspecified.
52 52 testedwith = 'ships-with-hg-core'
53 53
54 54 def _commitfiltered(repo, ctx, match, allowempty):
55 55 """Recommit ctx with changed files not in match. Return the new
56 56 node identifier, or None if nothing changed.
57 57 """
58 58 base = ctx.p1()
59 59 # ctx
60 60 initialfiles = set(ctx.files())
61 61 exclude = set(f for f in initialfiles if match(f))
62 62
63 63 # No files matched commit, so nothing excluded
64 64 if not exclude:
65 65 return None
66 66
67 67 files = (initialfiles - exclude)
68 68 # return the p1 so that we don't create an obsmarker later
69 69 if not files and not allowempty:
70 70 return ctx.parents()[0].node()
71 71
72 72 # Filter copies
73 73 copied = copies.pathcopies(base, ctx)
74 74 copied = dict((dst, src) for dst, src in copied.iteritems()
75 75 if dst in files)
76 76 def filectxfn(repo, memctx, path, contentctx=ctx, redirect=()):
77 77 if path not in contentctx:
78 78 return None
79 79 fctx = contentctx[path]
80 80 mctx = context.memfilectx(repo, memctx, fctx.path(), fctx.data(),
81 81 fctx.islink(),
82 82 fctx.isexec(),
83 83 copied=copied.get(path))
84 84 return mctx
85 85
86 86 new = context.memctx(repo,
87 87 parents=[base.node(), node.nullid],
88 88 text=ctx.description(),
89 89 files=files,
90 90 filectxfn=filectxfn,
91 91 user=ctx.user(),
92 92 date=ctx.date(),
93 93 extra=ctx.extra())
94 94 # phase handling
95 95 commitphase = ctx.phase()
96 96 overrides = {('phases', 'new-commit'): commitphase}
97 97 with repo.ui.configoverride(overrides, 'uncommit'):
98 98 newid = repo.commitctx(new)
99 99 return newid
100 100
101 101 def _fixdirstate(repo, oldctx, newctx, status):
102 102 """ fix the dirstate after switching the working directory from oldctx to
103 103 newctx which can be result of either unamend or uncommit.
104 104 """
105 105 ds = repo.dirstate
106 106 copies = dict(ds.copies())
107 107 s = status
108 108 for f in s.modified:
109 109 if ds[f] == 'r':
110 110 # modified + removed -> removed
111 111 continue
112 112 ds.normallookup(f)
113 113
114 114 for f in s.added:
115 115 if ds[f] == 'r':
116 116 # added + removed -> unknown
117 117 ds.drop(f)
118 118 elif ds[f] != 'a':
119 119 ds.add(f)
120 120
121 121 for f in s.removed:
122 122 if ds[f] == 'a':
123 123 # removed + added -> normal
124 124 ds.normallookup(f)
125 125 elif ds[f] != 'r':
126 126 ds.remove(f)
127 127
128 128 # Merge old parent and old working dir copies
129 129 oldcopies = {}
130 130 for f in (s.modified + s.added):
131 131 src = oldctx[f].renamed()
132 132 if src:
133 133 oldcopies[f] = src[0]
134 134 oldcopies.update(copies)
135 135 copies = dict((dst, oldcopies.get(src, src))
136 136 for dst, src in oldcopies.iteritems())
137 137 # Adjust the dirstate copies
138 138 for dst, src in copies.iteritems():
139 139 if (src not in newctx or dst in newctx or ds[dst] != 'a'):
140 140 src = None
141 141 ds.copy(src, dst)
142 142
143 143 @command('uncommit',
144 144 [('', 'keep', False, _('allow an empty commit after uncommiting')),
145 145 ] + commands.walkopts,
146 146 _('[OPTION]... [FILE]...'))
147 147 def uncommit(ui, repo, *pats, **opts):
148 148 """uncommit part or all of a local changeset
149 149
150 150 This command undoes the effect of a local commit, returning the affected
151 151 files to their uncommitted state. This means that files modified or
152 152 deleted in the changeset will be left unchanged, and so will remain
153 153 modified in the working directory.
154
155 If no files are specified, the commit will be pruned, unless --keep is
156 given.
154 157 """
155 158 opts = pycompat.byteskwargs(opts)
156 159
157 160 with repo.wlock(), repo.lock():
158 161
159 162 if not pats and not repo.ui.configbool('experimental',
160 163 'uncommitondirtywdir'):
161 164 cmdutil.bailifchanged(repo)
162 165 old = repo['.']
163 166 rewriteutil.precheck(repo, [old.rev()], 'uncommit')
164 167 if len(old.parents()) > 1:
165 168 raise error.Abort(_("cannot uncommit merge changeset"))
166 169
167 170 with repo.transaction('uncommit'):
168 171 match = scmutil.match(old, pats, opts)
169 172 allowempty = opts.get('keep') or pats
170 173 newid = _commitfiltered(repo, old, match, allowempty)
171 174 if newid is None:
172 175 ui.status(_("nothing to uncommit\n"))
173 176 return 1
174 177
175 178 mapping = {}
176 179 if newid != old.p1().node():
177 180 # Move local changes on filtered changeset
178 181 mapping[old.node()] = (newid,)
179 182 else:
180 183 # Fully removed the old commit
181 184 mapping[old.node()] = ()
182 185
183 186 scmutil.cleanupnodes(repo, mapping, 'uncommit')
184 187
185 188 with repo.dirstate.parentchange():
186 189 repo.dirstate.setparents(newid, node.nullid)
187 190 s = repo.status(old.p1(), old, match=match)
188 191 _fixdirstate(repo, old, repo[newid], s)
189 192
190 193 def predecessormarkers(ctx):
191 194 """yields the obsolete markers marking the given changeset as a successor"""
192 195 for data in ctx.repo().obsstore.predecessors.get(ctx.node(), ()):
193 196 yield obsutil.marker(ctx.repo(), data)
194 197
195 198 @command('^unamend', [])
196 199 def unamend(ui, repo, **opts):
197 200 """undo the most recent amend operation on a current changeset
198 201
199 202 This command will roll back to the previous version of a changeset,
200 203 leaving working directory in state in which it was before running
201 204 `hg amend` (e.g. files modified as part of an amend will be
202 205 marked as modified `hg status`)
203 206 """
204 207
205 208 unfi = repo.unfiltered()
206 209 with repo.wlock(), repo.lock(), repo.transaction('unamend'):
207 210
208 211 # identify the commit from which to unamend
209 212 curctx = repo['.']
210 213
211 214 rewriteutil.precheck(repo, [curctx.rev()], 'unamend')
212 215
213 216 # identify the commit to which to unamend
214 217 markers = list(predecessormarkers(curctx))
215 218 if len(markers) != 1:
216 219 e = _("changeset must have one predecessor, found %i predecessors")
217 220 raise error.Abort(e % len(markers))
218 221
219 222 prednode = markers[0].prednode()
220 223 predctx = unfi[prednode]
221 224
222 225 # add an extra so that we get a new hash
223 226 # note: allowing unamend to undo an unamend is an intentional feature
224 227 extras = predctx.extra()
225 228 extras['unamend_source'] = curctx.hex()
226 229
227 230 def filectxfn(repo, ctx_, path):
228 231 try:
229 232 return predctx.filectx(path)
230 233 except KeyError:
231 234 return None
232 235
233 236 # Make a new commit same as predctx
234 237 newctx = context.memctx(repo,
235 238 parents=(predctx.p1(), predctx.p2()),
236 239 text=predctx.description(),
237 240 files=predctx.files(),
238 241 filectxfn=filectxfn,
239 242 user=predctx.user(),
240 243 date=predctx.date(),
241 244 extra=extras)
242 245 # phase handling
243 246 commitphase = curctx.phase()
244 247 overrides = {('phases', 'new-commit'): commitphase}
245 248 with repo.ui.configoverride(overrides, 'uncommit'):
246 249 newprednode = repo.commitctx(newctx)
247 250
248 251 newpredctx = repo[newprednode]
249 252 dirstate = repo.dirstate
250 253
251 254 with dirstate.parentchange():
252 255 dirstate.setparents(newprednode, node.nullid)
253 256 s = repo.status(predctx, curctx)
254 257 _fixdirstate(repo, curctx, newpredctx, s)
255 258
256 259 mapping = {curctx.node(): (newprednode,)}
257 260 scmutil.cleanupnodes(repo, mapping, 'unamend')
@@ -1,390 +1,393 b''
1 1 Test uncommit - set up the config
2 2
3 3 $ cat >> $HGRCPATH <<EOF
4 4 > [experimental]
5 5 > evolution.createmarkers=True
6 6 > evolution.allowunstable=True
7 7 > [extensions]
8 8 > uncommit =
9 9 > drawdag=$TESTDIR/drawdag.py
10 10 > EOF
11 11
12 12 Build up a repo
13 13
14 14 $ hg init repo
15 15 $ cd repo
16 16 $ hg bookmark foo
17 17
18 18 Help for uncommit
19 19
20 20 $ hg help uncommit
21 21 hg uncommit [OPTION]... [FILE]...
22 22
23 23 uncommit part or all of a local changeset
24 24
25 25 This command undoes the effect of a local commit, returning the affected
26 26 files to their uncommitted state. This means that files modified or
27 27 deleted in the changeset will be left unchanged, and so will remain
28 28 modified in the working directory.
29 29
30 If no files are specified, the commit will be pruned, unless --keep is
31 given.
32
30 33 (use 'hg help -e uncommit' to show help for the uncommit extension)
31 34
32 35 options ([+] can be repeated):
33 36
34 37 --keep allow an empty commit after uncommiting
35 38 -I --include PATTERN [+] include names matching the given patterns
36 39 -X --exclude PATTERN [+] exclude names matching the given patterns
37 40
38 41 (some details hidden, use --verbose to show complete help)
39 42
40 43 Uncommit with no commits should fail
41 44
42 45 $ hg uncommit
43 46 abort: cannot uncommit null changeset
44 47 (no changeset checked out)
45 48 [255]
46 49
47 50 Create some commits
48 51
49 52 $ touch files
50 53 $ hg add files
51 54 $ for i in a ab abc abcd abcde; do echo $i > files; echo $i > file-$i; hg add file-$i; hg commit -m "added file-$i"; done
52 55 $ ls
53 56 file-a
54 57 file-ab
55 58 file-abc
56 59 file-abcd
57 60 file-abcde
58 61 files
59 62
60 63 $ hg log -G -T '{rev}:{node} {desc}' --hidden
61 64 @ 4:6c4fd43ed714e7fcd8adbaa7b16c953c2e985b60 added file-abcde
62 65 |
63 66 o 3:6db330d65db434145c0b59d291853e9a84719b24 added file-abcd
64 67 |
65 68 o 2:abf2df566fc193b3ac34d946e63c1583e4d4732b added file-abc
66 69 |
67 70 o 1:69a232e754b08d568c4899475faf2eb44b857802 added file-ab
68 71 |
69 72 o 0:3004d2d9b50883c1538fc754a3aeb55f1b4084f6 added file-a
70 73
71 74 Simple uncommit off the top, also moves bookmark
72 75
73 76 $ hg bookmark
74 77 * foo 4:6c4fd43ed714
75 78 $ hg uncommit
76 79 $ hg status
77 80 M files
78 81 A file-abcde
79 82 $ hg bookmark
80 83 * foo 3:6db330d65db4
81 84
82 85 $ hg log -G -T '{rev}:{node} {desc}' --hidden
83 86 x 4:6c4fd43ed714e7fcd8adbaa7b16c953c2e985b60 added file-abcde
84 87 |
85 88 @ 3:6db330d65db434145c0b59d291853e9a84719b24 added file-abcd
86 89 |
87 90 o 2:abf2df566fc193b3ac34d946e63c1583e4d4732b added file-abc
88 91 |
89 92 o 1:69a232e754b08d568c4899475faf2eb44b857802 added file-ab
90 93 |
91 94 o 0:3004d2d9b50883c1538fc754a3aeb55f1b4084f6 added file-a
92 95
93 96
94 97 Recommit
95 98
96 99 $ hg commit -m 'new change abcde'
97 100 $ hg status
98 101 $ hg heads -T '{rev}:{node} {desc}'
99 102 5:0c07a3ccda771b25f1cb1edbd02e683723344ef1 new change abcde (no-eol)
100 103
101 104 Uncommit of non-existent and unchanged files has no effect
102 105 $ hg uncommit nothinghere
103 106 nothing to uncommit
104 107 [1]
105 108 $ hg status
106 109 $ hg uncommit file-abc
107 110 nothing to uncommit
108 111 [1]
109 112 $ hg status
110 113
111 114 Try partial uncommit, also moves bookmark
112 115
113 116 $ hg bookmark
114 117 * foo 5:0c07a3ccda77
115 118 $ hg uncommit files
116 119 $ hg status
117 120 M files
118 121 $ hg bookmark
119 122 * foo 6:3727deee06f7
120 123 $ hg heads -T '{rev}:{node} {desc}'
121 124 6:3727deee06f72f5ffa8db792ee299cf39e3e190b new change abcde (no-eol)
122 125 $ hg log -r . -p -T '{rev}:{node} {desc}'
123 126 6:3727deee06f72f5ffa8db792ee299cf39e3e190b new change abcdediff -r 6db330d65db4 -r 3727deee06f7 file-abcde
124 127 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
125 128 +++ b/file-abcde Thu Jan 01 00:00:00 1970 +0000
126 129 @@ -0,0 +1,1 @@
127 130 +abcde
128 131
129 132 $ hg log -G -T '{rev}:{node} {desc}' --hidden
130 133 @ 6:3727deee06f72f5ffa8db792ee299cf39e3e190b new change abcde
131 134 |
132 135 | x 5:0c07a3ccda771b25f1cb1edbd02e683723344ef1 new change abcde
133 136 |/
134 137 | x 4:6c4fd43ed714e7fcd8adbaa7b16c953c2e985b60 added file-abcde
135 138 |/
136 139 o 3:6db330d65db434145c0b59d291853e9a84719b24 added file-abcd
137 140 |
138 141 o 2:abf2df566fc193b3ac34d946e63c1583e4d4732b added file-abc
139 142 |
140 143 o 1:69a232e754b08d568c4899475faf2eb44b857802 added file-ab
141 144 |
142 145 o 0:3004d2d9b50883c1538fc754a3aeb55f1b4084f6 added file-a
143 146
144 147 $ hg commit -m 'update files for abcde'
145 148
146 149 Uncommit with dirty state
147 150
148 151 $ echo "foo" >> files
149 152 $ cat files
150 153 abcde
151 154 foo
152 155 $ hg status
153 156 M files
154 157 $ hg uncommit
155 158 abort: uncommitted changes
156 159 [255]
157 160 $ hg uncommit files
158 161 $ cat files
159 162 abcde
160 163 foo
161 164 $ hg commit --amend -m "files abcde + foo"
162 165
163 166 Testing the 'experimental.uncommitondirtywdir' config
164 167
165 168 $ echo "bar" >> files
166 169 $ hg uncommit
167 170 abort: uncommitted changes
168 171 [255]
169 172 $ hg uncommit --config experimental.uncommitondirtywdir=True
170 173 $ hg commit -m "files abcde + foo"
171 174
172 175 Uncommit in the middle of a stack, does not move bookmark
173 176
174 177 $ hg checkout '.^^^'
175 178 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
176 179 (leaving bookmark foo)
177 180 $ hg log -r . -p -T '{rev}:{node} {desc}'
178 181 2:abf2df566fc193b3ac34d946e63c1583e4d4732b added file-abcdiff -r 69a232e754b0 -r abf2df566fc1 file-abc
179 182 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
180 183 +++ b/file-abc Thu Jan 01 00:00:00 1970 +0000
181 184 @@ -0,0 +1,1 @@
182 185 +abc
183 186 diff -r 69a232e754b0 -r abf2df566fc1 files
184 187 --- a/files Thu Jan 01 00:00:00 1970 +0000
185 188 +++ b/files Thu Jan 01 00:00:00 1970 +0000
186 189 @@ -1,1 +1,1 @@
187 190 -ab
188 191 +abc
189 192
190 193 $ hg bookmark
191 194 foo 10:48e5bd7cd583
192 195 $ hg uncommit
193 196 3 new orphan changesets
194 197 $ hg status
195 198 M files
196 199 A file-abc
197 200 $ hg heads -T '{rev}:{node} {desc}'
198 201 10:48e5bd7cd583eb24164ef8b89185819c84c96ed7 files abcde + foo (no-eol)
199 202 $ hg bookmark
200 203 foo 10:48e5bd7cd583
201 204 $ hg commit -m 'new abc'
202 205 created new head
203 206
204 207 Partial uncommit in the middle, does not move bookmark
205 208
206 209 $ hg checkout '.^'
207 210 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
208 211 $ hg log -r . -p -T '{rev}:{node} {desc}'
209 212 1:69a232e754b08d568c4899475faf2eb44b857802 added file-abdiff -r 3004d2d9b508 -r 69a232e754b0 file-ab
210 213 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
211 214 +++ b/file-ab Thu Jan 01 00:00:00 1970 +0000
212 215 @@ -0,0 +1,1 @@
213 216 +ab
214 217 diff -r 3004d2d9b508 -r 69a232e754b0 files
215 218 --- a/files Thu Jan 01 00:00:00 1970 +0000
216 219 +++ b/files Thu Jan 01 00:00:00 1970 +0000
217 220 @@ -1,1 +1,1 @@
218 221 -a
219 222 +ab
220 223
221 224 $ hg bookmark
222 225 foo 10:48e5bd7cd583
223 226 $ hg uncommit file-ab
224 227 1 new orphan changesets
225 228 $ hg status
226 229 A file-ab
227 230
228 231 $ hg heads -T '{rev}:{node} {desc}\n'
229 232 12:8eb87968f2edb7f27f27fe676316e179de65fff6 added file-ab
230 233 11:5dc89ca4486f8a88716c5797fa9f498d13d7c2e1 new abc
231 234 10:48e5bd7cd583eb24164ef8b89185819c84c96ed7 files abcde + foo
232 235
233 236 $ hg bookmark
234 237 foo 10:48e5bd7cd583
235 238 $ hg commit -m 'update ab'
236 239 $ hg status
237 240 $ hg heads -T '{rev}:{node} {desc}\n'
238 241 13:f21039c59242b085491bb58f591afc4ed1c04c09 update ab
239 242 11:5dc89ca4486f8a88716c5797fa9f498d13d7c2e1 new abc
240 243 10:48e5bd7cd583eb24164ef8b89185819c84c96ed7 files abcde + foo
241 244
242 245 $ hg log -G -T '{rev}:{node} {desc}' --hidden
243 246 @ 13:f21039c59242b085491bb58f591afc4ed1c04c09 update ab
244 247 |
245 248 o 12:8eb87968f2edb7f27f27fe676316e179de65fff6 added file-ab
246 249 |
247 250 | * 11:5dc89ca4486f8a88716c5797fa9f498d13d7c2e1 new abc
248 251 | |
249 252 | | * 10:48e5bd7cd583eb24164ef8b89185819c84c96ed7 files abcde + foo
250 253 | | |
251 254 | | | x 9:8a6b58c173ca6a2e3745d8bd86698718d664bc6c files abcde + foo
252 255 | | |/
253 256 | | | x 8:39ad452c7f684a55d161c574340c5766c4569278 update files for abcde
254 257 | | |/
255 258 | | | x 7:0977fa602c2fd7d8427ed4e7ee15ea13b84c9173 update files for abcde
256 259 | | |/
257 260 | | * 6:3727deee06f72f5ffa8db792ee299cf39e3e190b new change abcde
258 261 | | |
259 262 | | | x 5:0c07a3ccda771b25f1cb1edbd02e683723344ef1 new change abcde
260 263 | | |/
261 264 | | | x 4:6c4fd43ed714e7fcd8adbaa7b16c953c2e985b60 added file-abcde
262 265 | | |/
263 266 | | * 3:6db330d65db434145c0b59d291853e9a84719b24 added file-abcd
264 267 | | |
265 268 | | x 2:abf2df566fc193b3ac34d946e63c1583e4d4732b added file-abc
266 269 | |/
267 270 | x 1:69a232e754b08d568c4899475faf2eb44b857802 added file-ab
268 271 |/
269 272 o 0:3004d2d9b50883c1538fc754a3aeb55f1b4084f6 added file-a
270 273
271 274 Uncommit with draft parent
272 275
273 276 $ hg uncommit
274 277 $ hg phase -r .
275 278 12: draft
276 279 $ hg commit -m 'update ab again'
277 280
278 281 Uncommit with public parent
279 282
280 283 $ hg phase -p "::.^"
281 284 $ hg uncommit
282 285 $ hg phase -r .
283 286 12: public
284 287
285 288 Partial uncommit with public parent
286 289
287 290 $ echo xyz > xyz
288 291 $ hg add xyz
289 292 $ hg commit -m "update ab and add xyz"
290 293 $ hg uncommit xyz
291 294 $ hg status
292 295 A xyz
293 296 $ hg phase -r .
294 297 16: draft
295 298 $ hg phase -r ".^"
296 299 12: public
297 300
298 301 Uncommit leaving an empty changeset
299 302
300 303 $ cd $TESTTMP
301 304 $ hg init repo1
302 305 $ cd repo1
303 306 $ hg debugdrawdag <<'EOS'
304 307 > Q
305 308 > |
306 309 > P
307 310 > EOS
308 311 $ hg up Q -q
309 312 $ hg uncommit --keep
310 313 $ hg log -G -T '{desc} FILES: {files}'
311 314 @ Q FILES:
312 315 |
313 316 | x Q FILES: Q
314 317 |/
315 318 o P FILES: P
316 319
317 320 $ hg status
318 321 A Q
319 322
320 323 $ cd ..
321 324 $ rm -rf repo1
322 325
323 326 Testing uncommit while merge
324 327
325 328 $ hg init repo2
326 329 $ cd repo2
327 330
328 331 Create some history
329 332
330 333 $ touch a
331 334 $ hg add a
332 335 $ for i in 1 2 3; do echo $i > a; hg commit -m "a $i"; done
333 336 $ hg checkout 0
334 337 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
335 338 $ touch b
336 339 $ hg add b
337 340 $ for i in 1 2 3; do echo $i > b; hg commit -m "b $i"; done
338 341 created new head
339 342 $ hg log -G -T '{rev}:{node} {desc}' --hidden
340 343 @ 5:2cd56cdde163ded2fbb16ba2f918c96046ab0bf2 b 3
341 344 |
342 345 o 4:c3a0d5bb3b15834ffd2ef9ef603e93ec65cf2037 b 2
343 346 |
344 347 o 3:49bb009ca26078726b8870f1edb29fae8f7618f5 b 1
345 348 |
346 349 | o 2:990982b7384266e691f1bc08ca36177adcd1c8a9 a 3
347 350 | |
348 351 | o 1:24d38e3cf160c7b6f5ffe82179332229886a6d34 a 2
349 352 |/
350 353 o 0:ea4e33293d4d274a2ba73150733c2612231f398c a 1
351 354
352 355
353 356 Add and expect uncommit to fail on both merge working dir and merge changeset
354 357
355 358 $ hg merge 2
356 359 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
357 360 (branch merge, don't forget to commit)
358 361
359 362 $ hg uncommit
360 363 abort: outstanding uncommitted merge
361 364 [255]
362 365
363 366 $ hg uncommit --config experimental.uncommitondirtywdir=True
364 367 abort: cannot uncommit while merging
365 368 [255]
366 369
367 370 $ hg status
368 371 M a
369 372 $ hg commit -m 'merge a and b'
370 373
371 374 $ hg uncommit
372 375 abort: cannot uncommit merge changeset
373 376 [255]
374 377
375 378 $ hg status
376 379 $ hg log -G -T '{rev}:{node} {desc}' --hidden
377 380 @ 6:c03b9c37bc67bf504d4912061cfb527b47a63c6e merge a and b
378 381 |\
379 382 | o 5:2cd56cdde163ded2fbb16ba2f918c96046ab0bf2 b 3
380 383 | |
381 384 | o 4:c3a0d5bb3b15834ffd2ef9ef603e93ec65cf2037 b 2
382 385 | |
383 386 | o 3:49bb009ca26078726b8870f1edb29fae8f7618f5 b 1
384 387 | |
385 388 o | 2:990982b7384266e691f1bc08ca36177adcd1c8a9 a 3
386 389 | |
387 390 o | 1:24d38e3cf160c7b6f5ffe82179332229886a6d34 a 2
388 391 |/
389 392 o 0:ea4e33293d4d274a2ba73150733c2612231f398c a 1
390 393
General Comments 0
You need to be logged in to leave comments. Login now