Reputation: 4184
I wonder if there is the way to copy one commit to another branch without checking out that branch.
For example, I have two branches: master
and parallel_version
.
I'm on parallel_version
branch and I found a bug in file common for these branches.
I've fixed it and committed. How to duplicate this commit to another branch, assuming I'm using git-svn?
Normally I would do:
$ git checkout master
$ git cherry-pick parallel_version
$ git checkout parallel_version
Is there better way of doing that?
Upvotes: 39
Views: 14165
Reputation: 120711
Here's a small script that creates a temporary clone of the repository, as suggested by user2394284:
/usr/bin/git-tmp-clone or ~/bin/git-tmp-clone
#!/bin/bash
gitTopLevel=$(git rev-parse --show-toplevel)
# Unique name for the temporary clone.
totalhash=$(tar -c "$gitTopLevel/.git" 2> /dev/null | sha256sum | head -c8)
tmprepo="/tmp/$(basename $(pwd))_${totalhash}"
git clone "$gitTopLevel" ${tmprepo}
# Start an interactive shell in the clone. Pass any
# arguments as initial commands to be executed.
/bin/bash --init-file <(echo "cd ${tmprepo}; $@")
# Clean up the clone.
rm -rf ${tmprepo} && echo "Deleted ${tmprepo}"
(This script is less than robust, but it seems to work for me on Ubuntu.)
You can use this to cherry-pick e.g. the last commit on the current brach to another branch, by running
git-tmp-clone "git checkout TARGET_BRANCH
&& git cherry-pick $(git rev-parse --short @)
&& git push origin HEAD"
(Note that in this example, the rev-parse
is evaluated in the origin repository before the clone is created! That's why it points to the most recent commit. Adapt as needed.)
Upvotes: 2
Reputation: 6028
Crazy idea (based on mnaoumov's comment) if you really want to avoid touching the checked out files (say you don't want to disturb your build system) … that's what I want anyway.
git fetch clone && git branch mybranch clone/mybranch -f
This would be a thing to automate. If you have filesystem snapshots, cloning the whole repo is cheap – perhaps not so crazy after all…
Upvotes: 1
Reputation: 578
https://github.com/lennartcl/gitl provides "git cherry-copy" and "git cherry-move" scripts that do this and handle most of the corner cases.
Upvotes: 6
Reputation: 318518
That's not possible - simply imagine what would happen if there was a conflict that couldn't be resolved automatically. For the same reason you also can't update branches that are not currently checked-out (even if a fast-forward was possible).
Upvotes: 12