ChatGPT解决这个技术问题 Extra ChatGPT

How can I copy the content of a branch to a new local branch?

I have worked on a local branch and also pushed the changes to remote.

I want to revert the changes on that branch and do something else on it, but I don't want to lose the work completely. I was thinking of something like create a new branch locally and copy the old branch there, then I can revert the changes and continue working on the old branch.

Is there a better way than this maybe?

4 years later, with Git 2.15 (Q4 2017), you will have git branch -c A B. See my answer below
@Vonc About 5 years later... Thank you!

D
Daniel Hilgarth
git checkout old_branch
git branch new_branch

This will give you a new branch "new_branch" with the same state as "old_branch".

This command can be combined to the following:

git checkout -b new_branch old_branch

Or even shorter git checkout -b new_branch (when you're already on old_branch).
This just creating the new branch but cannot able to copy the contents from one branch to another branch. When i try this commands it just showing "The branch named **** already exist".
I think if one creates a new branch like this one doesn't instantly have a copy of the old branch but simply a new pointer at the head of the old branch. But when you now do something like rebasing the new branch you should see that the old branch is still in its original state while the new branch is modified. So I think that does what the OP wants.
git checkout old_branch and than git branch new_branch ....Its better to use above command on production, as below command will create new branch and take you to the new branch (change branch as new branch ).... git checkout -b new_branch old_branch
To overwrite a branch, see stackoverflow.com/questions/26961371/…
V
VonC

See second part (since Git 2.23, Q3 2019): git switch -c newBranch oldBranch

With Git 2.15 (Q4 2017), "git branch" learned "-c/-C" to create a new branch by copying an existing one.

See commit c8b2cec (18 Jun 2017) by Ævar Arnfjörð Bjarmason (avar).
See commit 52d59cc, commit 5463caa (18 Jun 2017) by Sahil Dua (sahildua2305).
(Merged by Junio C Hamano -- gitster -- in commit 3b48045, 03 Oct 2017)

branch: add a --copy (-c) option to go with --move (-m) Add the ability to --copy a branch and its reflog and configuration, this uses the same underlying machinery as the --move (-m) option except the reflog and configuration is copied instead of being moved. This is useful for e.g. copying a topic branch to a new version, e.g. work to work-2 after submitting the work topic to the list, while preserving all the tracking info and other configuration that goes with the branch, and unlike --move keeping the other already-submitted branch around for reference.

Note: when copying a branch, you remain on your current branch.
As Junio C Hamano explains, the initial implementation of this new feature was modifying HEAD, which was not good:

When creating a new branch B by copying the branch A that happens to be the current branch, it also updates HEAD to point at the new branch. It probably was made this way because "git branch -c A B" piggybacked its implementation on "git branch -m A B", This does not match the usual expectation. If I were sitting on a blue chair, and somebody comes and repaints it to red, I would accept ending up sitting on a chair that is now red (I am also OK to stand, instead, as there no longer is my favourite blue chair). But if somebody creates a new red chair, modelling it after the blue chair I am sitting on, I do not expect to be booted off of the blue chair and ending up on sitting on the new red one.

Second part: with git 2.23 (Q3 2019), no need to use git branch or the old confusing git checkout: you have git switch.

git switch -c newBranch oldBranch

The quoted explanation underneath from Junio C Hamano: 'it also updates HEAD to point at the new branch', seems to contradict your statement: 'Note: when copying a branch, you remain on your current branch.' Having tried it on git 2.17.1 I was left on my existing as you say. Therefore that explanation seems incorrect.
@ChrisR I have added the link to the original Git mailing list thread from which this statement is originating. It was about the initial implement of git branch -c, which was being fixed, as a result of Junio's comment.
Thanks. Good edit too, much clearer now for anyone finding their way to this without having to try it and to see like I did.
J
Josh
git branch copyOfMyBranch MyBranch

This avoids the potentially time-consuming and unnecessary act of checking out a branch. Recall that a checkout modifies the "working tree", which could take a long time if it is large or contains large files (images or videos, for example).


Of course, if you have binary files in git, especially large ones, it is likely worthwhile to analyse your strategy for said files. Naturally, unusual cases will exist and having binary files in git would be perfectly acceptable.
S
Scott Anderson

Given you requested better way options:

One potential flaw with copying branches is that you have to take care about git's fast-forward behaviour if you want to merge into the same parent, or re-introduce changes back into the original branch from the copy.

For instance if you have reverted some commits in the 'original' branch, but now you would like to re-introduce the changes you reverted to the original, you cannot simply merge the copied branch to the parent because git sees those commits already exist (even thought they are reverted later).

Maybe cherry-pick [commit-range] would work in this context & doesn't care about existing hashes shrugs

In my opinion though it would be better to do this.

Create a new branch from current branch HEAD git branch [archive-branch-name] Find the commit you want to roll back to with git log Run git reset --head [commit-hash-from-#2] git push -f origin

Note that you start on the 'original' branch and do not change branches during the steps.

Or even more simply you could just do away with branching altogether and just revert the commits you want to revert, and revert the revert later if you need to


J
Josh

Checkout to the branch that you want to copy. Then once you are on that branch run: git checkout -b new_branch_name


The idea is to phase out the use of the old obsolete and confusing git checkout command (which operates both on files and on branches), and instead consider git switch for branches only, like the git switch -c newBranch oldBranch I mention in my answer (and git restore, to restore files)