]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/git-read-tree.txt
Merge branch 'eg/config-type-path-docfix'
[thirdparty/git.git] / Documentation / git-read-tree.txt
CommitLineData
2cf565c5
DG
1git-read-tree(1)
2================
2cf565c5
DG
3
4NAME
5----
5f3aa197 6git-read-tree - Reads tree information into the index
2cf565c5
DG
7
8
9SYNOPSIS
10--------
7791a1d9 11[verse]
e8eeda1f 12'git read-tree' [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>)
491a7575 13 [-u | -i]] [--index-output=<file>] [--no-sparse-checkout]
fb1bb965 14 (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])
ccef66b5 15
2cf565c5
DG
16
17DESCRIPTION
18-----------
5f3aa197 19Reads the tree information given by <tree-ish> into the index,
c1bdacf9 20but does not actually *update* any of the files it "caches". (see:
5162e697 21linkgit:git-checkout-index[1])
2cf565c5 22
5f3aa197 23Optionally, it can merge a tree into the index, perform a
61f693bd
JL
24fast-forward (i.e. 2-way) merge, or a 3-way merge, with the `-m`
25flag. When used with `-m`, the `-u` flag causes it to also update
ccef66b5 26the files in the work tree with the result of the merge.
2cf565c5 27
0b444cdb
TR
28Trivial merges are done by 'git read-tree' itself. Only conflicting paths
29will be in unmerged state when 'git read-tree' returns.
2cf565c5
DG
30
31OPTIONS
32-------
33-m::
3f41f5a9 34 Perform a merge, not just a read. The command will
35 refuse to run if your index file has unmerged entries,
36 indicating that you have not finished previous merge you
37 started.
ccef66b5 38
2db0bfbc 39--reset::
b5a0bd69 40 Same as -m, except that unmerged entries are discarded instead
0e29222e
EN
41 of failing. When used with `-u`, updates leading to loss of
42 working tree changes or untracked files or directories will not
43 abort the operation.
2db0bfbc 44
ccef66b5
JH
45-u::
46 After a successful merge, update the files in the work
47 tree with the result of the merge.
2cf565c5 48
f318dd22
JH
49-i::
50 Usually a merge requires the index file as well as the
cc1a2b66 51 files in the working tree to be up to date with the
f318dd22
JH
52 current head commit, in order not to lose local
53 changes. This flag disables the check with the working
54 tree and is meant to be used when creating a merge of
55 trees that are not directly related to the current
56 working tree status into a temporary index file.
57
ea5070c9
JL
58-n::
59--dry-run::
60 Check if the command would error out, without updating the index
a58088ab 61 or the files in the working tree for real.
ea5070c9 62
22e801f2
MV
63-v::
64 Show the progress of checking files out.
65
6da08783 66--trivial::
0b444cdb 67 Restrict three-way merge by 'git read-tree' to happen
6da08783
JN
68 only if there is no file-level merging required, instead
69 of resolving merge for trivial cases and leaving
70 conflicting files unresolved in the index.
71
afaa8d66 72--aggressive::
0b444cdb 73 Usually a three-way merge by 'git read-tree' resolves
afaa8d66 74 the merge for really trivial cases and leaves other
cc1a2b66 75 cases unresolved in the index, so that porcelains can
afaa8d66 76 implement different merge policies. This flag makes the
cc1a2b66 77 command resolve a few more cases internally:
afaa8d66
JH
78+
79* when one side removes a path and the other side leaves the path
80 unmodified. The resolution is to remove that path.
81* when both sides remove a path. The resolution is to remove that path.
cc1a2b66 82* when both sides add a path identically. The resolution
afaa8d66
JH
83 is to add that path.
84
30221a33 85--prefix=<prefix>::
f4c6f2d3 86 Keep the current index contents, and read the contents
5c951ef4
CB
87 of the named tree-ish under the directory at `<prefix>`.
88 The command will refuse to overwrite entries that already
30221a33 89 existed in the original index file.
f4c6f2d3 90
5e7f56ac
JH
91--index-output=<file>::
92 Instead of writing the results out to `$GIT_INDEX_FILE`,
93 write the resulting index in the named file. While the
94 command is operating, the original index file is locked
95 with the same mechanism as usual. The file must allow
96 to be rename(2)ed into from a temporary file that is
97 created next to the usual index file; typically this
98 means it needs to be on the same filesystem as the index
99 file itself, and you need write permission to the
100 directories the index file and index output file are
101 located in.
102
25804914 103--[no-]recurse-submodules::
acbfae32 104 Using --recurse-submodules will update the content of all active
25804914 105 submodules according to the commit recorded in the superproject by
b3cec573 106 calling read-tree recursively, also setting the submodules' HEAD to be
25804914
SB
107 detached at that commit.
108
a5d07d0f
NTND
109--no-sparse-checkout::
110 Disable sparse checkout support even if `core.sparseCheckout`
111 is true.
112
fb1bb965
JK
113--empty::
114 Instead of reading tree object(s) into the index, just empty
115 it.
116
3e41485d
NTND
117-q::
118--quiet::
119 Quiet, suppress feedback messages.
120
2cf565c5
DG
121<tree-ish#>::
122 The id of the tree object(s) to be read/merged.
123
124
76a8788c 125MERGING
2cf565c5 126-------
0b444cdb 127If `-m` is specified, 'git read-tree' can perform 3 kinds of
ccef66b5 128merge, a single tree merge if only 1 tree is given, a
9932242f 129fast-forward merge with 2 trees, or a 3-way merge if 3 or more trees are
2cf565c5
DG
130provided.
131
ccef66b5 132
2cf565c5
DG
133Single Tree Merge
134~~~~~~~~~~~~~~~~~
0b444cdb 135If only 1 tree is specified, 'git read-tree' operates as if the user did not
61f693bd 136specify `-m`, except that if the original index has an entry for a
73252839 137given pathname, and the contents of the path match with the tree
5f3aa197
LS
138being read, the stat info from the index is used. (In other words, the
139index's stat()s take precedence over the merged tree's).
2cf565c5 140
b1889c36 141That means that if you do a `git read-tree -m <newtree>` followed by a
0b444cdb 142`git checkout-index -f -u -a`, the 'git checkout-index' only checks out
2cf565c5
DG
143the stuff that really changed.
144
0b444cdb
TR
145This is used to avoid unnecessary false hits when 'git diff-files' is
146run after 'git read-tree'.
2cf565c5 147
c8596009
JH
148
149Two Tree Merge
150~~~~~~~~~~~~~~
151
b1889c36 152Typically, this is invoked as `git read-tree -m $H $M`, where $H
c8596009
JH
153is the head commit of the current repository, and $M is the head
154of a foreign tree, which is simply ahead of $H (i.e. we are in a
a75d7b54 155fast-forward situation).
c8596009 156
0b444cdb 157When two trees are specified, the user is telling 'git read-tree'
c8596009
JH
158the following:
159
df8baa42 160 1. The current index and work tree is derived from $H, but
73252839 161 the user may have local changes in them since $H.
c8596009 162
df8baa42 163 2. The user wants to fast-forward to $M.
c8596009 164
b1889c36 165In this case, the `git read-tree -m $H $M` command makes sure
c8596009 166that no local change is lost as the result of this "merge".
73252839
MG
167Here are the "carry forward" rules, where "I" denotes the index,
168"clean" means that index and work tree coincide, and "exists"/"nothing"
169refer to the presence of a path in the specified commit:
c8596009 170
c08fd638 171....
73252839 172 I H M Result
c8596009 173 -------------------------------------------------------
71928f7f
MG
174 0 nothing nothing nothing (does not happen)
175 1 nothing nothing exists use M
176 2 nothing exists nothing remove path from index
73252839 177 3 nothing exists exists, use M if "initial checkout",
55218834 178 H == M keep index otherwise
73252839 179 exists, fail
55218834 180 H != M
c8596009
JH
181
182 clean I==H I==M
183 ------------------
71928f7f
MG
184 4 yes N/A N/A nothing nothing keep index
185 5 no N/A N/A nothing nothing keep index
c8596009 186
71928f7f
MG
187 6 yes N/A yes nothing exists keep index
188 7 no N/A yes nothing exists keep index
189 8 yes N/A no nothing exists fail
190 9 no N/A no nothing exists fail
c8596009 191
5f3aa197 192 10 yes yes N/A exists nothing remove path from index
c8596009
JH
193 11 no yes N/A exists nothing fail
194 12 yes no N/A exists nothing fail
195 13 no no N/A exists nothing fail
196
73252839 197 clean (H==M)
c8596009
JH
198 ------
199 14 yes exists exists keep index
200 15 no exists exists keep index
201
202 clean I==H I==M (H!=M)
203 ------------------
204 16 yes no no exists exists fail
205 17 no no no exists exists fail
206 18 yes no yes exists exists keep index
207 19 no no yes exists exists keep index
208 20 yes yes no exists exists use M
209 21 no yes no exists exists fail
c08fd638 210....
c8596009 211
5f3aa197 212In all "keep index" cases, the index entry stays as in the
73252839 213original index file. If the entry is not up to date,
0b444cdb 214'git read-tree' keeps the copy in the work tree intact when
c8596009
JH
215operating under the -u flag.
216
0b444cdb 217When this form of 'git read-tree' returns successfully, you can
73252839 218see which of the "local changes" that you made were carried forward by running
b1889c36 219`git diff-index --cached $M`. Note that this does not
73252839 220necessarily match what `git diff-index --cached $H` would have
c8596009 221produced before such a two tree merge. This is because of cases
70661d28 22218 and 19 -- if you already had the changes in $M (e.g. maybe
b1889c36 223you picked it up via e-mail in a patch form), `git diff-index
61f693bd 224--cached $H` would have told you about the change before this
b1889c36 225merge, but it would not show in `git diff-index --cached $M`
73252839 226output after the two-tree merge.
c8596009 227
73252839 228Case 3 is slightly tricky and needs explanation. The result from this
55218834 229rule logically should be to remove the path if the user staged the removal
79fd4cc7 230of the path and then switching to a new branch. That however will prevent
55218834 231the initial checkout from happening, so the rule is modified to use M (new
73252839 232tree) only when the content of the index is empty. Otherwise the removal
55218834 233of the path is kept as long as $H and $M are the same.
c8596009 234
2cf565c5
DG
2353-Way Merge
236~~~~~~~~~~~
237Each "index" entry has two bits worth of "stage" state. stage 0 is the
238normal one, and is the only one you'd see in any kind of normal use.
239
0b444cdb 240However, when you do 'git read-tree' with three trees, the "stage"
2cf565c5
DG
241starts out at 1.
242
243This means that you can do
244
61f693bd 245----------------
b1889c36 246$ git read-tree -m <tree1> <tree2> <tree3>
61f693bd 247----------------
2cf565c5
DG
248
249and you will end up with an index with all of the <tree1> entries in
250"stage1", all of the <tree2> entries in "stage2" and all of the
bb6d7b89
JH
251<tree3> entries in "stage3". When performing a merge of another
252branch into the current branch, we use the common ancestor tree
253as <tree1>, the current branch head as <tree2>, and the other
254branch head as <tree3>.
2cf565c5 255
0b444cdb 256Furthermore, 'git read-tree' has special-case logic that says: if you see
2cf565c5
DG
257a file that matches in all respects in the following states, it
258"collapses" back to "stage0":
259
260 - stage 2 and 3 are the same; take one or the other (it makes no
bb6d7b89
JH
261 difference - the same work has been done on our branch in
262 stage 2 and their branch in stage 3)
2cf565c5
DG
263
264 - stage 1 and stage 2 are the same and stage 3 is different; take
bb6d7b89
JH
265 stage 3 (our branch in stage 2 did not do anything since the
266 ancestor in stage 1 while their branch in stage 3 worked on
267 it)
2cf565c5
DG
268
269 - stage 1 and stage 3 are the same and stage 2 is different take
bb6d7b89 270 stage 2 (we did something while they did nothing)
2cf565c5 271
0b444cdb 272The 'git write-tree' command refuses to write a nonsensical tree, and it
2cf565c5
DG
273will complain about unmerged entries if it sees a single entry that is not
274stage 0.
275
abda1ef5 276OK, this all sounds like a collection of totally nonsensical rules,
2cf565c5
DG
277but it's actually exactly what you want in order to do a fast
278merge. The different stages represent the "result tree" (stage 0, aka
279"merged"), the original tree (stage 1, aka "orig"), and the two trees
280you are trying to merge (stage 2 and 3 respectively).
281
ccef66b5 282The order of stages 1, 2 and 3 (hence the order of three
06ab60c0 283<tree-ish> command-line arguments) are significant when you
ccef66b5
JH
284start a 3-way merge with an index file that is already
285populated. Here is an outline of how the algorithm works:
2cf565c5
DG
286
287- if a file exists in identical format in all three trees, it will
0b444cdb 288 automatically collapse to "merged" state by 'git read-tree'.
2cf565c5
DG
289
290- a file that has _any_ difference what-so-ever in the three trees
2c6e4771 291 will stay as separate entries in the index. It's up to "porcelain
2cf565c5 292 policy" to determine how to remove the non-0 stages, and insert a
ccef66b5 293 merged version.
2cf565c5
DG
294
295- the index file saves and restores with all this information, so you
296 can merge things incrementally, but as long as it has entries in
abda1ef5 297 stages 1/2/3 (i.e., "unmerged entries") you can't write the result. So
2cf565c5
DG
298 now the merge algorithm ends up being really simple:
299
300 * you walk the index in order, and ignore all entries of stage 0,
301 since they've already been done.
302
303 * if you find a "stage1", but no matching "stage2" or "stage3", you
304 know it's been removed from both trees (it only existed in the
305 original tree), and you remove that entry.
306
307 * if you find a matching "stage2" and "stage3" tree, you remove one
308 of them, and turn the other into a "stage0" entry. Remove any
309 matching "stage1" entry if it exists too. .. all the normal
310 trivial rules ..
311
0b444cdb
TR
312You would normally use 'git merge-index' with supplied
313'git merge-one-file' to do this last step. The script updates
bb6d7b89
JH
314the files in the working tree as it merges each path and at the
315end of a successful merge.
ccef66b5
JH
316
317When you start a 3-way merge with an index file that is already
318populated, it is assumed that it represents the state of the
319files in your work tree, and you can even have files with
320changes unrecorded in the index file. It is further assumed
321that this state is "derived" from the stage 2 tree. The 3-way
322merge refuses to run if it finds an entry in the original index
323file that does not match stage 2.
324
325This is done to prevent you from losing your work-in-progress
bb6d7b89
JH
326changes, and mixing your random changes in an unrelated merge
327commit. To illustrate, suppose you start from what has been
37425065 328committed last to your repository:
ccef66b5 329
61f693bd 330----------------
b1889c36
JN
331$ JC=`git rev-parse --verify "HEAD^0"`
332$ git checkout-index -f -u -a $JC
61f693bd 333----------------
ccef66b5 334
0b444cdb 335You do random edits, without running 'git update-index'. And then
ccef66b5
JH
336you notice that the tip of your "upstream" tree has advanced
337since you pulled from him:
338
61f693bd 339----------------
b1889c36 340$ git fetch git://.... linus
96890f4c 341$ LT=`git rev-parse FETCH_HEAD`
61f693bd 342----------------
ccef66b5
JH
343
344Your work tree is still based on your HEAD ($JC), but you have
345some edits since. Three-way merge makes sure that you have not
5f3aa197 346added or modified index entries since $JC, and if you haven't,
ccef66b5
JH
347then does the right thing. So with the following sequence:
348
61f693bd 349----------------
b1889c36
JN
350$ git read-tree -m -u `git merge-base $JC $LT` $JC $LT
351$ git merge-index git-merge-one-file -a
61f693bd 352$ echo "Merge with Linus" | \
b1889c36 353 git commit-tree `git write-tree` -p $JC -p $LT
61f693bd 354----------------
ccef66b5 355
61f693bd 356what you would commit is a pure merge between $JC and $LT without
ccef66b5
JH
357your work-in-progress changes, and your work tree would be
358updated to the result of the merge.
359
bb6d7b89 360However, if you have local changes in the working tree that
0b444cdb 361would be overwritten by this merge, 'git read-tree' will refuse
bb6d7b89
JH
362to run to prevent your changes from being lost.
363
364In other words, there is no need to worry about what exists only
365in the working tree. When you have local changes in a part of
366the project that is not involved in the merge, your changes do
367not interfere with the merge, and are kept intact. When they
0b444cdb 368*do* interfere, the merge does not even start ('git read-tree'
bb6d7b89
JH
369complains loudly and fails without modifying anything). In such
370a case, you can simply continue doing what you were in the
371middle of doing, and when your working tree is ready (i.e. you
372have finished your work-in-progress), attempt the merge again.
373
2cf565c5 374
76a8788c 375SPARSE CHECKOUT
ed5336a7
NTND
376---------------
377
5d4b2933
EN
378Note: The skip-worktree capabilities in linkgit:git-update-index[1]
379and `read-tree` predated the introduction of
380linkgit:git-sparse-checkout[1]. Users are encouraged to use the
381`sparse-checkout` command in preference to these plumbing commands for
382sparse-checkout/skip-worktree related needs. However, the information
383below might be useful to users trying to understand the pattern style
384used in non-cone mode of the `sparse-checkout` command.
9023535b 385
cc1a2b66 386"Sparse checkout" allows populating the working directory sparsely.
9023535b
EN
387It uses the skip-worktree bit (see linkgit:git-update-index[1]) to
388tell Git whether a file in the working directory is worth looking at.
ed5336a7 389
cc1a2b66
MG
390'git read-tree' and other merge-based commands ('git merge', 'git
391checkout'...) can help maintaining the skip-worktree bitmap and working
ed5336a7 392directory update. `$GIT_DIR/info/sparse-checkout` is used to
cc1a2b66
MG
393define the skip-worktree reference bitmap. When 'git read-tree' needs
394to update the working directory, it resets the skip-worktree bit in the index
ed5336a7 395based on this file, which uses the same syntax as .gitignore files.
9023535b
EN
396If an entry matches a pattern in this file, or the entry corresponds to
397a file present in the working tree, then skip-worktree will not be
1f1f575e 398set on that entry. Otherwise, skip-worktree will be set.
ed5336a7
NTND
399
400Then it compares the new skip-worktree value with the previous one. If
1f1f575e
MG
401skip-worktree turns from set to unset, it will add the corresponding
402file back. If it turns from unset to set, that file will be removed.
ed5336a7
NTND
403
404While `$GIT_DIR/info/sparse-checkout` is usually used to specify what
cc1a2b66
MG
405files are in, you can also specify what files are _not_ in, using
406negate patterns. For example, to remove the file `unwanted`:
ed5336a7
NTND
407
408----------------
5e821231 409/*
ed5336a7
NTND
410!unwanted
411----------------
412
cc1a2b66 413Another tricky thing is fully repopulating the working directory when you
ed5336a7 414no longer want sparse checkout. You cannot just disable "sparse
cc1a2b66
MG
415checkout" because skip-worktree bits are still in the index and your working
416directory is still sparsely populated. You should re-populate the working
ed5336a7
NTND
417directory with the `$GIT_DIR/info/sparse-checkout` file content as
418follows:
419
420----------------
5e821231 421/*
ed5336a7
NTND
422----------------
423
cc1a2b66
MG
424Then you can disable sparse checkout. Sparse checkout support in 'git
425read-tree' and similar commands is disabled by default. You need to
08aefc9e
NTND
426turn `core.sparseCheckout` on in order to have sparse checkout
427support.
ed5336a7
NTND
428
429
56ae8df5 430SEE ALSO
c1bdacf9 431--------
63a36017
NJ
432linkgit:git-write-tree[1], linkgit:git-ls-files[1],
433linkgit:gitignore[5], linkgit:git-sparse-checkout[1]
2cf565c5 434
2cf565c5
DG
435GIT
436---
9e1f0a85 437Part of the linkgit:git[1] suite