git-update-ref.1 (8897B)
- '\" t
- .\" Title: git-update-ref
- .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
- .\" Generator: DocBook XSL Stylesheets v1.79.2 <http://docbook.sf.net/>
- .\" Date: 2025-03-14
- .\" Manual: Git Manual
- .\" Source: Git 2.49.0
- .\" Language: English
- .\"
- .TH "GIT\-UPDATE\-REF" "1" "2025-03-14" "Git 2\&.49\&.0" "Git Manual"
- .\" -----------------------------------------------------------------
- .\" * Define some portability stuff
- .\" -----------------------------------------------------------------
- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- .\" http://bugs.debian.org/507673
- .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- .ie \n(.g .ds Aq \(aq
- .el .ds Aq '
- .\" -----------------------------------------------------------------
- .\" * set default formatting
- .\" -----------------------------------------------------------------
- .\" disable hyphenation
- .nh
- .\" disable justification (adjust text to left margin only)
- .ad l
- .\" -----------------------------------------------------------------
- .\" * MAIN CONTENT STARTS HERE *
- .\" -----------------------------------------------------------------
- .SH "NAME"
- git-update-ref \- Update the object name stored in a ref safely
- .SH "SYNOPSIS"
- .sp
- .nf
- \fIgit update\-ref\fR [\-m <reason>] [\-\-no\-deref] (\-d <ref> [<old\-oid>] | [\-\-create\-reflog] <ref> <new\-oid> [<old\-oid>] | \-\-stdin [\-z])
- .fi
- .SH "DESCRIPTION"
- .sp
- Given two arguments, stores the <new\-oid> in the <ref>, possibly dereferencing the symbolic refs\&. E\&.g\&. \fBgit\fR \fBupdate\-ref\fR \fBHEAD\fR \fI<new\-oid>\fR updates the current branch head to the new object\&.
- .sp
- Given three arguments, stores the <new\-oid> in the <ref>, possibly dereferencing the symbolic refs, after verifying that the current value of the <ref> matches <old\-oid>\&. E\&.g\&. \fBgit\fR \fBupdate\-ref\fR \fBrefs/heads/master\fR \fI<new\-oid>\fR \fI<old\-oid>\fR updates the master branch head to <new\-oid> only if its current value is <old\-oid>\&. You can specify 40 "0" or an empty string as <old\-oid> to make sure that the ref you are creating does not exist\&.
- .sp
- The final arguments are object names; this command without any options does not support updating a symbolic ref to point to another ref (see \fBgit-symbolic-ref\fR(1))\&. But \fBgit\fR \fBupdate\-ref\fR \fB\-\-stdin\fR does have the \fBsymref\-\fR* commands so that regular refs and symbolic refs can be committed in the same transaction\&.
- .sp
- If \-\-no\-deref is given, <ref> itself is overwritten, rather than the result of following the symbolic pointers\&.
- .sp
- With \fB\-d\fR, it deletes the named <ref> after verifying that it still contains <old\-oid>\&.
- .sp
- With \fB\-\-stdin\fR, update\-ref reads instructions from standard input and performs all modifications together\&. Specify commands of the form:
- .sp
- .if n \{\
- .RS 4
- .\}
- .nf
- update SP <ref> SP <new\-oid> [SP <old\-oid>] LF
- create SP <ref> SP <new\-oid> LF
- delete SP <ref> [SP <old\-oid>] LF
- verify SP <ref> [SP <old\-oid>] LF
- symref\-update SP <ref> SP <new\-target> [SP (ref SP <old\-target> | oid SP <old\-oid>)] LF
- symref\-create SP <ref> SP <new\-target> LF
- symref\-delete SP <ref> [SP <old\-target>] LF
- symref\-verify SP <ref> [SP <old\-target>] LF
- option SP <opt> LF
- start LF
- prepare LF
- commit LF
- abort LF
- .fi
- .if n \{\
- .RE
- .\}
- .sp
- With \fB\-\-create\-reflog\fR, update\-ref will create a reflog for each ref even if one would not ordinarily be created\&.
- .sp
- Quote fields containing whitespace as if they were strings in C source code; i\&.e\&., surrounded by double\-quotes and with backslash escapes\&. Use 40 "0" characters or the empty string to specify a zero value\&. To specify a missing value, omit the value and its preceding SP entirely\&.
- .sp
- Alternatively, use \fB\-z\fR to specify in NUL\-terminated format, without quoting:
- .sp
- .if n \{\
- .RS 4
- .\}
- .nf
- update SP <ref> NUL <new\-oid> NUL [<old\-oid>] NUL
- create SP <ref> NUL <new\-oid> NUL
- delete SP <ref> NUL [<old\-oid>] NUL
- verify SP <ref> NUL [<old\-oid>] NUL
- symref\-update SP <ref> NUL <new\-target> [NUL (ref NUL <old\-target> | oid NUL <old\-oid>)] NUL
- symref\-create SP <ref> NUL <new\-target> NUL
- symref\-delete SP <ref> [NUL <old\-target>] NUL
- symref\-verify SP <ref> [NUL <old\-target>] NUL
- option SP <opt> NUL
- start NUL
- prepare NUL
- commit NUL
- abort NUL
- .fi
- .if n \{\
- .RE
- .\}
- .sp
- In this format, use 40 "0" to specify a zero value, and use the empty string to specify a missing value\&.
- .sp
- In either format, values can be specified in any form that Git recognizes as an object name\&. Commands in any other format or a repeated <ref> produce an error\&. Command meanings are:
- .PP
- update
- .RS 4
- Set <ref> to <new\-oid> after verifying <old\-oid>, if given\&. Specify a zero <new\-oid> to ensure the ref does not exist after the update and/or a zero <old\-oid> to make sure the ref does not exist before the update\&.
- .RE
- .PP
- create
- .RS 4
- Create <ref> with <new\-oid> after verifying that it does not exist\&. The given <new\-oid> may not be zero\&.
- .RE
- .PP
- delete
- .RS 4
- Delete <ref> after verifying that it exists with <old\-oid>, if given\&. If given, <old\-oid> may not be zero\&.
- .RE
- .PP
- symref\-update
- .RS 4
- Set <ref> to <new\-target> after verifying <old\-target> or <old\-oid>, if given\&. Specify a zero <old\-oid> to ensure that the ref does not exist before the update\&.
- .RE
- .PP
- verify
- .RS 4
- Verify <ref> against <old\-oid> but do not change it\&. If <old\-oid> is zero or missing, the ref must not exist\&.
- .RE
- .sp
- symref\-create: Create symbolic ref <ref> with <new\-target> after verifying that it does not exist\&.
- .PP
- symref\-delete
- .RS 4
- Delete <ref> after verifying that it exists with <old\-target>, if given\&.
- .RE
- .PP
- symref\-verify
- .RS 4
- Verify symbolic <ref> against <old\-target> but do not change it\&. If <old\-target> is missing, the ref must not exist\&. Can only be used in
- \fBno\-deref\fR
- mode\&.
- .RE
- .PP
- option
- .RS 4
- Modify the behavior of the next command naming a <ref>\&. The only valid option is
- \fBno\-deref\fR
- to avoid dereferencing a symbolic ref\&.
- .RE
- .PP
- start
- .RS 4
- Start a transaction\&. In contrast to a non\-transactional session, a transaction will automatically abort if the session ends without an explicit commit\&. This command may create a new empty transaction when the current one has been committed or aborted already\&.
- .RE
- .PP
- prepare
- .RS 4
- Prepare to commit the transaction\&. This will create lock files for all queued reference updates\&. If one reference could not be locked, the transaction will be aborted\&.
- .RE
- .PP
- commit
- .RS 4
- Commit all reference updates queued for the transaction, ending the transaction\&.
- .RE
- .PP
- abort
- .RS 4
- Abort the transaction, releasing all locks if the transaction is in prepared state\&.
- .RE
- .sp
- If all <ref>s can be locked with matching <old\-oid>s simultaneously, all modifications are performed\&. Otherwise, no modifications are performed\&. Note that while each individual <ref> is updated or deleted atomically, a concurrent reader may still see a subset of the modifications\&.
- .SH "LOGGING UPDATES"
- .sp
- If config parameter "core\&.logAllRefUpdates" is true and the ref is one under "refs/heads/", "refs/remotes/", "refs/notes/", or a pseudoref like HEAD or ORIG_HEAD; or the file "$GIT_DIR/logs/<ref>" exists then \fBgit\fR \fBupdate\-ref\fR will append a line to the log file "$GIT_DIR/logs/<ref>" (dereferencing all symbolic refs before creating the log name) describing the change in ref value\&. Log lines are formatted as:
- .sp
- .if n \{\
- .RS 4
- .\}
- .nf
- oldsha1 SP newsha1 SP committer LF
- .fi
- .if n \{\
- .RE
- .\}
- .sp
- Where "oldsha1" is the 40 character hexadecimal value previously stored in <ref>, "newsha1" is the 40 character hexadecimal value of <new\-oid> and "committer" is the committer\(cqs name, email address and date in the standard Git committer ident format\&.
- .sp
- Optionally with \-m:
- .sp
- .if n \{\
- .RS 4
- .\}
- .nf
- oldsha1 SP newsha1 SP committer TAB message LF
- .fi
- .if n \{\
- .RE
- .\}
- .sp
- Where all fields are as described above and "message" is the value supplied to the \-m option\&.
- .sp
- An update will fail (without changing <ref>) if the current user is unable to create a new log file, append to the existing log file or does not have committer information available\&.
- .SH "NOTES"
- .sp
- Symbolic refs were initially implemented using symbolic links\&. This is now deprecated since not all filesystems support symbolic links\&.
- .sp
- This command follows \fBreal\fR symlinks only if they start with "refs/": otherwise it will just try to read them and update them as a regular file (i\&.e\&. it will allow the filesystem to follow them, but will overwrite such a symlink to somewhere else with a regular filename)\&.
- .SH "SEE ALSO"
- .sp
- \fBgit-symbolic-ref\fR(1)
- .SH "GIT"
- .sp
- Part of the \fBgit\fR(1) suite