开发者

Reset other branch to current without a checkout

I'm writing some scrip开发者_如何学Cts for my Git workflow.

I need to reset other (existing) branch to the current one, without checkout.

Before:

 CurrentBranch: commit A
 OtherBranch: commit B

After:

 CurrentBranch: commit A
 OtherBranch: commit A

Equivalent of

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(Note --soft: I do not want to affect working tree.)

Is this possible?


Set otherbranch to point at the same commit as currentbranch by running

git branch -f otherbranch currentbranch

The -f (force) option tells git branch yes, I really mean to overwrite any existing otherbranch reference with the new one.

From the documentation:

-f
--force

Reset to if exists already. Without -f git branch refuses to change an existing branch.


The workflows you describe are not equivalent: when you perform reset --hard you lose all the changes in the working tree (you might want to make it reset --soft).

What you need is

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch


You can sync with this command your branches at any time

$ git push . CurrentBranch:OtherBranch -f

Also without -f it replace this set of commands

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

It can be useful when you don't need commit all your files in CurrentBranch and so you can't switch to another branches.


The other answers are good but a little scary. I'm just providing another option to achieve exactly what was asked for somewhat simply with variations on commands I use every day.

In short, None of these options mess with the current branch you're on or current head.

git branch -C other_branch (force-create other_branch from current HEAD)

To reset other_branch to a branch you're not on...

git branch -C old_branch other_branch (force-create other_branch from old_branch)

To reset other_branch to some_branch on the remote, it's a little bit different...

git pull -f origin old_branch:other_branch (force-pull (which ignores the already-up-to-date stuff) origin/old_branch into local's other_branch)


git branch -f destroys the upstream branch info etc. Typing a git update-ref command, which principally operates cleanly, is tedious and error-prone. It could create any kind of nonsense file under .git.

As this operation is needed frequently, do it via a rather safe alias or script:

git reset-other OTHERBRANCHNAME TARGETREF

After adding e.g. this alias to your config:

[alias]
    reset-other = "!f() { git show -s refs/heads/$1 -- && git update-ref refs/heads/$1 $2 && git show -s $1; }; f"

Add from command-line:

git config --global alias.reset-other "!f() { git show -s refs/heads/$1 -- && git update-ref refs/heads/$1 $2 && git show -s $1; }; f"

When the move succeeded to a wrong target by a slip you already have the SHA printed on the screen to move back ...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜