| '\" 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-09-23 |
| .\" Manual: Git Manual |
| .\" Source: Git 2.51.0.315.gbb69721404 |
| .\" Language: English |
| .\" |
| .TH "GIT\-UPDATE\-REF" "1" "2025-09-23" "Git 2\&.51\&.0\&.315\&.gbb6972" "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 |
| \fBgit\fR \fBupdate\-ref\fR [\fB\-m\fR \fI<reason>\fR] [\fB\-\-no\-deref\fR] \fB\-d\fR \fI<ref>\fR [\fI<old\-oid>\fR] |
| \fBgit\fR \fBupdate\-ref\fR [\fB\-m\fR \fI<reason>\fR] [\fB\-\-no\-deref\fR] [\fB\-\-create\-reflog\fR] \fI<ref>\fR \fI<new\-oid>\fR [\fI<old\-oid>\fR] |
| \fBgit\fR \fBupdate\-ref\fR [\fB\-m\fR \fI<reason>\fR] [\fB\-\-no\-deref\fR] \fB\-\-stdin\fR [\fB\-z\fR] [\fB\-\-batch\-updates\fR] |
| .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 |
| With \fB\-\-batch\-updates\fR, update\-ref executes the updates in a batch but allows individual updates to fail due to invalid or incorrect user input, applying only the successful updates\&. However, system\-related errors\(emsuch as I/O failures or memory issues\(emwill result in a full failure of all batched updates\&. Any failed updates will be reported in the following format: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| rejected SP (<old\-oid> | <old\-target>) SP (<new\-oid> | <new\-target>) SP <rejection\-reason> LF |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .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 |