forked from mirrors/jj
jj git push
docs: document safety checks
As discussed in https://discord.com/channels/968932220549103686/1226363798483636265/1226415448615288864
This commit is contained in:
parent
5e7cb3435e
commit
a30df323bd
3 changed files with 56 additions and 0 deletions
|
@ -189,6 +189,18 @@ pub struct GitCloneArgs {
|
||||||
/// `remote_branches(remote=<remote>)..@`. Use `--branch` to push specific
|
/// `remote_branches(remote=<remote>)..@`. Use `--branch` to push specific
|
||||||
/// branches. Use `--all` to push all branches. Use `--change` to generate
|
/// branches. Use `--all` to push all branches. Use `--change` to generate
|
||||||
/// branch names based on the change IDs of specific commits.
|
/// branch names based on the change IDs of specific commits.
|
||||||
|
///
|
||||||
|
/// Before the command actually moves, creates, or deletes a remote branch, it
|
||||||
|
/// makes several [safety checks]. If there is a problem, you may need to run
|
||||||
|
/// `jj git fetch --remote <remote name>` and/or resolve some [branch
|
||||||
|
/// conflicts].
|
||||||
|
///
|
||||||
|
/// [safety checks]:
|
||||||
|
/// https://martinvonz.github.io/jj/latest/branches/#pushing-branches-safety-checks
|
||||||
|
///
|
||||||
|
/// [branch conflicts]:
|
||||||
|
/// https://martinvonz.github.io/jj/latest/branches/#conflicts
|
||||||
|
|
||||||
#[derive(clap::Args, Clone, Debug)]
|
#[derive(clap::Args, Clone, Debug)]
|
||||||
#[command(group(ArgGroup::new("specific").args(&["branch", "change", "revisions"]).multiple(true)))]
|
#[command(group(ArgGroup::new("specific").args(&["branch", "change", "revisions"]).multiple(true)))]
|
||||||
#[command(group(ArgGroup::new("what").args(&["all", "deleted", "tracked"]).conflicts_with("specific")))]
|
#[command(group(ArgGroup::new("what").args(&["all", "deleted", "tracked"]).conflicts_with("specific")))]
|
||||||
|
|
|
@ -914,6 +914,12 @@ Push to a Git remote
|
||||||
|
|
||||||
By default, pushes any branches pointing to `remote_branches(remote=<remote>)..@`. Use `--branch` to push specific branches. Use `--all` to push all branches. Use `--change` to generate branch names based on the change IDs of specific commits.
|
By default, pushes any branches pointing to `remote_branches(remote=<remote>)..@`. Use `--branch` to push specific branches. Use `--all` to push all branches. Use `--change` to generate branch names based on the change IDs of specific commits.
|
||||||
|
|
||||||
|
Before the command actually moves, creates, or deletes a remote branch, it makes several [safety checks]. If there is a problem, you may need to run `jj git fetch --remote <remote name>` and/or resolve some [branch conflicts].
|
||||||
|
|
||||||
|
[safety checks]: https://martinvonz.github.io/jj/latest/branches/#pushing-branches-safety-checks
|
||||||
|
|
||||||
|
[branch conflicts]: https://martinvonz.github.io/jj/latest/branches/#conflicts
|
||||||
|
|
||||||
**Usage:** `jj git push [OPTIONS]`
|
**Usage:** `jj git push [OPTIONS]`
|
||||||
|
|
||||||
###### **Options:**
|
###### **Options:**
|
||||||
|
|
|
@ -152,6 +152,44 @@ met:
|
||||||
You could describe the movement as following along the change-id of the
|
You could describe the movement as following along the change-id of the
|
||||||
current branch commit, even if it isn't entirely accurate.
|
current branch commit, even if it isn't entirely accurate.
|
||||||
|
|
||||||
|
## Pushing branches: Safety checks
|
||||||
|
|
||||||
|
Before `jj git push` actually moves, creates, or deletes a remote branch, it
|
||||||
|
makes several safety checks.
|
||||||
|
|
||||||
|
1. `jj` will contact the remote and check that the actual state of the remote
|
||||||
|
branch matches `jj`'s record of its last known position. If there is a
|
||||||
|
conflict, `jj` will refuse to push the branch. In this case, you need to run
|
||||||
|
`jj git fetch --remote <remote name>` and resolve the resulting branch
|
||||||
|
conflict. Then, you can try `jj git push` again.
|
||||||
|
|
||||||
|
If you are familiar with Git, this makes `jj git push` similar to `git
|
||||||
|
push --force-with-lease`.
|
||||||
|
|
||||||
|
There are a few cases where `jj git push` will succeed even though the remote
|
||||||
|
branch is in an unexpected location. These are the cases where `jj git fetch`
|
||||||
|
would not create a branch conflict and would not move the local branch, e.g.
|
||||||
|
if the unexpected location is identical to the local position of the branch.
|
||||||
|
|
||||||
|
2. The local branch must not be [conflicted](#conflicts). If it is, you would
|
||||||
|
need to use `jj branch set`, for example, to resolve the conflict.
|
||||||
|
|
||||||
|
This makes `jj git push` safe even if `jj git fetch` is performed on a timer
|
||||||
|
in the background (this situation is a known issue[^known-issue] with some
|
||||||
|
forms of `git push --force-with-lease`). If the branch moves on a remote in a
|
||||||
|
problematic way, `jj git fetch` will create a conflict. This should ensure
|
||||||
|
that the user becomes aware of the conflict before they can `jj git push` and
|
||||||
|
override the branch on the remote.
|
||||||
|
|
||||||
|
3. If the remote branch already exists on the remote, it must be
|
||||||
|
[tracked](#remotes-and-tracked-branches). If the branch does not already
|
||||||
|
exist on the remote, there is no problem; `jj git push` will create the
|
||||||
|
remote branch and mark it as tracked.
|
||||||
|
|
||||||
|
[^known-issue]: See "A general note on safety" in
|
||||||
|
<https://git-scm.com/docs/git-push#Documentation/git-push.txt---no-force-with-lease>
|
||||||
|
|
||||||
|
|
||||||
## Conflicts
|
## Conflicts
|
||||||
|
|
||||||
Branches can end up in a conflicted state. When that happens, `jj status` will
|
Branches can end up in a conflicted state. When that happens, `jj status` will
|
||||||
|
|
Loading…
Reference in a new issue